扭曲的 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()
环境
- Python: V2.7.14
- wxPython: V3.0.2
- 扭曲:V17.9.0
如果您将 self.Destroy()
调用替换为 reactor.stop()
调用,则应用程序会干净地退出。
我不清楚这是 wxreactor 中的一个 bug,还是有文档记录 shortcoming/constraint。从文档中,注意:
Stop the event loop using reactor.stop(), not yourApp.ExitMainLoop().
你还没有调用 yourApp.ExitMainLoop()
但我想知道 self.Destroy()
是否基本上是等价的。无论如何,文档非常清楚地说明您应该在应用程序完成后使用 reactor.stop()
。
我在我的 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()
环境
- Python: V2.7.14
- wxPython: V3.0.2
- 扭曲:V17.9.0
如果您将 self.Destroy()
调用替换为 reactor.stop()
调用,则应用程序会干净地退出。
我不清楚这是 wxreactor 中的一个 bug,还是有文档记录 shortcoming/constraint。从文档中,注意:
Stop the event loop using reactor.stop(), not yourApp.ExitMainLoop().
你还没有调用 yourApp.ExitMainLoop()
但我想知道 self.Destroy()
是否基本上是等价的。无论如何,文档非常清楚地说明您应该在应用程序完成后使用 reactor.stop()
。