Kivy Crashing w/Image.source = 'filename' using asyncio



我用Kivy编写了一个网络客户端,它运行良好。 网络代码使用 asyncio 监视网络中接收的对象。 唯一出现问题的小部件是 Image((。 设置图像的图像时,它会完全崩溃Kivy。 我找到了一个解决方法 - 使用Clock.schedule_once。

这是用于检测已发送的内容并采取行动(异步(的循环;

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

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

最新更新