如何让 ttk.Treeview 小部件不记住鼠标单击或选择的最后一项?

问题描述 投票:0回答:1

我注意到,选择

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()

上面是说明此行为的示例代码。例如:

  1. 当鼠标指针进入然后离开小部件时,会打印
    selected_items=()
  2. 接下来,如果单击
    Item 3
    并且鼠标指针移出小部件,脚本将打印
    selected_items=('I004',)
  3. 接下来,按
    Shift
    键并单击
    Item 7
    ,然后将鼠标指针移出小部件,脚本将打印
    selected_items=('I004', 'I005', 'I006', 'I007', 'I008')
  4. 最后,按
    Shift
    键并单击
    Item 0
    ,然后将鼠标指针移出小部件,脚本将打印
    selected_items=('I001', 'I002', 'I003', 'I004')

后两个选择显示组选择分别从

'I004'
开始和结束,即
Item 3
,尽管使用
.selection_remove()
小部件的
ttk.Treeview
方法来删除选择。另外,我假设删除任何选择后,鼠标单击的最后一个项目也会类似地被删除/忘记。

有没有办法让

ttk.Treeview
小部件不记住鼠标单击的最后一个项目?或者这种行为是否已融入到小部件中?

python tkinter treeview tcl
1个回答
0
投票

据我判断,选择用于突出显示项目,因此使用

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('')
© www.soinside.com 2019 - 2024. All rights reserved.