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

回答編集履歴

4

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

2021/12/16 03:57

投稿

teamikl
teamikl

スコア8824

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

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

2021/12/16 03:57

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -15,10 +15,11 @@
15
15
  「カーソルを動かしたとき」ではなく、「ボタンをクリック」した時になってます。
16
16
  適宜読み替えて下さい。
17
17
 
18
- 2パターン考えられます。
19
- - Motion イベントで描画更新、タイマーで色を徐々に変更
20
- - Motion イベントで色を変更、タイマで定期的描画更新
18
+ タイマーの始動となる部分を、Motionイベント内のカソルが任意の場所来た時とします。
21
19
 
20
+ 補足: 注意点は、タイマーが稼働してるときに他の色に変更するタイマーを重ねる場合の対応。
21
+ after() の戻り値を保存し、after_cancel() に渡す事で、タイマーの中断が可能です。
22
+
22
23
  ----
23
24
  期待通りに動かないコード for文利用
24
25
 

2

追記

2021/12/16 02:50

投稿

teamikl
teamikl

スコア8824

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

補足説明

2021/12/16 02:27

投稿

teamikl
teamikl

スコア8824

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())