[英]Defining a wx.Panel destructor in wxpython
您应该能够绑定到EVT_WINDOW_DESTROY并在处理程序中执行unsub。
例如:
class MyPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, wx.NewId())
pub.subscribe(self.__handler, 'event')
def __destroy(_):
pub.unsubscribe(self.__handler, 'event')
self.Bind(wx.EVT_WINDOW_DESTROY, __destroy)
如果上述方法不起作用,则可以通过在尝试访问ExtendedWxPanel的代码中添加以下内容来防止PyDeadObjectError异常:
如果instanceOfExctendedWxPanel:然后访问它或它的方法。
我有同样的问题,我通过执行以下操作解决了它:
我的代码(给出了错误)是:
import wx
from pubsub import pub
class My_panel(wx.panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.box = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.box)
#
pub.subscribe(self.do_something, 'Msg')
def do_something(self):
self.box.Layout()
上面的面板位于 wx.Notebook 页面中。 在我的应用程序中,用户可以在此笔记本中添加或删除页面。
当用户删除包含此面板的笔记本页面后运行 pub.sendMessage('Msg') 代码行时,出现以下错误:
RuntimeError: wrapped C/C++ object of type BoxSizer has been deleted
这似乎是 ~~ 根据 wxPython 的“wx.PyDeadObjectError 异常”的新错误类型: https://wxpython.org/Phoenix/docs/html/MigrationGuide.html wxPython 的此类文档中解释的是使用nonzero () 方法测试 C++ object 是否已被删除。
因此我的工作代码是:
import wx
from pubsub import pub
class My_panel(wx.panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.box = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.box)
#
pub.subscribe(self.do_something, 'Msg')
def do_something(self):
if self.__nonzero__():
self.box.Layout()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.