Я написал сетевой клиент в 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 создает простое всплывающее окно и задает изображение.
Пожалуйста, дайте мне знать, если потребуется какой-либо другой код, он имеет большой размер со стороны сервера, поэтому я подумал, что начну с него.
Вот мой основной ;
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()