【问题标题】:Defining a wx.Panel destructor in wxpython在 wxpython 中定义 wx.Panel 析构函数
【发布时间】:2014-09-30 06:21:30
【问题描述】:

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

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

【问题讨论】:

  • 您不需要从 wxPython 单独下载 PyPubSub,因为它包含在 wx.lib.pubsub 下的 wxPython 中。
  • @MikeDriscoll 我正在使用 wx.lib.pubsub 而不是单独下载。
  • pypubsub 的独立版本(自 2016 年以来在 github.com/schollii/pypubsub)被推荐,因为 wx.lib 中的版本只是一个起点(实际上我认为在即将推出的 wxPython 版本中,wx.lib.pubsub将仅简要说明如何获取独立版本。

标签: python wxpython publish-subscribe


【解决方案1】:

您应该能够绑定到 EVT_WINDOW_DESTROY 并在处理程序中取消订阅。

例如:

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: 然后访问它或它的方法。

【讨论】:

  • 我认为我也不必退订。顺便说一句,您应该向 OP 提出问题作为对该问题的评论,而不是在您的官方答案中。
  • 错误是wx._core.PyDeadObjectError: The C++ part of the ExtendedWxPanel object has been deleted, attribute access no longer allowed.
  • @Metalshark 在得到 PyDeadObjectError 之前,你是什么/如何删除/关闭 ExtendedWxPanel 实例?
  • 无线程 - 有一个订阅调用处理程序,它是 wx.Panel 的一个属性,一旦 wx.Panel 关闭并且发布者触发,它就会触发并调用处理程序。由于 PyDeadObjectError,无法调用处理程序。防不胜防。
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 2011-03-29
  • 2015-07-01
  • 1970-01-01
  • 2019-02-22
  • 2014-02-20
  • 2016-11-05
  • 2017-10-03
相关资源
最近更新 更多