回答編集履歴
5
試した事~の解決策に関して追記
answer
CHANGED
@@ -35,6 +35,16 @@
|
|
35
35
|
root.update()
|
36
36
|
```
|
37
37
|
|
38
|
+
追記:
|
39
|
+
> root.protocolでウィンドウの破棄を検出、whileをbreakしようとした。
|
40
|
+
|
41
|
+
解決策としては、これでも解消できるはずです。どのように break しようとしましたか?
|
42
|
+
|
43
|
+
この場合は、root.protocol に登録した関数は、外部の変数を通じて break の条件を変更する必要があります。
|
44
|
+
ループを中断する変数を導入したが、ローカル変数のフラグを変更しているだけ、
|
45
|
+
のような間違いはよくあるので変数のスコープを調べてみてください、
|
46
|
+
|
47
|
+
----
|
38
48
|
通常は、特別な理由がない限りは mainloop を使った方が良いです。
|
39
49
|
|
40
50
|
- 複数のイベントループを一つのスレッド内で統合して処理したいとき等に mainloop を使わず update を用います。
|
4
訂正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
after での定期的な関数の呼び出しは、
|
1
|
+
after での定期的な関数の呼び出しは、
|
2
2
|
コードの記述は再帰的に見えるが、呼び出し時のスタック利用は再帰呼び出しではありません。
|
3
3
|
|
4
4
|
- after() はすぐに処理を戻し、関数の自体は一旦終了しているので、
|
3
説明補足
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
after での定期的な関数の呼び出しは、
|
1
|
+
after での定期的な関数の呼び出しは、(補足追記: 関数内で update() を使っていなければ)
|
2
2
|
コードの記述は再帰的に見えるが、呼び出し時のスタック利用は再帰呼び出しではありません。
|
3
3
|
|
4
4
|
- after() はすぐに処理を戻し、関数の自体は一旦終了しているので、
|
2
微修正
answer
CHANGED
@@ -38,6 +38,6 @@
|
|
38
38
|
通常は、特別な理由がない限りは mainloop を使った方が良いです。
|
39
39
|
|
40
40
|
- 複数のイベントループを一つのスレッド内で統合して処理したいとき等に mainloop を使わず update を用います。
|
41
|
-
- 「
|
41
|
+
- 「イベントループ 内での」 update() は、再帰っぽい記述ではありませんが
|
42
42
|
再帰呼び出しになる可能性があります。
|
43
43
|
- 描画の更新だけなら update_idletasks
|
1
inspect の使い方
answer
CHANGED
@@ -8,6 +8,13 @@
|
|
8
8
|
|
9
9
|
標準ライブラリの inspect モジュールを使うと、内部スタックの調査ができます。
|
10
10
|
|
11
|
+
```python
|
12
|
+
# 再帰する関数内で呼び出して、スタックが増えるかどうかを確認してみてください。
|
13
|
+
import inspect
|
14
|
+
depth = len(inspect.stack())
|
15
|
+
print(f"call stack depth: {depth}")
|
16
|
+
```
|
17
|
+
|
11
18
|
----
|
12
19
|
|
13
20
|
root.mainloop() 内で呼び出されるイベント内でのroot.update()は
|