Twisted/tkinter程序退出时崩溃

1 投票
1 回答
1013 浏览
提问于 2025-04-15 15:56

我正在用 twisted 和 tkinter 开发一个应用,这个应用会把结果发送到服务器,然后等待服务器确认,最后再退出。所以,我用来退出的函数是这样的:

def term():
    '''To end the program'''
    reactor.stop()
    root.quit()
    root.destroy()

这个函数在工厂中设置,并在协议的 dataReceived 函数中调用。我运行这个程序,运行得很顺利,数据也成功发送并关闭了,但同时也给我报了以下错误:

Unhandled error in Deferred:
Traceback (most recent call last):
  File "D:\Python25\Lib\site-packages\twisted\internet\base.py", line 1128, in run
    self.mainLoop()
  File "D:\Python25\Lib\site-packages\twisted\internet\base.py", line 1137, in mainLoop
    self.runUntilCurrent()
  File "D:\Python25\Lib\site-packages\twisted\internet\base.py", line 757, in runUntilCurrent
    call.func(*call.args, **call.kw)
  File "D:\Python25\Lib\site-packages\twisted\internet\task.py", line 114, in __call__
    d = defer.maybeDeferred(self.f, *self.a, **self.kw)
--- <exception caught here> ---
  File "D:\Python25\Lib\site-packages\twisted\internet\defer.py", line 106, in maybeDeferred
    result = f(*args, **kw)
  File "D:\Python25\lib\lib-tk\Tkinter.py", line 917, in update
    self.tk.call('update')
_tkinter.TclError: can't invoke "update" command:  application has been destroyed

有没有人知道这是为什么呢?

1 个回答

1

你只需要调用 reactor.stop 就可以退出了:root.quit()root.destroy() 这两个调用是多余的。下面这个简单的例子展示了如何运行 Twisted 和 Tk 三秒钟,然后退出:

import Tkinter
from twisted.internet import tksupport

root = Tkinter.Tk()
tksupport.install(root)

from twisted.internet import reactor
reactor.callLater(3, reactor.stop)
reactor.run()

撰写回答