回答編集履歴
4
for文を使った実装方法2を追記
answer
CHANGED
@@ -72,7 +72,29 @@
|
|
72
72
|
|
73
73
|
実際の実行時の呼出は再帰呼出ではありません。
|
74
74
|
|
75
|
+
追記: タイマーを使った解決策2 (案のみ
|
75
76
|
|
77
|
+
```python
|
78
|
+
|
79
|
+
def change_bg(color):
|
80
|
+
canvas['bg'] = color
|
81
|
+
|
82
|
+
# タイマーを時差で発動させることでアニメーションを表現
|
83
|
+
|
84
|
+
root.after(200*1, change_bg, "#000000")
|
85
|
+
root.after(200*2, change_bg, "#111111")
|
86
|
+
root.after(200*3, change_bg, "#222222")
|
87
|
+
root.after(200*4, change_bg, "#333333")
|
88
|
+
|
89
|
+
# for文を使って一度にタイマーを登録する
|
90
|
+
|
91
|
+
for idx, num in enumerate(range(16), start=1):
|
92
|
+
color = "#" + (f"{num:x}" * 6)
|
93
|
+
root.after(200*idx, change_bg, color)
|
94
|
+
```
|
95
|
+
|
96
|
+
デメリットはあって、ループ数が多い場合は効率的ではありません。
|
97
|
+
|
76
98
|
----
|
77
99
|
推奨しない解決策: ループ内 .update() で強制的に描画を反映できますが…
|
78
100
|
|
3
タイマーを重ねるときの注意点を追記
answer
CHANGED
@@ -15,10 +15,11 @@
|
|
15
15
|
「カーソルを動かしたとき」ではなく、「ボタンをクリック」した時になってます。
|
16
16
|
適宜読み替えて下さい。
|
17
17
|
|
18
|
-
2パターン考えられます。
|
19
|
-
- Motion イベントで描画更新、タイマーで色を徐々に変更
|
20
|
-
|
18
|
+
タイマーの始動となる部分を、Motionイベント内のカーソルが任意の場所に来た時とします。
|
21
19
|
|
20
|
+
補足: 注意点は、タイマーが稼働してるときに他の色に変更するタイマーを重ねる場合の対応。
|
21
|
+
after() の戻り値を保存し、after_cancel() に渡す事で、タイマーの中断が可能です。
|
22
|
+
|
22
23
|
----
|
23
24
|
期待通りに動かないコード for文利用
|
24
25
|
|
2
追記
answer
CHANGED
@@ -11,7 +11,14 @@
|
|
11
11
|
GUIでのアニメーション処理には、
|
12
12
|
GUIライブラリの提供するタイマーを用いるのが一般的な解決策です。
|
13
13
|
|
14
|
+
追記: 以下サンプルコードはタイマーの利用を説明したものなので、
|
15
|
+
「カーソルを動かしたとき」ではなく、「ボタンをクリック」した時になってます。
|
16
|
+
適宜読み替えて下さい。
|
14
17
|
|
18
|
+
2パターン考えられます。
|
19
|
+
- Motion イベントで描画更新、タイマーで色を徐々に変更
|
20
|
+
- Motion イベントで色を変更、タイマーで定期的に描画更新
|
21
|
+
|
15
22
|
----
|
16
23
|
期待通りに動かないコード for文利用
|
17
24
|
|
1
補足説明
answer
CHANGED
@@ -122,6 +122,10 @@
|
|
122
122
|
for num in range(16):
|
123
123
|
color = "#" + (f"{num:x}" * 6)
|
124
124
|
label.config(bg=color)
|
125
|
+
|
126
|
+
|
127
|
+
# time.sleep/root.updateの代わり。タイマーで指定秒後に復帰する。
|
128
|
+
# 前述したような time.sleep/root.update の問題は起こらない。
|
125
129
|
yield 0.2
|
126
130
|
|
127
131
|
gentimer.tk(root, _update())
|