回答編集履歴

4

for文を使った実装方法2を追記

2021/12/16 03:57

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -146,6 +146,50 @@
146
146
 
147
147
 
148
148
 
149
+ 追記: タイマーを使った解決策2 (案のみ
150
+
151
+
152
+
153
+ ```python
154
+
155
+
156
+
157
+ def change_bg(color):
158
+
159
+ canvas['bg'] = color
160
+
161
+
162
+
163
+ # タイマーを時差で発動させることでアニメーションを表現
164
+
165
+
166
+
167
+ root.after(200*1, change_bg, "#000000")
168
+
169
+ root.after(200*2, change_bg, "#111111")
170
+
171
+ root.after(200*3, change_bg, "#222222")
172
+
173
+ root.after(200*4, change_bg, "#333333")
174
+
175
+
176
+
177
+ # for文を使って一度にタイマーを登録する
178
+
179
+
180
+
181
+ for idx, num in enumerate(range(16), start=1):
182
+
183
+ color = "#" + (f"{num:x}" * 6)
184
+
185
+ root.after(200*idx, change_bg, color)
186
+
187
+ ```
188
+
189
+
190
+
191
+ デメリットはあって、ループ数が多い場合は効率的ではありません。
192
+
149
193
 
150
194
 
151
195
  ----

3

タイマーを重ねるときの注意点を追記

2021/12/16 03:57

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -32,11 +32,13 @@
32
32
 
33
33
 
34
34
 
35
- 2パターン考えられます。
36
-
37
- - Motion イベントで描画更新、タイマーで色を徐々に変更
38
-
39
- - Motion イベントで色を変更、タイマで定期的描画更新
35
+ タイマーの始動となる部分を、Motionイベント内のカソルが任意の場所来た時とします。
36
+
37
+
38
+
39
+ 補足: 注意点は、タイマーが稼働してるときに他の色に変更するタイマーを重ねる場合の対応。
40
+
41
+ after() の戻り値を保存し、after_cancel() に渡す事で、タイマーの中断が可能です。
40
42
 
41
43
 
42
44
 

2

追記

2021/12/16 02:50

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -24,6 +24,20 @@
24
24
 
25
25
 
26
26
 
27
+ 追記: 以下サンプルコードはタイマーの利用を説明したものなので、
28
+
29
+ 「カーソルを動かしたとき」ではなく、「ボタンをクリック」した時になってます。
30
+
31
+ 適宜読み替えて下さい。
32
+
33
+
34
+
35
+ 2パターン考えられます。
36
+
37
+ - Motion イベントで描画更新、タイマーで色を徐々に変更
38
+
39
+ - Motion イベントで色を変更、タイマーで定期的に描画更新
40
+
27
41
 
28
42
 
29
43
  ----

1

補足説明

2021/12/16 02:27

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -246,6 +246,14 @@
246
246
 
247
247
  label.config(bg=color)
248
248
 
249
+
250
+
251
+
252
+
253
+ # time.sleep/root.updateの代わり。タイマーで指定秒後に復帰する。
254
+
255
+ # 前述したような time.sleep/root.update の問題は起こらない。
256
+
249
257
  yield 0.2
250
258
 
251
259