扭曲的wxreactor没有在wxPython中关闭

时间:2018-04-17 06:51:57

标签: python wxpython twisted

我在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()

环境

  • Python:V2.7.14
  • wxPython:V3.0.2
  • 扭曲:V17.9.0

1 个答案:

答案 0 :(得分:1)

如果您使用self.Destroy()来电替换reactor.stop()来电,则应用程序会完全退出。

我不清楚这是否是wxreactor中的错误,或者是否是记录在案的缺点/约束。从文档中,请注意:

Stop the event loop using reactor.stop(), not yourApp.ExitMainLoop().

您还没有致电yourApp.ExitMainLoop(),但我想知道self.Destroy()是否基本相同。无论如何,文档非常明确地说你应该在申请完成时使用reactor.stop()