Tkinter 如何在twisted供电的服务器中弹出tkMessageBox

Tkinter 如何在twisted供电的服务器中弹出tkMessageBox,tkinter,twisted,deferred,reactor,tkmessagebox,Tkinter,Twisted,Deferred,Reactor,Tkmessagebox,我有一个基于twisted reactor的服务器,我需要以下场景: 服务器可以接收两种类型的请求 添加x,y并返回一个和 HUMAN_权限,仅当用户批准了客户端的ip时才返回true 我使用tkMessageBox询问人类用户,但问题是它阻塞了整个反应器,服务器对其他请求没有响应 我知道我必须用twisted的延迟,只是不知道怎么用 这个:似乎不起作用,它仍然阻塞了整个反应堆 d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?

我有一个基于twisted reactor的服务器,我需要以下场景: 服务器可以接收两种类型的请求

添加x,y并返回一个和 HUMAN_权限,仅当用户批准了客户端的ip时才返回true 我使用tkMessageBox询问人类用户,但问题是它阻塞了整个反应器,服务器对其他请求没有响应

我知道我必须用twisted的延迟,只是不知道怎么用 这个:似乎不起作用,它仍然阻塞了整个反应堆

d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?", clientIp)
d.addCallback(confirmUser)

延迟者无法使代码无阻塞。他们所能做的就是基于现有的非阻塞事件管理回调链。这使您能够将低级事件(如接收到某些字节、连接丢失或用户单击按钮)转换为高级事件(如HTTP请求得到响应或用户回答了您的问题)。例如,deferLater只是在一段时间过去后触发其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;它通常是从反应堆事件中调用的。在您的例子中,您可能希望从Tk事件调用回调


综上所述,您需要一种将Tk事件放入主反应器线程的方法,这是通过使用了解Tk主循环的反应器来实现的。一位评论者已经提到,存在此的现有API:。考虑到Tk现在不是最流行的GUI,您可能会发现一些问题,因此如果您发现任何问题,请咨询。

您是否执行了tksupport.installTkinInstance?