我在wxPython应用程序中使用Twisted库来提供网络支持,但是当我尝试在wx.App的OnExit中使用扭曲的反应器时,应用程序永远不会关闭(见下文)。
如果我尝试从wx.Dialog的销毁中执行reactor.stop(),它可以正常工作。问题是首先显示登录对话框然后主对话框,因此必须复制关闭代码并将reactor.stop()置于所有位置似乎非常糟糕的设计。
我正在尝试做什么,如果是这样,我想要实现这个目标,因为我不明白为什么反应堆在被告知时没有停止。
import wx
from twisted.internet import wxreactor
wxreactor.install()
from twisted.internet import reactor
class LogonDialog(wx.Dialog):
def __init__(self, parent):
super(LogonDialog, self).__init__(None, title = 'LogonDialogTitle'
, size = (300, 200)
, style = wx.CLOSE_BOX | wx.CAPTION | wx.SYSTEM_MENU | wx.RESIZE_BORDER)
self.Center()
self.Bind(wx.EVT_CLOSE, self.OnClose)
def OnClose(self, event):
dlgResult = wx.MessageBox('Are you sure you want to quit?',
'Confirm Quit', wx.YES_NO | wx.ICON_QUESTION);
if dlgResult == wx.YES:
self.Destroy()
class Client(wx.App):
def OnInit(self):
lg = LogonDialog(self)
lg.Show(True)
return True
def OnExit(self):
if reactor.running:
reactor.stop()
client=Client(0)
reactor.registerWxApp(client)
reactor.run()
环境
答案 0 :(得分:1)
如果您使用self.Destroy()
来电替换reactor.stop()
来电,则应用程序会完全退出。
我不清楚这是否是wxreactor中的错误,或者是否是记录在案的缺点/约束。从文档中,请注意:
Stop the event loop using reactor.stop(), not yourApp.ExitMainLoop().
您还没有致电yourApp.ExitMainLoop()
,但我想知道self.Destroy()
是否基本相同。无论如何,文档非常明确地说你应该在申请完成时使用reactor.stop()
。