回答編集履歴

4

「f.sb」に bind する実装方法

2022/05/25 13:54

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -88,3 +88,24 @@
88
88
  root.mainloop()
89
89
 
90
90
  ```
91
+
92
+ bind_all でグローバルの MouseWheel イベントの捕捉ではなく、
93
+ 「f.sb」に bind する実装方法、差分のみ (Tcl言語 / win用)
94
+
95
+ ```python
96
+
97
+ root.tk.eval(f"""
98
+ ttk::combobox::Post {combo}
99
+ ttk::combobox::Unpost {combo}
100
+
101
+ if {{[winfo exists {combo}.popdown.f]}} {{
102
+ bind {combo}.popdown.f.sb <MouseWheel> {{
103
+ {combo}.popdown.f.l yview scroll [expr {{-(%D/120)}}] units
104
+ }}
105
+ }}
106
+ """)
107
+
108
+ ```
109
+
110
+ ※ `{{ }}` となっているのはPythonのf-stringでのエスケープです。
111
+ tcl 言語では単一の括弧ですが、f-string での変数の展開と被る為のエスケープ。

3

ソースコード修正

2022/05/25 13:28

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -77,7 +77,6 @@
77
77
  widgetID = str(event.widget)
78
78
 
79
79
  if widgetID.endswith(".f.sb"):
80
- scrollbar = f"{widgetID}.f.sb"
81
80
  listbox = widgetID.replace(".f.sb", ".f.l")
82
81
  delta = -event.delta//120 # NOTE: Windows only
83
82
 

2

スクロールバーの MouseWheel 対応

2022/05/25 13:27

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -59,3 +59,33 @@
59
59
  ```python
60
60
  cb.bind("<MouseWheel>", lambda _: "break")
61
61
  ```
62
+
63
+
64
+ ----
65
+ 追記: ttk.Combobox スクロールバーのマウスホィール対応
66
+
67
+ ```python
68
+
69
+ import tkinter as tk
70
+ from tkinter import ttk
71
+
72
+ root = tk.Tk()
73
+ combo = ttk.Combobox(root, values=list(range(20)))
74
+ combo.pack()
75
+
76
+ def onMouseWheel(event):
77
+ widgetID = str(event.widget)
78
+
79
+ if widgetID.endswith(".f.sb"):
80
+ scrollbar = f"{widgetID}.f.sb"
81
+ listbox = widgetID.replace(".f.sb", ".f.l")
82
+ delta = -event.delta//120 # NOTE: Windows only
83
+
84
+ root.tk.eval(f"""
85
+ {listbox} yview scroll {delta} units
86
+ """)
87
+
88
+ root.bind_all("<MouseWheel>", onMouseWheel)
89
+ root.mainloop()
90
+
91
+ ```

1

ソースコード訂正

2022/05/24 04:39

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -26,8 +26,24 @@
26
26
  可能ではありますが、リスト表示の判別は
27
27
  Tcl/Tk/Ttkの内部実装のソースコードを読み解く必要があります。
28
28
 
29
+ 実装のヒント:
29
- 実装のヒント: winfo_exists でリストが生成されているかどうかを確認して、
30
+ - winfo_exists でリストが生成されているかどうかを確認して、
30
- winfo_viewable で表示非表示の確認
31
+ - winfo_viewable で表示非表示の確認
32
+
33
+ ```python
34
+
35
+ def onMouseWheel(event):
36
+ widgetID = str(event.widget)
37
+
38
+ if widgetID.startswith(f"{cb}"):
39
+ if int(app.tk.eval(f"winfo exists {widgetID}.popdown"):
40
+ if int(app.tk.eval(f"winfo viewable {widgetID}.popdown"):
41
+ ...
42
+
43
+
44
+ app.bind_all("<MouseWheel>", onMouseWheel)
45
+
46
+ ```
31
47
 
32
48
  ----
33
49
 
@@ -36,7 +52,7 @@
36
52
 
37
53
  クラス毎挙動を変更する (全てのttk.Comboboxが対象)
38
54
  ```python
39
- cb.unbind_class("TCombobox", "<MouseWheel>")
55
+ app.unbind_class("TCombobox", "<MouseWheel>")
40
56
  ```
41
57
 
42
58
  もしくはインスタンス毎の挙動変更 (変数cbのみが対象)