gpt4 book ai didi

python - 如何与 Kivy GUI 一起运行 Tornado 事件循环?

转载 作者:行者123 更新时间:2023-11-28 19:10:28 25 4
gpt4 key购买 nike

我的客户端应用程序使用 Kivy GUI(Kivy 有自己的事件循环)并通过 Tornado 使用 WebSocket 协议(protocol)连接到服务器(Tornado 也有一个事件循环).这就是为什么连接部分是异步的。
我希望用户在 Tornado 客户端运行无限异步循环监听服务器消息时与 UI 交互。

下面是一些示例代码:
client_test.py

from tornado.ioloop import IOLoop
from tornado.websocket import websocket_connect

class RequestSender:
url = 'server url here (no scheme)'

async def _connect(self):
self.conn = await websocket_connect('wss://' + self.url, io_loop=self.ioloop)
self.ioloop.add_callback(self._listen)

async def _listen(self):
while True:
print(await self.conn.read_message())

def __init__(self):
self.ioloop = IOLoop.current()
self.ioloop.add_callback(self._connect)

def run(self):
self.ioloop.start()

图形界面

from kivy.app import App
from kivy.uix.label import Label
from client_test import RequestSender

class TestApp(App):
def build(self):
RequestSender().run()
return Label(text = "hello")

TestApp().run()

显然,由于 Tornado 的事件循环较早开始,它已经接管了程序流程,现在没有出现 GUI 窗口。
我执行 GUI 文件并且执行在 RequestSender().run() 之后挂起,因此 build 永远不会返回。

除了 this Google Groups post 之外,对该案例的搜索几乎没有提供任何信息。 . Kivy 的文档只提到了 Twisted .

我尝试将 Kivy 事件循环置于从属模式并从 Tornado 的事件循环运行 GUI 更新,但这没有用,因为显然调用 Kivy 事件循环的 EventLoop.idle() 是'不足以保持 GUI 应用程序运行。

这里还能做什么?

最佳答案

我发现这个问题试图做同样的事情,而是选择了两个单独的过程;一个 Kivy GUI 和一个 Tornado(在我的例子中是服务器)。我让两者使用 multiprocessing.connection 进行通信,如 this SO answer 中所述

如果您有大量复杂的数据要在两者之间传递,这可能不太理想,但对于简单的消息来说效果很好。您还可以在没有 UI 的情况下运行,并在单独的机器上运行 UI。

关于python - 如何与 Kivy GUI 一起运行 Tornado 事件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41075260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com