回答編集履歴
4
「f.sb」に bind する実装方法
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
ソースコード修正
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 対応
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
ソースコード訂正
test
CHANGED
@@ -26,8 +26,24 @@
|
|
26
26
|
可能ではありますが、リスト表示の判別は
|
27
27
|
Tcl/Tk/Ttkの内部実装のソースコードを読み解く必要があります。
|
28
28
|
|
29
|
+
実装のヒント:
|
29
|
-
|
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
|
-
|
55
|
+
app.unbind_class("TCombobox", "<MouseWheel>")
|
40
56
|
```
|
41
57
|
|
42
58
|
もしくはインスタンス毎の挙動変更 (変数cbのみが対象)
|