Я написал сетевого клиента в 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()
Я решил это. Поскольку загрузка снимков требует времени, и Kivy не будет ждать, что изображение должно быть загружено асинхронно. Вот пример, с которым я работал, чтобы изменить процедуру загрузки изображения.
Go Kivy!
Оригинал, расположенный по адресу; https://kivy.org/docs/api-kivy.loader.html