【Python GUI tkinterサンプル】Tkinter TopLevelを使ってmodaldialog(モーダルなダイアログ)を実装する
modaldialog(モーダルダイアログ)
ダイアログが閉じられるまで他のウィンドウを操作させない。モーダルなダイアログ。

使用するモジュール
TopLevel
ダイアログを作成する
dialog = Toplevel()
※第一引数に親を指定することができる
非モーダルダイアログ
非モーダルダイアログの場合はダイアログが終了していなくても親のダイアログを操作できる。

例
①”open”ボタンでダイアログ作成する
②ダイアログが立ち上がる
③さらに”open”ボタンを押しダイアログ作成する
この例では複数の同じダイアログを作成できる
サンプルコード
from tkinter import *
import tkinter.ttk as ttk
class ModalDialogSampleApp(ttk.Frame):
    def __init__(self, app):
        super().__init__(app)
        self.pack()
        self.param = StringVar()
        label = ttk.Label(self,text="input param")
        label.pack(side="left")
        entry = ttk.Entry(self,textvariable=self.param)
        entry.pack(side="left")
        button = ttk.Button(self,text="open",command = self.openDialog )
        button.pack(side="left")
    #パラメータを入力するモーダルダイアログを開く
    def openDialog(self):
        self.dialog = Toplevel(self)
        self.dialog.title("modal dialog")
        self.dialog.geometry("300x300")
if __name__ == '__main__':
    #Tkインスタンスを作成し、app変数に格納する
    app  = Tk()
    #縦幅400横幅300に画面サイズを変更します。
    app.geometry("400x300")
    #タイトルを指定
    app.title("Modal Dialog Sample Program")
    # #フレームを作成する
    frame =  ModalDialogSampleApp(app)
    # 格納したTkインスタンスのmainloopで画面を起こす
    app.mainloop()
モーダルダイアログ

ダイアログをモーダルにする
grab_setを使用することでこのダイアログとその子WidgetでないWidgetの操作を制御します。
dialog.grab_set()
サンプルの使い方
①openでモーダルダイアログを立ち上げる
②Entryに値を入力し、closeを押す
③input paramのEntryに値が反映される
サンプルコード
from tkinter import *
import tkinter.ttk as ttk
class ModalDialogSampleApp(ttk.Frame):
    def __init__(self, app):
        super().__init__(app)
        self.pack()
        self.param = StringVar()
        label = ttk.Label(self,text="input param")
        label.pack(side="left")
        entry = ttk.Entry(self,textvariable=self.param)
        entry.pack(side="left")
        button = ttk.Button(self,text="open",command = self.openDialog )
        button.pack(side="left")
    #パラメータを入力するモーダルダイアログを開く
    def openDialog(self):
        self.dialog = Toplevel(self)
        self.dialog.title("modal dialog")
        self.dialog.geometry("300x300")
        # modalに
        self.dialog.grab_set()
        self.paramdialog = StringVar()
        entry = ttk.Entry(self.dialog,textvariable=self.paramdialog)
        entry.pack()
        closeButton = Button(self.dialog, text="close", command=self.closeDialog)
        closeButton.pack()
    # closeする前にダイアログに入力された値を反映する
    def closeDialog(self):
        self.param.set(self.paramdialog.get())
        self.dialog.destroy()
if __name__ == '__main__':
    #Tkインスタンスを作成し、app変数に格納する
    app  = Tk()
    #縦幅400横幅300に画面サイズを変更します。
    app.geometry("400x300")
    #タイトルを指定
    app.title("Modal Dialog Sample Program")
    # #フレームを作成する
    frame =  ModalDialogSampleApp(app)
    # 格納したTkインスタンスのmainloopで画面を起こす
    app.mainloop()