Это очень сложная проблема, и это клиентский сервер, поэтому я прошу прощения за код клиента. Возможно, кто-то может дать мне какое-то направление в этом отношении.
Во-первых, в клиенте есть функция asyncio, называемая listen. Эта функция считывает входные данные, поступающие с сервера, и выполняет заготовку. Нынешняя проблема заключается в том, что сообщение RPGMessage появляется как не всплывающее окно, и оно вылетает из приложения без ошибок, просто «оставляя приложение в процессе». Возможно, я могу расширить отладку, как в Киви?
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 not None:
CLIENT_SCREEN.add_text_item(message.description)
elif isinstance(message, RPGMessage):
if message.popup is False:
CLIENT_SCREEN.add_text_item(message.text, message.font) <-- THIS IS THE LINE IT WILL TRIGGER.
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):
PopupWindow(message.name, message.text, message.image)
elif isinstance(message, RPGResultFailure):
PopupWindow(message.name, message.description)
elif isinstance(message, RPGResult):
CLIENT.result = message
await asyncio.sleep(0.1)
В любом случае вышеупомянутые вызовы CLIENT_SCREEN.add_text_item (), которые показаны ниже;
def add_text_item(self, text: str, font: str=None):
text_input = Label()
text_input.padding_x = 10
text_input.size_hint_y = None
text_input.markup = True
text_input.text = text + '
'
if font is not None:
text_input.font_name = font
text_input.font_size = '20sp'
text_input.bind(size=self.on_size_text_label)
self.text_grid_layout.add_widget(text_input)
self.text_scroll_view.scroll_to(text_input)
text_input.bind(on_ref_press=self.on_reference_press)
Также здесь мои петли, которые я начинаю;
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()
Когда я запускаю отладчик, он добавляет текстовый элемент, а затем возвращается к циклу asyncio, но kivy умирает.
Есть предположения? Я знаю, что это сложная проблема.
Благодарю.
Обновить; Я попытался увеличить отладку - но это не поможет в этой проблеме;
Config.set('kivy', 'log_level', 'debug')