Kivy Crashing w / Image.source = 'filename' с использованием asyncio

Carl Von спросил: 12 мая 2018 в 04:31 в: python

Я написал сетевого клиента в 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 создает простое всплывающее окно и устанавливает изображение.

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

p> Вот мой основной;
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 ответ

Есть решение
Carl Von ответил: 12 мая 2018 в 04:53

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

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 Loaderclass 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.imageTestApp().run()