Deferreds 不能做任何事情来使您的代码非阻塞。他们所能做的就是根据现有的非阻塞事件管理回调链。这就是让您可以将“收到一些字节”或“连接丢失”或“用户单击按钮”等低级别事件转换为“HTTP 请求已响应”或“用户已回答”等高级事件的原因你的问题”。 deferLater
,例如,Deferred
在经过一段时间后简单地触发它。
您甚至不需要反应器即可使用 a Deferred
。例如:
>>> from twisted.internet.defer import Deferred
>>> d = Deferred()
>>> def transformResult(result):
... return result + 5
...
>>> d.addCallback(transformResult)
<Deferred at 0x100521200>
>>> def itsDone(result):
... print("It's done: " + str(result))
...
>>> d.addCallback(itsDone)
<Deferred at 0x100521200>
>>> d.callback(3)
It's done: 8
>>>
您可以callback()
从任何地方拨打电话;它通常只是从反应堆事件中调用。在您的情况下,您可能希望改为callback
从Tk
事件中调用。
综上所述,您需要一种将Tk
事件放入主反应器线程的方法,您可以使用了解Tk
's mainloop 的反应器来做到这一点。一位评论者已经提到,有一个现有的 API twisted.internet.tksupport
:. 鉴于这Tk
不是当今最流行的 GUI,您可能会发现一些问题,因此如果您发现任何问题,请报告它们。