Python Tkinter Treeview左键点击全选失效问题及解决方法
Treeview左键点击条目无法全选的原因及解决方法
问题描述
想实现左键点击Treeview中任意条目时自动选中所有条目,但修改后的代码无法生效,代码如下:
import tkinter as tk from tkinter import ttk root = tk.Tk() tree = ttk.Treeview(root) tree.pack(fill="both", expand=True) items = [] for i in range(10): item = tree.insert("", "end", text="Item {}".format(i+1)) items.append(item) items_to_select = items[:] def select_all_items(event): tree.selection_set(items_to_select) tree.bind('<Button-1>', select_all_items) root.mainloop()
原因分析
你的代码里,自定义的select_all_items函数确实会执行全选操作,但Treeview本身的<Button-1>默认事件会在你的函数执行之后触发——这个默认事件会把选中状态设置为你当前点击的单个条目,直接覆盖了你的全选结果,所以看起来全选没生效。
解决方法
有两种简单的修复方式,任选其一即可:
方法1:阻止默认事件执行
在自定义函数末尾返回'break',终止事件传播,不让Treeview的默认选中行为覆盖你的全选操作:
import tkinter as tk from tkinter import ttk root = tk.Tk() tree = ttk.Treeview(root) tree.pack(fill="both", expand=True) items = [] for i in range(10): item = tree.insert("", "end", text="Item {}".format(i+1)) items.append(item) items_to_select = items[:] def select_all_items(event): tree.selection_set(items_to_select) return 'break' # 阻止默认事件执行 tree.bind('<Button-1>', select_all_items) root.mainloop()
方法2:绑定鼠标释放事件
把绑定的事件从<Button-1>(按下左键)改成<ButtonRelease-1>(松开左键),让默认的单个选中行为先执行,之后再触发全选操作:
import tkinter as tk from tkinter import ttk root = tk.Tk() tree = ttk.Treeview(root) tree.pack(fill="both", expand=True) items = [] for i in range(10): item = tree.insert("", "end", text="Item {}".format(i+1)) items.append(item) items_to_select = items[:] def select_all_items(event): tree.selection_set(items_to_select) tree.bind('<ButtonRelease-1>', select_all_items) # 绑定释放事件 root.mainloop()
内容的提问来源于stack exchange,提问作者Lod
相关产品推荐
相关产品推荐

