扭曲的 wxreactor 没有在 wxPython 中关闭

Twisted wxreactor not closing in wxPython

我在我的 wxPython 应用程序中使用 Twisted 库来支持网络,但是当我尝试在 wx.App 的 OnExit 中获取 twisted reactor 时,应用程序永远不会关闭(见下文) .

如果我尝试从 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()

环境

如果您将 self.Destroy() 调用替换为 reactor.stop() 调用,则应用程序会干净地退出。

我不清楚这是 wxreactor 中的一个 bug,还是有文档记录 shortcoming/constraint。从文档中,注意:

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

你还没有调用 yourApp.ExitMainLoop() 但我想知道 self.Destroy() 是否基本上是等价的。无论如何,文档非常清楚地说明您应该在应用程序完成后使用 reactor.stop()