2014-01-18 35 views
3

我正在運行Python 3.3.3(現在我在Ubuntu上,但我也開發了Mac和Windows,我還沒有測試過)。我有一個Treeview對象,它響應右鍵單擊項目並顯示一個上下文菜單,具體取決於您單擊的內容......但是我注意到,如果您在原始菜單啓動時在其他位置右鍵單擊,則會打開另一個菜單。Python3 Tkinter彈出菜單不會自動關閉,當點擊其他地方

實際上,正常點擊並不會隱藏它們。即使關閉窗口,菜單仍然保持浮動狀態。讓他們離開的唯一方法是點擊其中一個選項。

最終的結果是這樣的: Context Menus EVERYWHERE

我的菜單代碼如下:

def rightclick_listitem(self, event): 
    rowitem = self.sources.identify('item', event.x, event.y) 

    if rowitem == '': 
     print('Right clicked an empty space.') 
     return 
    # user right clicked something. 
    self.sources.selection_set(rowitem) 
    rcmenu = Menu(self.root, tearoff=0) 
    plugin_disabled=self.sources.item(rowitem, 'values')[0] == 'Disabled' 
    if plugin_disabled: 
     rcmenu.add_command(label='Plugin is disabled...', 
          command=self.plugin_disabled_click) 
    rcmenu.add_command(label='Plugin options',state='disabled' if plugin_disabled else 'active') 
    rcmenu.add_command(label='Uninstall plugin') 
    rcmenu.post(event.x_root, event.y_root) 

調用此代碼位於此處的代碼:

#RIGHTMOUSE is a variable that changes based on OS due to the way Mac OSX works 
    #sources is the treeview object 
    self.sources.bind(RIGHTMOUSE, self.rightclick_listitem) 

我搜索一下,只有一些人沒有回答問相同的問題。一般來說,我對tkinter和python還是有些新鮮的,並沒有看到任何有關這方面的事情。我還將其他操作綁定到樹視圖。

如果您需要更多的源代碼我的項目是在這裏:

任何幫助表示讚賞https://github.com/Mgamerz/Fresh-Set-of-Images(freshsetofimages.py)。

而且使這個出現所需的插件:https://github.com/Mgamerz/fsoi_plugins

回答

3

嘗試調用方法tk_popup而非post。另外,你的代碼有內存泄漏,每次你右擊你創建一個新的菜單,但從不破壞舊的。你只需要創建一個,然後在彈出它之前重新配置它。

+0

一旦彈出窗口消失,對該段內存的引用就會丟失,垃圾收集器會在下次運行時拾取它,就像在Java中一樣。這有什麼不同嗎?用戶通常不會右鍵點擊我的應用程序,他們將永遠不會看到此菜單,除非他們想改變某些內容,這種情況不會經常發生。 – Mgamerz

+2

使用tk_popup可以解決出現多個上下文菜單的問題(如果只製作一個菜單),但不會使其他地方的左鍵單擊使其消失,除此之外,還可以設置其中的某些設置我不知道。你怎麼修好它的?或者您是否滿意點擊關閉菜單的選項? – Shule

0

要關閉彈出菜單時單擊其他地方,你可以添加

rcmenu.bind("<FocusOut>",popupFocusOut) 

和popupFocusOut調用unpost。

def popupFocusOut(self,event=None): 
     rcmenu.unpost() 
相關問題