tkinter の複数要素選択は、selectmode で変更可能で、
Listbox では selectmode="multiple" で複数選択可能になりますが、
残念ながら、ttk.Treeview ではサポートされてません。
python
1# デフォルトの振る舞いを変更でも良いなら (全ての treeview の挙動変更)
2root.eval("""
3 bind Treeview <ButtonPress-1> \
4 { ttk::treeview::Select %W %x %y toggle }
5""")
6
参考: Control クリックした場合のイベント treeview.tcl Tcl言語のソースコード
デフォルトの振る舞いをキャンセルして、
Ctrlクリックした時と同じ処理を呼び出すようにすれば、実現できると思いますが、
Select メソッドは tkinter のクラスでは提供されてません。
tcl の eval で直接 Tcl のコマンドを呼び出す実装になります。
追記: 質問のコードの問題点について、
ループするというのは、event_select は <<<TreeviewSelect>>
での呼び出しでしょうか?
原因はイベントハンドラ内で同イベントが発呼されている為なので、
イベントハンドラ内でそのハンドラのトリガーとなるイベントを起こしてはいけません。
一応、マウスクリック時にフラグを立てる等で、ループしないように工夫することは可能ですが、
他の問題を引き起こしやすいコードになる為、回避策のひとつとして案だけ提示しておきます。あまりお勧めは出来ません。
追記2:
ttk::treeview::Select ~ toggle は select_toggle で代用出来ました。
focus 状態の要素を所得する為、ButtonPress ではなく Release 時に登録。
python
1import tkinter as tk
2from tkinter import ttk
3
4root = tk.Tk()
5tree = ttk.Treeview(root, selectmode="none", columns=("value",))
6tree.bind("<ButtonRelease-1>", lambda e: tree.select_toggle(tree.focus()))
7
8for num in range(5):
9 tree.insert("", tk.END, values=(num,))
10
11tree.pack()
12root.mainloop()
13
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/02 08:34
2022/04/02 20:02
2022/04/03 03:57 編集
2022/04/03 03:56
2022/04/07 09:13