Kivy Crashing w / Image.source = 'filename' с помощью asyncio - PullRequest
0 голосов
/ 05 июня 2018

Я написал сетевой клиент в Kivy, и он работает очень хорошо.Код сети использует asyncio для наблюдения за сетью на предмет полученных объектов.Единственный виджет, который вызвал проблемы, это Image ().При настройке изображения изображение полностью вылетает в Kivy.Я нашел обходной путь - с помощью Clock.schedule_once.

Вот цикл для обнаружения того, что было отправлено и выполнения действия (asyncio);

async def listen():
    while True:
        for message in CLIENT.get_reader_queue():
            message = loads(message, cls=CustomJSONDecoder)

            if isinstance(message, RPGMenu):
                CLIENT_SCREEN.set_current_menu(message)
                CLIENT_SCREEN.refresh()

                if message.description is None:
                    message.description = '<NO DESCRIPTION FOUND>'

                CLIENT_SCREEN.add_text_item(message.description)
            elif isinstance(message, RPGMessage):
                if message.popup is False:
                    CLIENT_SCREEN.add_text_item(message.text)
                else:
                    layout = BoxLayout(orientation='vertical')
                    layout.add_widget(Label(text=message.text))
                    button = Button(text='close', size_hint_y=0.25)
                    layout.add_widget(button)

                    popup = Popup(title='Server Message',
                                  content=layout,
                                  size_hint=(None, None), size=(400, 400), auto_dismiss=False)
                    button.bind(on_press=popup.dismiss)

                    popup.open()
            elif isinstance(message, RPGMedia):
                create_popup(message.name, message.text, message.image)
                # THE BELOW WORKS ******
                # Clock.schedule_once(partial(create_popup, message.name, message.text, message.image))
            elif isinstance(message, RPGResultFailure):
                create_popup(message.name, message.description)
            elif isinstance(message, RPGResult):
                CLIENT.result = message

В других функциях, например, когда я нажимаюКнопка и вызвать изображение, он работает нормально, но когда объект RPGMedia входит непосредственно и хочет отобразить сразу же, он падает.Функция create_popup создает простое всплывающее окно и задает изображение.

Пожалуйста, дайте мне знать, если потребуется какой-либо другой код, он имеет большой размер со стороны сервера, поэтому я подумал, что начну с него.

Вот мой основной ;

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    # loop = asyncio.ProactorEventLoop()
    asyncio.set_event_loop(loop)

    CLIENT = Client('127.0.0.1', 9000, loop)

    executer = ThreadPoolExecutor(2)

    # asyncio.ensure_future(test())
    # asyncio.ensure_future(console())
    asyncio.ensure_future(listen())

    # MyApp().run()
    loop.run_in_executor(executer, MyApp().run)
    loop.run_forever()

1 Ответ

0 голосов
/ 05 июня 2018

Я решил это.Поскольку загрузка изображений занимает много времени, и Киви не будет ждать, изображение должно быть загружено асинхронно.Вот пример, с которым я работал, чтобы изменить процедуру загрузки изображения.

Go Kivy!

Оригинал, расположенный в;https://kivy.org/docs/api-kivy.loader.html

from kivy.app import App
from kivy.uix.image import Image
from kivy.loader import Loader

class TestApp(App):
    def _image_loaded(self, proxyImage):
        if proxyImage.image.texture:
            self.image.texture = proxyImage.image.texture

    def build(self):
        proxyImage = Loader.image("myPic.jpg")
        proxyImage.bind(on_load=self._image_loaded)
        self.image = Image()
        return self.image

TestApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...