如何在扭曲的服务器中弹出tkMessageBox

时间:2011-04-21 20:01:22

标签: tkinter twisted deferred reactor tkmessagebox

我有一台基于扭曲反应堆的服务器,我需要以下场景: 服务器可以接收两种类型的请求

  • ADD(x,y)并返回总和
  • HUMAN_PERMISSION仅在人工用户批准了客户端的IP
  • 时才返回true

我正在使用tkMessageBox来询问人类用户,但问题是它阻塞了整个反应堆,服务器对其他请求没有响应

我明白我必须以某种方式使用扭曲的延迟,只是不知道如何 这个:似乎没有用,它仍然会阻塞整个反应堆

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

1 个答案:

答案 0 :(得分:0)

Deferreds无法做任何事情来使您的代码无阻塞。他们所能做的就是根据现有的非阻塞事件来管理回调链。这就是让你将低级别事件(例如“收到一些字节”或“连接丢失”或“用户点击按钮”)转换为“HTTP请求已响应”或“用户回答”等高级别事件的原因你的问题”。例如,deferLater只会在经过一段时间后触发Deferred

您甚至不需要反应堆来使用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主循环的反应堆来完成。一位评论者已经提到过现有的API:twisted.internet.tksupport。鉴于Tk目前不是最受欢迎的图形用户界面,您可能会发现一些问题,所以如果您发现任何问题,请report them