質問するログイン新規登録

回答編集履歴

3

追記2 TCL を使わない方法

2022/04/02 20:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -30,3 +30,25 @@
30
30
 
31
31
  一応、マウスクリック時にフラグを立てる等で、ループしないように工夫することは可能ですが、
32
32
  他の問題を引き起こしやすいコードになる為、回避策のひとつとして案だけ提示しておきます。あまりお勧めは出来ません。
33
+
34
+ ----
35
+ 追記2:
36
+
37
+ ttk::treeview::Select ~ toggle は select_toggle で代用出来ました。
38
+ focus 状態の要素を所得する為、ButtonPress ではなく Release 時に登録。
39
+
40
+ ```python
41
+ import tkinter as tk
42
+ from tkinter import ttk
43
+
44
+ root = tk.Tk()
45
+ tree = ttk.Treeview(root, selectmode="none", columns=("value",))
46
+ tree.bind("<ButtonRelease-1>", lambda e: tree.select_toggle(tree.focus()))
47
+
48
+ for num in range(5):
49
+ tree.insert("", tk.END, values=(num,))
50
+
51
+ tree.pack()
52
+ root.mainloop()
53
+
54
+ ```

2

質問のコードの問題点について追記

2022/04/02 07:59

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -19,3 +19,14 @@
19
19
  Ctrlクリックした時と同じ処理を呼び出すようにすれば、実現できると思いますが、
20
20
  Select メソッドは tkinter のクラスでは提供されてません。
21
21
  tcl の eval で直接 Tcl のコマンドを呼び出す実装になります。
22
+
23
+
24
+ ----
25
+ 追記: 質問のコードの問題点について、
26
+
27
+ ループするというのは、event_select は `<<<TreeviewSelect>>` での呼び出しでしょうか?
28
+ 原因はイベントハンドラ内で同イベントが発呼されている為なので、
29
+ イベントハンドラ内でそのハンドラのトリガーとなるイベントを起こしてはいけません。
30
+
31
+ 一応、マウスクリック時にフラグを立てる等で、ループしないように工夫することは可能ですが、
32
+ 他の問題を引き起こしやすいコードになる為、回避策のひとつとして案だけ提示しておきます。あまりお勧めは出来ません。

1

未検証のコードだったため、一時撤回

2022/04/02 07:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -10,11 +10,6 @@
10
10
  { ttk::treeview::Select %W %x %y toggle }
11
11
  """)
12
12
 
13
- # 個別に変更する場合
14
- tree.tk.eval(f"""
15
- bind {tree} <ButtonPress-1> \
16
- { ttk::treeview::Select %W %x %y toggle }
17
- """)
18
13
  ```
19
14
 
20
15