【Python GUI tkinterサンプル】Tkinter TopLevelを使ってmodaldialog(モーダルなダイアログ)を実装する

<tkinterトップページに戻る>

modaldialog(モーダルダイアログ)

ダイアログが閉じられるまで他のウィンドウを操作させない。モーダルなダイアログ。

modaldialog0

使用するモジュール

TopLevel

ダイアログを作成する

dialog = Toplevel()

※第一引数に親を指定することができる

非モーダルダイアログ

非モーダルダイアログの場合はダイアログが終了していなくても親のダイアログを操作できる。

modaldialog1

①”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()

 

モーダルダイアログ

modaldialog0

ダイアログをモーダルにする

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

 

 

あわせて読みたい