单击其他位置时,Python3 Tkinter弹出菜单不会自动关闭

时间:2014-01-18 05:41:43

标签: python tkinter contextmenu

我正在运行Python 3.3.3(现在我在Ubuntu上,但我也在Mac和Windows上开发,我还没有测试过)。我有一个Treeview对象响应右键单击项目并根据您单击的内容显示上下文菜单...但我注意到,如果您在原始菜单启动时右键单击其他位置,它只会打开另一个。

事实上,正常点击也不会隐藏它们。即使我关闭窗口,菜单仍然保持浮动状态。让它们消失的唯一方法是单击其中一个选项。

最终结果如下: 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)

我google了一下,只有一些人问同样的问题没有答案。一般来说,我对tkinter和python还有点新鲜,并没有看到任何关于这一点。我也将其他动作绑定到树视图。

如果您需要更多源代码,我的项目就在这里:https://github.com/Mgamerz/Fresh-Set-of-Images(freshsetofimages.py)

感谢任何帮助。

显示此内容所需的插件:https://github.com/Mgamerz/fsoi_plugins

2 个答案:

答案 0 :(得分:3)

尝试调用方法tk_popup而不是post

此外,您的代码有内存泄漏,因为每次右键单击您创建一个新菜单但从未销毁旧菜单。您只需要创建一个,然后在弹出它之前重新配置它。

答案 1 :(得分:0)

要在其他地方点击时关闭弹出菜单,您可以添加

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

并在popupFocusOut中调用unpost。

def popupFocusOut(self,event=None):
        rcmenu.unpost()