我的客户端应用程序使用Kivy
GUI(Kivy 有自己的事件循环)并使用 WebSocket 协议连接到服务器Tornado
(Tornado 也有一个事件循环)。这就是连接部分是异步的原因。
我希望用户在 Tornado 客户端运行监听服务器消息的无限异步循环时与 UI 进行交互。
这是一些示例代码:
客户端测试.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()
GUI
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()
, so build
永远不会回来。
对该案例的搜索几乎没有提供任何信息,除了此 Google 网上论坛帖子 https://groups.google.com/forum/#!topic/kivy-users/8YV6dou14uY。 Kivy的文档仅提到Twisted https://kivy.org/docs/guide/other-frameworks.html.
我尝试将 Kivy 事件循环置于从属模式并从 Tornado 的事件循环运行 GUI 更新,但这不起作用,因为显然是一个调用EventLoop.idle()
Kivy 的事件循环不足以保持 GUI 应用程序运行。
这里还能做什么?
我发现这个问题试图做同样的事情,并选择了两个单独的过程;一个 Kivy GUI 和一个 Tornado(在我的例子中是服务器)。我让两者进行通信multiprocessing.connection
正如在这个答案 https://stackoverflow.com/a/6921402/1705163
如果您有大量复杂的数据要在两者之间传递,也许这不太理想,但对于简单的消息来说它效果很好。您还具有无需 UI 即可运行以及在单独的计算机上运行 UI 的优势。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)