回答編集履歴
2
誤字訂正
answer
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
同スレッド内では使えません。
|
20
20
|
|
21
|
-
mainloop と time.sleep 共に
|
21
|
+
mainloop と time.sleep 共に処理をブロックする関数なので、
|
22
22
|
実行が終わるまで次の行のコードは実行されません。実行が終わるのは
|
23
23
|
time.sleepは指定秒数。mainloopが終了するのはウィンドウが閉じられた時です。
|
24
24
|
|
1
編集中に誤って送信してしまったので修正
answer
CHANGED
@@ -1,22 +1,39 @@
|
|
1
|
+
回答は既にされているので、その解説を
|
2
|
+
|
3
|
+
----
|
1
4
|
> エラーは表示されませんが、赤い画面が表示されず、黒い画面が表示され終わります。
|
2
5
|
> time.sleep(3)は無視されたようです。
|
3
6
|
|
4
7
|
- 黒い四角形を生成
|
5
8
|
- 赤い四角形を生成(同じ座標・同じ大きさなので、見た目的には上書き)
|
6
9
|
- time.sleep 3秒待つ
|
7
|
-
- mainloop 描画
|
10
|
+
- mainloop ここで描画
|
8
11
|
|
12
|
+
プログラムは指示されたとおりにコードを実行してますが、
|
13
|
+
ユーザが目にする事象としては、
|
9
|
-
|
14
|
+
「プログラムの起動に少し時間が掛かり、赤い四角が表示」となります。
|
10
15
|
|
11
16
|
|
12
17
|
> tkinterを使っているときは、time.sleep()は使えないのでしょうか。
|
13
18
|
|
14
19
|
同スレッド内では使えません。
|
15
20
|
|
16
|
-
|
17
21
|
mainloop と time.sleep 共に「ブロッキン」する関数なので、
|
18
|
-
実行が終わるまで次のコードは実行されません。
|
22
|
+
実行が終わるまで次の行のコードは実行されません。実行が終わるのは
|
19
23
|
time.sleepは指定秒数。mainloopが終了するのはウィンドウが閉じられた時です。
|
20
24
|
|
25
|
+
GUIのプログラムでは、イベントループ内(tkinter では mainloop)で、
|
26
|
+
描画や、マウスなどのキー入力イベント、等がループ処理されてます。
|
27
|
+
|
28
|
+
その為、何か時間の掛かる処理を行うと、
|
29
|
+
GUIの処理を担当している関数が呼び出されなくなり、
|
30
|
+
結果、その間はウィンドウが更新されず操作を受け付けない状態となります。
|
31
|
+
|
21
|
-
tkinter に限らず、「イベント駆動型プログラミング」全般
|
32
|
+
これはtkinter に限らず、「イベント駆動型プログラミング」全般に共通する、
|
22
|
-
大抵の GUI で同様の注意事項
|
33
|
+
大抵の GUI で同様の注意事項です。
|
34
|
+
|
35
|
+
- time.sleep -> タイマーを使う (tkinter では after())
|
36
|
+
- 時間の掛かるループ処理、ファイル/ネットワークIO等 -> スレッドを使う
|
37
|
+
|
38
|
+
注意点は、GUI のイベントループ mainloop() を阻害してはいけないという点なので、
|
39
|
+
別スレッドでは自由に time.sleep を使えます。
|