【问题标题】:Kivy Crashing w/Image.source = 'filename' using asyncioKivy 崩溃 w/Image.source = 'filename' 使用 asyncio
【发布时间】:2018-06-05 18:11:23
【问题描述】:

我在 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()

【问题讨论】:

    标签: python image kivy


    【解决方案1】:

    我解决了。由于加载图片需要时间,并且 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()
    

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多