我注意到,选择
ttk.Treeview
中的项目后,即使删除其选择后,ttk.Treeview
小部件仍会记住鼠标单击的最后一个项目。
import tkinter as tk
from tkinter import ttk
class App:
def __init__(self):
self.root = tk.Tk()
self.tree = ttk.Treeview(self.root)
self.tree.pack(side="top", fill="both")
self.tree.bind("<Leave>", self.remove_selection_appearance)
for i in range(20):
self.tree.insert("", "end", text="Item %s" % i)
self.root.mainloop()
def remove_selection_appearance(self, event):
selected_items = event.widget.selection()
print(f"{selected_items=}")
event.widget.selection_remove(selected_items)
# event.widget.selection_toggle(selected_items)
# event.widget.selection_set("")
if __name__ == "__main__":
app = App()
上面是说明此行为的示例代码。例如:
selected_items=()
。Item 3
并且鼠标指针移出小部件,脚本将打印 selected_items=('I004',)
。Shift
键并单击 Item 7
,然后将鼠标指针移出小部件,脚本将打印 selected_items=('I004', 'I005', 'I006', 'I007', 'I008')
。Shift
键并单击 Item 0
,然后将鼠标指针移出小部件,脚本将打印 selected_items=('I001', 'I002', 'I003', 'I004')
。后两个选择显示组选择分别从
'I004'
开始和结束,即 Item 3
,尽管使用 .selection_remove()
小部件的 ttk.Treeview
方法来删除选择。另外,我假设删除任何选择后,鼠标单击的最后一个项目也会类似地被删除/忘记。
有没有办法让
ttk.Treeview
小部件不记住鼠标单击的最后一个项目?或者这种行为是否已融入到小部件中?
据我判断,选择用于突出显示项目,因此使用
selection_remove
您的项目仍将成为焦点。如果你需要取消焦点,你可以使用 focus('')
,虽然我没有看到任何文档表明这是一种取消焦点的方法,但似乎有效。这就是你的函数的样子:
def remove_selection_appearance(self, event: tk.Event):
selected_items = event.widget.selection()
print(f"{selected_items=}")
event.widget.selection_remove(selected_items)
event.widget.focus('')