2011-08-20 41 views
2

MacOS上的dock问题。 在dock-icon的上下文菜单中有2个项目:Standart退出MacOS和一些菜单项Quit,我没有添加。 即退出,那不是我的,是工作和我的方法有关:在wxPython应用程序的MacOS上Dock问题

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 

正如你看到的,我сall其“退出”,但我看到“退出”,但它仍然是我的方法处理。

并退出是系统的,它不会工作,当我选择它,什么都不会发生,但与应用领先的下一步行动此错误消息:

File "/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", line 14501, in getattr wx._core.PyDeadObjectError: The C++ part of the Main object has been deleted, attribute access no longer allowed.

我做了什么错? 谢谢

+0

您使用的是股票ID wx.ID_EXIT(见http://wiki.wxpython.org/SpecialIDs)这样的wxPython正在改变菜单项的标签。你没有显示所有代码,所以我不确定'self.on_menu_exit'中会发生什么。您可能需要将该方法添加到您的问题中。 –

+0

有没有intresting,只是>打印“退出点击” – Antigluk

+0

而问题不在这里,问题是,on_menu_exit不叫! – Antigluk

回答

2

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

self.item = self.menu.Append(...