Percebo que após um item ter ttk.Treeview
sido selecionado, mesmo após remover sua seleção, o ttk.Treeview
widget ainda se lembrará do último item que foi clicado com o mouse.
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()
Acima está um código de exemplo para ilustrar esse comportamento. Por exemplo:
- Quando o ponteiro do mouse entra e sai do widget, ele será impresso
selected_items=()
. - Em seguida, se
Item 3
for clicado e o ponteiro do mouse sair do widget, o script será impressoselected_items=('I004',)
. - Em seguida, pressionando a
Shift
tecla e clicandoItem 7
e movendo o ponteiro do mouse para fora do widget, o script será impressoselected_items=('I004', 'I005', 'I006', 'I007', 'I008')
. - Por fim, pressionando a
Shift
tecla e clicandoItem 0
e movendo o ponteiro do mouse para fora do widget, o script será impressoselected_items=('I001', 'I002', 'I003', 'I004')
.
As duas últimas seleções mostram que a seleção do grupo começou e terminou em 'I004'
, ou seja Item 3
, respectivamente, apesar do .selection_remove()
método do ttk.Treeview
widget ser usado para remover as seleções. Além disso, presumi que, após remover qualquer seleção, o último item clicado com o mouse seria igualmente removido/esquecido.
Existe uma maneira de fazer com que o ttk.Treeview
widget não se lembre do último item que foi clicado com o mouse? Ou esse comportamento está embutido no widget?
Tanto quanto posso julgar, a seleção é usada para destacar itens, portanto, usar
selection_remove
seu item ainda estará em foco. Se você precisar desfocá-lo, pode usarfocus('')
, embora eu não tenha visto nenhuma documentação de que seja uma maneira de remover o foco, mas parece funcionar. Então é assim que sua função pode ser: