回答編集履歴

1

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

2021/10/24 06:38

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -50,8 +50,98 @@
50
50
 
51
51
  self.state(['!pressed'])
52
52
 
53
+ ```
54
+
55
+
56
+
57
+ ----
58
+
59
+ ## 追記: 2021/10/24 15:26
60
+
61
+
62
+
63
+ ```python
64
+
65
+
66
+
67
+ # 変更箇所1: カーソルが載った時のイベントに <Motion> を追加
68
+
69
+
70
+
71
+ self.bind("<ButtonPress-1>", self.on_close_press, True)
72
+
73
+ self.bind("<ButtonRelease-1>", self.on_close_release)
74
+
75
+ self.bind("<Motion>", self.on_close_motion)
53
76
 
54
77
 
55
78
 
56
79
 
80
+
81
+ # 変更箇所2: CustomNotebook クラスへ on_clsoe_motion メソッドを追加
82
+
83
+
84
+
85
+ def on_close_motion(self, event):
86
+
87
+ element = self.identify(event.x, event.y)
88
+
89
+
90
+
91
+ if "close" in element:
92
+
93
+ self.state(["hover", "!pressed"])
94
+
95
+ else:
96
+
97
+ self.state(["!hover", "!pressed"])
98
+
99
+
100
+
101
+
102
+
103
+ # 変更箇所3: スタイル要素の変更 (※ Theme の影響を受けるかもしれません)
104
+
105
+
106
+
107
+ style.element_create("close", "image", "img_close",
108
+
109
+ ("active", "pressed", "!disabled", "img_closepressed"),
110
+
111
+ ("active", "focus", "hover", "!disabled", "img_closeactive"),
112
+
113
+ border=8, sticky='')
114
+
57
115
  ```
116
+
117
+
118
+
119
+ 対応済みの問題:
120
+
121
+ - カーソルを載せているタブと違うタブの画像が変わる。
122
+
123
+  → style.element_create で登録の際に active を指定する、等。
124
+
125
+ - 閉じるボタンを押したまま、タブ外に移動してでクリックを離すと
126
+
127
+  Notebook に bind した ButtonRelease イベントは発生しません。
128
+
129
+  → 状態が解除されず pressed 状態のままになるので、Motion イベントで !pressed を指定
130
+
131
+
132
+
133
+ 未確認
134
+
135
+ - 非アクティブのタブの閉じるボタンにカーソルを載せた時の挙動
136
+
137
+  スタイル側で、「カーソルの乗った非アクティブのタブ」を識別する方法が、恐らくない。(未確認)
138
+
139
+
140
+
141
+ テストは十分に行ってないので、他にも対応漏れの挙動はあるかもしれません。
142
+
143
+ - focus, hover, active, pressed 等の状態、
144
+
145
+ - ButtonPress, ButtonRelease, Motion 等のイベント (今回は利用してませんが、Enter, Leave)
146
+
147
+ の組み合わせで、目的の挙動を組み立てることになります。