2015-09-15 53 views
5

私はPython Tkinterを使ってモーダルダイアログを作成しようとしています。私はwait_window()を使用するかどうかに違いがないことを発見しました。Python Tkinterでモーダルダイアログを作成するにはwait_window()が必要ですか?

import tkinter as tk 

def button_click(): 
    dlg = tk.Toplevel(master=window) 

    tk.Button(dlg, text="Dismiss", command=dlg.destroy).pack() 

    dlg.transient(window) # only one window in the task bar 
    dlg.grab_set()   # modal 
    #window.wait_window(dlg) # why? 

window = tk.Tk() 

tk.Button(window, text="Click Me", command=button_click).pack() 

window.mainloop() 

ここで、モーダルダイアログを作成するためのwait_window()を使用した例をいくつか見てきました。だから私は、この関数がモーダルダイアログを作成するために必要かどうかは分かりません。

私はPython 3.5を使用しています。

+0

メインウィンドウに何も接続していない場合は、使用しないでください。そうでなければ、無効なパス、無効なデータなどのエラーが発生します。 'grab_set'は' wait_window'と等しくありません。 'grab_set'はメインウィンドウをフリーズしません。 – dsgdfg

答えて

5

厳密に言えば、いいえ、wait_window()はモーダルダイアログボックスを作成する必要はありません。ダイアログをモーダルにするのは、ウィンドウに置くグラブです。

ただし、しばしばウィンドウが破棄されたら、他のコードを実行する必要があります。この目的のためにwait_window()を使用することができます。続行する前にウィンドウが破棄されるのを待つためです。その後、returnステートメントやクリーンアップコードなどのコードを使用することができます。あなたの場合は何もしないので、wait_windowに電話する必要はありません。

1

window.wait_window(dlg)を使用してコードを実行しても、dlg.grab_set()は既にモーダルダイアログを作成しているため、何も変更されません。これは、windowを閉じることができない一方で、dlgがまだ生きていることを意味します。モーダルダイアログはすべてのマウスイベントをwindowから取得し、nullにリダイレクトするので、ウィンドウを閉じることはできません。

あなたはgrab_set()なしでモーダルダイアログを作成したい場合は、1つのハンドラに、すべてのマウスイベントを結合し、その後、彼らは使用wait_windowを許可または却下すべきかどうかを決定する必要があります。

モーダルダイアログがによって定義されたように == 「をクリックするために利用できる私のアプリケーションでダイアログ外の何でもあり」、あなたはすでにだけgrab_set()を使用してモーダルダイアログを持っています。

アプリケーションでプログラムでwindowを閉じることができない場合は、wait_window()も必要です。

私はすべてを明確にしました。

関連する問題