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

回答編集履歴

5

試した事~の解決策に関して追記

2021/05/21 09:44

投稿

teamikl
teamikl

スコア8817

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

訂正

2021/05/21 09:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,4 +1,4 @@
1
- after での定期的な関数の呼び出しは、(補足追記: 関数内で update() を使っていなければ)
1
+ after での定期的な関数の呼び出しは、
2
2
  コードの記述は再帰的に見えるが、呼び出し時のスタック利用は再帰呼び出しではありません。
3
3
 
4
4
  - after() はすぐに処理を戻し、関数の自体は一旦終了しているので、

3

説明補足

2021/05/21 09:23

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,4 +1,4 @@
1
- after での定期的な関数の呼び出しは、
1
+ after での定期的な関数の呼び出しは、(補足追記: 関数内で update() を使っていなければ)
2
2
  コードの記述は再帰的に見えるが、呼び出し時のスタック利用は再帰呼び出しではありません。
3
3
 
4
4
  - after() はすぐに処理を戻し、関数の自体は一旦終了しているので、

2

微修正

2021/05/21 09:21

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -38,6 +38,6 @@
38
38
  通常は、特別な理由がない限りは mainloop を使った方が良いです。
39
39
 
40
40
  - 複数のイベントループを一つのスレッド内で統合して処理したいとき等に mainloop を使わず update を用います。
41
- - 「mainloop() 内での」 update() は、再帰っぽい記述ではありませんが
41
+ - 「イベントループ 内での」 update() は、再帰っぽい記述ではありませんが
42
42
   再帰呼び出しになる可能性があります。
43
43
  - 描画の更新だけなら update_idletasks

1

inspect の使い方

2021/05/21 09:08

投稿

teamikl
teamikl

スコア8817

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