2011-08-20 20 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(...