回答編集履歴
1
クリック時に対応したコードを追記
answer
CHANGED
@@ -24,6 +24,51 @@
|
|
24
24
|
self.state(['pressed'])
|
25
25
|
else:
|
26
26
|
self.state(['!pressed'])
|
27
|
+
```
|
27
28
|
|
29
|
+
----
|
30
|
+
## 追記: 2021/10/24 15:26
|
28
31
|
|
32
|
+
```python
|
33
|
+
|
34
|
+
# 変更箇所1: カーソルが載った時のイベントに <Motion> を追加
|
35
|
+
|
36
|
+
self.bind("<ButtonPress-1>", self.on_close_press, True)
|
37
|
+
self.bind("<ButtonRelease-1>", self.on_close_release)
|
38
|
+
self.bind("<Motion>", self.on_close_motion)
|
39
|
+
|
40
|
+
|
41
|
+
# 変更箇所2: CustomNotebook クラスへ on_clsoe_motion メソッドを追加
|
42
|
+
|
43
|
+
def on_close_motion(self, event):
|
44
|
+
element = self.identify(event.x, event.y)
|
45
|
+
|
46
|
+
if "close" in element:
|
47
|
+
self.state(["hover", "!pressed"])
|
48
|
+
else:
|
49
|
+
self.state(["!hover", "!pressed"])
|
50
|
+
|
51
|
+
|
52
|
+
# 変更箇所3: スタイル要素の変更 (※ Theme の影響を受けるかもしれません)
|
53
|
+
|
54
|
+
style.element_create("close", "image", "img_close",
|
55
|
+
("active", "pressed", "!disabled", "img_closepressed"),
|
56
|
+
("active", "focus", "hover", "!disabled", "img_closeactive"),
|
57
|
+
border=8, sticky='')
|
29
|
-
```
|
58
|
+
```
|
59
|
+
|
60
|
+
対応済みの問題:
|
61
|
+
- カーソルを載せているタブと違うタブの画像が変わる。
|
62
|
+
→ style.element_create で登録の際に active を指定する、等。
|
63
|
+
- 閉じるボタンを押したまま、タブ外に移動してでクリックを離すと
|
64
|
+
Notebook に bind した ButtonRelease イベントは発生しません。
|
65
|
+
→ 状態が解除されず pressed 状態のままになるので、Motion イベントで !pressed を指定
|
66
|
+
|
67
|
+
未確認
|
68
|
+
- 非アクティブのタブの閉じるボタンにカーソルを載せた時の挙動
|
69
|
+
スタイル側で、「カーソルの乗った非アクティブのタブ」を識別する方法が、恐らくない。(未確認)
|
70
|
+
|
71
|
+
テストは十分に行ってないので、他にも対応漏れの挙動はあるかもしれません。
|
72
|
+
- focus, hover, active, pressed 等の状態、
|
73
|
+
- ButtonPress, ButtonRelease, Motion 等のイベント (今回は利用してませんが、Enter, Leave)
|
74
|
+
の組み合わせで、目的の挙動を組み立てることになります。
|