Python3 Tkinter 弹出菜单点击其他地方不自动关闭

2024-09-30 01:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我在运行python3.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)

调用此代码的代码位于以下位置:

^{pr2}$

我在谷歌上搜索,结果发现有些人问了同样的问题却没有答案。一般来说,我对tkinter和python还是比较陌生的,对此我一无所知。我也将其他操作绑定到树视图。在

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

感谢任何帮助。在

以及使其显示所需的插件:https://github.com/Mgamerz/fsoi_plugins


Tags: 代码selfeventaddif菜单rootplugin
2条回答

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

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

打电话给popupFocusOut。在

^{pr2}$

尝试调用方法tk_popup,而不是post。在

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

相关问题 更多 >

    热门问题