【问题标题】:Python3 Tkinter popup menu not closing automatically when clicking elsewhere单击其他地方时,Python3 Tkinter 弹出菜单不会自动关闭
【发布时间】:2014-01-18 05:41:42
【问题描述】:

我正在运行 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

【问题讨论】:

    标签: python tkinter contextmenu


    【解决方案1】:

    尝试调用方法tk_popup 而不是post

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

    【讨论】:

    • 我的印象是,一旦弹出窗口消失,对那块内存的引用就会丢失,并且垃圾收集器会在下次运行时将其拾取,就像在 Java 中一样。有什么东西使它与众不同吗?用户通常不会右键单击我的应用程序,除非他们想要更改某些内容,否则他们永远不会看到此菜单,这不会经常发生。
    • 使用 tk_popup 将解决出现多个上下文菜单的问题(如果您只创建一个菜单),但它不会使左键单击其他地方导致它消失而无需执行其他操作,或设置一些我不知道的设置。你怎么修好它的?或者您对单击关闭菜单的选项是否满意?
    【解决方案2】:

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

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

    并在 popupFocusOut 中调用 unpost。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多