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

Python3 Tkinter弹出菜单在单击其他位置时不会自动关闭,python,tkinter,contextmenu,Python,Tkinter,Contextmenu,我正在运行Python3.3.3(现在我在Ubuntu上,但我也在Mac和Windows上开发,我还没有测试)。我有一个Treeview对象,它响应右键单击项目,并根据您单击的内容显示上下文菜单。。。但我注意到,如果在原来的菜单打开时右键单击其他地方,它只会打开另一个菜单 事实上,正常的点击也不会隐藏它们。即使我关闭窗口,菜单仍然保持浮动状态。让他们离开的唯一方法是单击其中一个选项 最终结果是: 我的菜单代码如下: def rightclick_listitem(self, event):

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

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

最终结果是:

我的菜单代码如下:

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还是有点陌生,对此我一无所知。我还将其他操作绑定到treeview

如果您需要更多源代码,我的项目就在这里:(freshsetofimages.py)

感谢您的帮助


出现这种情况所需的插件:

尝试调用方法
tk\u popup
,而不是
post


此外,您的代码存在内存泄漏,每次右键单击都会创建一个新菜单,但不会破坏旧菜单。您只需要创建一个,然后在弹出它之前重新配置它

要在单击其他位置时关闭弹出菜单,可以添加

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

我的印象是,一旦弹出窗口消失,对该内存块的引用就会丢失,垃圾收集器会在下次运行时将其捡起来,就像在Java中一样。这有什么不同之处吗?用户通常不会在我的应用程序中右键单击,除非他们想更改某些内容,否则他们将永远不会看到此菜单,这是不常见的。使用tk_popup将解决出现多个上下文菜单的问题(如果您只创建一个菜单),但它不会使左键单击其他位置导致其消失,而无需执行其他操作,或者设置一些我不知道的设置。你是怎么修好的?或者您对单击某个选项关闭菜单感到满意吗?不幸的是,此技术仅适用于Windows而不适用于Linux:
def popupFocusOut(self,event=None):
        rcmenu.unpost()