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

回答編集履歴

1

クリック時に対応したコードを追記

2021/10/24 06:38

投稿

teamikl
teamikl

スコア8817

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
+ の組み合わせで、目的の挙動を組み立てることになります。