在wxPython应用程序上使用MacOS上的Dock问题

时间:2011-08-20 14:54:15

标签: python macos wxpython wxwidgets

MacOS上的Dock存在问题。 在dock-icon的上下文菜单中有2个项目:MacOS的Standart Quit和一些我没有添加的菜单项Quit。 退出,不是我的,是可行的,并与我的方法相关联:

class TrayIcon(wx.TaskBarIcon):
    def make_menu(self):
        self.menu = wx.Menu()
        item = self.menu.Append(wx.ID_EXIT,"Exit", "Exit from application")
        self.menu.Bind(wx.EVT_MENU, self.on_menu_exit, item)

    def CreatePopupMenu(self):
        self.make_menu()
        return self.menu

如你所见,我将它“退出”,但我看到“退出”,但它仍然按我的方法处理。

退出即系统,它将无法正常工作,当我选择它时,没有任何反应,但是应用程序的下一步操作会导致此错误消息:

  

文件   “/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode/wx/_core。 PY”,   第14501行,在 getattr 中wx._core.PyDeadObjectError:C ++部分   主对象已被删除,不再允许属性访问。

我做错了什么? 感谢

1 个答案:

答案 0 :(得分:2)

原因可能是您没有引用item。它绑定在self.menu.Bind中,但您不在Python代码中保留引用。所以Python垃圾收集器看到这个wx.MenuItem不再被引用(在Python代码中),所以它被删除了。调用Wx的清理代码(__del__),并且在C ++代码中也删除了该对象,尽管它仍在使用中!。因此,当您单击菜单项时,它会尝试将单击的菜单项与(当时)删除的菜单项匹配,并抛出前面提到的PyDeadObjectError。要解决此“错误”,只需保留对wx.MenuItem

的引用
self.item = self.menu.Append(...