繁体   English   中英

在 wxpython 中定义一个 wx.Panel 析构函数

[英]Defining a wx.Panel destructor in wxpython

你如何为wxpython中的wx.Panel定义析构函数?

META:在继承了使用wxpythonPyPubSub的代码库后,我在wx.Panel__init__函数中发现了大量的 pubsub 订阅,这些订阅永远不会取消订阅,并且会在以后的程序中导致错误。

您应该能够绑定到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM