前提として、GUI等のイベント駆動型のプログラムでは、
プログラムを稼働させる為の処理を定期的に行うループ(イベントループ)を持ち
このイベントループから呼び出されるユーザ定義の関数(イベントハンドラ)は、
直ぐにイベントループ側に処理を戻さなくてはなりません。
イベントループに処理が戻らない場合、応答なしになります。
まずは、どのような時に応答なしになるかを確認する為に、
以下の応答なし状態を再現するコードを実行して見て下さい。
python
1import tkinter as tk
2
3def test():
4 print("TEST")
5
6 ## 通常の実行で、応答なし状態の再現
7 # ここで input() や time.sleep(10) 等の
8 # 時間の掛かるブロッキング処理を呼び出してみる
9 # test関数が処理を追える迄、ウィンドウは応答しない
10
11 ## コンソールで入力があるまで応答なし
12 # input()
13
14 ## 10秒間応答なし
15 # import time
16 # time.sleep(10)
17
18 ## デバッグ実行で、
19 # イベントハンドラ内にブレークポイントを仕掛けた場合も同様で
20 # 実行を再開するまでは、応答なしになります。
21 pass
22
23root = tk.Tk()
24button = tk.Button(root, text="click", command=test)
25button.pack()
26root.mainloop()
何故応答なしになるかは、イベントループの内部を理解する必要があります。
tkinter では mainloop() がこれに該当します。
python
1# イベントループの説明の為のコード(実際の実装とは異なります)
2def mainloop():
3 while True:
4 キーボードやマウス等イベント処理
5 イベントハンドラとして登録された関数はここで呼ばれる
6 関数から処理が戻らないと、他の処理が滞り、応答なしになります。
7 描画更新
デバッグ等で行う「ステップ実行」はプログラムの動作を止める為、
イベントハンドラとして呼び出される関数内にブレークポイントを設定した場合に
一時的に、GUIが応答なしになるのは正常な挙動です。
デバッガ側で実行を再開すると、応答なし状態は解除されるはずです。
「応答なし」の解決策としては、イベントループを止めない事。
イベントハンドラ内で時間の掛かる処理を行わない事ですが、
デバッグ自体の解決策としては、
デバッグが必要なコードは可能なら GUI から切り離し、
単体でテストできるようにする等、設計で工夫できる場合も有ります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。