Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在KivyGUI旁边运行Tornado事件循环?_Python_Kivy_Tornado_Python 3.5_Event Loop - Fatal编程技术网

Python 如何在KivyGUI旁边运行Tornado事件循环?

Python 如何在KivyGUI旁边运行Tornado事件循环?,python,kivy,tornado,python-3.5,event-loop,Python,Kivy,Tornado,Python 3.5,Event Loop,我的客户端应用程序使用KivyGUI(Kivy有自己的事件循环),并使用带有Tornado的WebSocket协议连接到服务器(Tornado也有一个事件循环)。这就是为什么连接部分是异步的。 我希望用户在Tornado客户端运行侦听服务器消息的无限异步循环时与UI交互 下面是一些示例代码: 客户端测试.py from tornado.ioloop import IOLoop from tornado.websocket import websocket_connect class Reque

我的客户端应用程序使用
Kivy
GUI(Kivy有自己的事件循环),并使用带有
Tornado
的WebSocket协议连接到服务器(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()
之后挂起,因此
build
永远不会返回

对这个案件的调查几乎没有提供任何信息,除了。Kivy的文档只提到了

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


这里还能做些什么?

我发现这个问题试图做同样的事情,于是选择了两个独立的过程;一个KivyGUI和一个Tornado(在我的例子中是服务器)。我使用
多处理。连接
进行通信,如中所述


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

我认为twisted采用的方法是让Kivy的eventloop驱动twisted的eventloop。也许你可以用Tornado实现同样的效果。@Segment不清楚Twisted事件循环是如何驱动的,因为它是专门为Twisted开发的包。我尝试了一种向后的方法:让Kivy事件循环作为从属和Tornado事件循环运行,以便在每次迭代中调用
EventLoop.idle()
。窗口成功加载,但随后应用程序冻结。编辑中的更多细节我认为使用两个单独的线程运行两个事件循环可能比尝试将它们两者集成要容易得多。@Nykakin是的,我尝试过,而且更容易。问题是在Tornado线程上进行一些繁重的计算时,Kivy应用程序停止响应。这个问题可以解决吗?@Leva7单独线程上的大量计算不应该影响主线程中的GUI事件循环。我的猜测是,您以阻塞方式处理两个线程之间的通信。您可能应该使用
queue.queue
类并调用
get
方法并设置soume timeout。考虑把你的代码放在一个单独的问题中。