我正在创建一个快速应用程序,它利用Python Twisted。当用户启动窗口时,我想启动我编写的 Twisted 服务器。但是,当我这样做时,它会冻结 GUI,因为反应器运行方法在启动后会持续运行。我需要一种方法来在自己的线程中启动 Twisted 反应器,这样 GUI 将在反应器运行时继续运行。我已在 Twisted 文档中阅读了有关使用 Twisted 和 pyGTK 的信息,但我不确定如何使用 Quickly 应用程序来实现这一点。在打开窗口时启动 Twisted 服务器而不冻结 GUI 的最佳方法是什么?
更新:
我的if __name__ == '__main__'
对话文件末尾的声明是:
print 'Preparing GLib'
GLib.idle_add(before_running)
print 'Staring Reactor'
from twisted.internet import reactor
reactor.run()`
我已经导入并安装twisted.gtk3reactor该文件中较早的部分。运行前方法包含dialog = ClientDialog()
和dialog.show
,以及我想要在对话框打开时运行的其余代码。
答案1
如果您在 12.04 或更新版本上使用绑定python-gi
,则需要在执行 react.run() 之前导入并安装twisted.internet.gireactor
或twisted.internet.gtk3reactor
。您还需要将其用作主循环,而不是自己运行 Gtk.main() 或 GLib.MainLoop().run()。如果您使用的是旧版本并使用旧的 PyGTK+ 绑定,则需要使用glib2reactor
或gtk2reactor
。
像这样:
from twisted.internet import gtk3reactor
from gi.repository import GLib
gtk3reactor.install()
GLib.idle_add(create_windows_and_do_stuff_method)
from twisted.internet import reactor
reactor.run()
顺序很重要,因为如果尚未安装反应器,则导入默认反应器将导致安装该反应器,而不是安装适当的反应器。因此,您需要先安装适当的反应器,然后执行reactor.run()
。并且Gtk.main_quit()
,您应该from twisted.internet import reactor
使用 而不是reactor.stop()
。