2010-07-13 23 views
1

使用wxPython,我創建了一個任務欄圖標和菜單。 右鍵單擊該圖標後,一切正常(至少在Windows中):即顯示菜單,並在您單擊其他位置(如Windows的任務欄上)時自動隱藏。wxPython:如何使任務欄圖標響應左鍵點擊

現在我確實想讓菜單出現在圖標被左鍵單擊時。 所以我插入Bind()到左單擊框類包裝,調用任務欄圖標的CreatePopupMenu()

import wx 
class BibTaskBarIcon(wx.TaskBarIcon): 
    def __init__(self, frame): 
     wx.TaskBarIcon.__init__(self) 
     self.frame = frame 
     icon = wx.Icon('test_icon.ico', wx.BITMAP_TYPE_ICO) 
     self.SetIcon(icon, "title") 

    def CreatePopupMenu(self): 
     self.menu = wx.Menu() 
     self.menu.Append(wx.NewId(), "dummy menu ") 
     self.menu.Append(wx.NewId(), "dummy menu 2") 
     return self.menu 

class TaskBarFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, style=wx.FRAME_NO_TASKBAR) 
     ... 
     self.tbicon = BibTaskBarIcon(self) 
     wx.EVT_TASKBAR_LEFT_UP(self.tbicon, self.OnTaskBarLeftClick) 
     ... 

    def OnTaskBarLeftClick(self, evt): 
     self.PopupMenu(self.tbicon.CreatePopupMenu()) 

    ... 
def main(argv=None): 
    app = wx.App(False) 
    TaskBarFrame(None, "testing frame") 
    app.MainLoop() 

這工作得很好,除了當您單擊菜單不會自動消失屏幕上的其他位置。實際上,圖標上多次左鍵單擊會創建多個菜單。隱藏菜單的唯一方法是點擊其中一個項目(您並不總是想要)。我查看了TaskbarIcon的可用方法,但是我沒有清楚要使用哪一個來隱藏菜單(.Destroy()不起作用)。此外,我不知道要綁定到哪個事件(有一個EVT_SET_FOCUS,但我找不到任何EVT_LOOSE_FOCUS或類似)。

那麼,如何在失去焦點時隱藏菜單?

編輯:我插入更多的代碼,以使其更清晰

+0

你能告訴什麼是BibTaskBarIcon嗎?如果您可以提供可以在複製粘貼上運行並顯示問題的簡單代碼,那將會更好。 – 2010-07-14 04:34:57

+0

我已經擴展了代碼。現在它是複製粘貼準備好的,除了圖標文件 – Rabarberski 2010-07-14 07:04:40

+0

猜猜你正在使用Windows,因爲點擊其他地方,即使在圖標關閉菜單。 (ubuntu) – 2010-07-14 16:58:30

回答

3

啊,我發現了什麼問題。在聲明

self.PopupMenu(self.tbicon.CreatePopupMenu()) 

我已經彈出菜單綁定到框架,而不是任務欄圖標。

,改成:

self.tbicon.PopupMenu(self.tbicon.CreatePopupMenu()) 

所有目前運作良好。

感謝所有評論

0

我覺得這裏的問題是,PopupMenu的是在程序的情況下通常使用的系統不是一個小圖標托盤。這意味着在一個正常的框架中,彈出式菜單會檢測您點擊它的點擊。在這裏,你正在點擊wxPython程序之外。另外,PopupMenu通常與EVT_CONTEXT_MENU一起使用,而不是此任務欄事件。

你可以試試wx.EVT_KILL_FOCUS,看看它是否可行,因爲當你點擊菜單時它理論上應該會觸發。或者,你可以要求在官方論壇的wxPython這裏:http://groups.google.com/group/wxpython-users/topics


邁克·德里斯科爾

博客:http://blog.pythonlibrary.org