编程语言
首页 > 编程语言> > 单击其他位置时,Python3 Tkinter弹出菜单不会自动关闭

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

作者:互联网

我正在运行Python 3.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还是有点陌生​​,对此一无所获.我也将其他操作绑定到树视图.

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

任何帮助表示赞赏.

以及使它出现所需的插件:https://github.com/Mgamerz/fsoi_plugins

解决方法:

尝试调用方法tk_popup而不是post.

另外,您的代码还会发生内存泄漏,因为每次右键单击时,您都在创建一个新菜单,但从不破坏旧菜单.您只需要创建一个,然后在弹出之前对其进行重新配置.

标签:tkinter,contextmenu,python
来源: https://codeday.me/bug/20191122/2058086.html