Kivy使用asyncio

时间:2018-06-05 18:11:23

标签: python image kivy

我在Kivy写了一个网络客户端,它运行得很好。网络代码使用asyncio来监视接收对象的网络。唯一给出问题的Widget是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 :(得分:0)

我解决了。由于加载图片需要时间,而Kivy不会等待,因此需要异步加载图片。这是我使用的一个示例,用于更改图像加载过程。

去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()