Linux下误触Treeview右键上下文菜单后如何关闭(无需添加关闭项)
解决Tkinter Treeview右键菜单误触后的关闭问题
右键弹出上下文菜单后,不用额外加关闭项就能关掉菜单,有两种实用方法:
方法一:点击主窗口任意区域关闭菜单
给主窗口绑定左键点击事件,触发菜单的unpost()方法,只要点击窗口内任何区域(空白处、控件上),菜单都会关闭。
在你的代码__init__方法中添加一行绑定:
self.root.bind('<Button-1>', lambda e: self.context_menu.unpost())
方法二:仅点击Treeview区域关闭菜单
如果只想在点击Treeview时关闭菜单,给Treeview绑定左键事件,同时保留它原本的选中功能:
在_member_tree()方法里添加:
tree.bind('<Button-1>', lambda e: self.context_menu.unpost(), add='+')
这里的add='+'是为了不覆盖Treeview默认的左键选中逻辑,让两个功能共存。
完整修改后的代码
import tkinter as tk from tkinter import ttk MEMBER_COLUMNS = ( ('first_name', 'First name', 120), ) class MainFrame(): def __init__(self): self.root = tk.Tk() self.tree = self._member_tree() self.tree.grid(row=0, column=0) self.context_menu = tk.Menu(self.root, tearoff=0) self.context_menu.add_command(label='Delete', command=self._delete) # 方法一:点击主窗口任意区域关闭菜单 self.root.bind('<Button-1>', lambda e: self.context_menu.unpost()) self.root.mainloop() def _member_tree(self) -> ttk.Treeview: tree = ttk.Treeview(self.root, selectmode='browse', height=5) tree.grid(row=0, column=0, sticky=tk.NSEW) tree.bind('<Button-3>', self._show_context_menu) # 方法二:点击Treeview区域关闭菜单(用方法一可注释此行) # tree.bind('<Button-1>', lambda e: self.context_menu.unpost(), add='+') tree.column("#0", width=0) col_list = tuple([col[0] for col in MEMBER_COLUMNS]) tree['columns'] = col_list for col in MEMBER_COLUMNS: (col_key, col_text, col_width) = (col[0], col[1], col[2]) tree.heading(col_key, text=col_text) tree.column(col_key, width=col_width, anchor=tk.W) for member in ['John', 'Fred']: tree.insert('', 'end', values=member) return tree def _show_context_menu(self, event): self.context_menu.post(event.x_root, event.y_root) def _delete(self): print('delete') if __name__ == '__main__': MainFrame()
原理说明
Tkinter的Menu组件自带unpost()方法,专门用于关闭已弹出的菜单。通过绑定左键点击事件触发这个方法,就能实现无额外关闭项的菜单关闭效果。
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

