質問: ここでは初めての質問です。 Pythonもまだ習い始めたばかりです。(VBAやC#の経験はあります) ダイアログベースのプログラム (最初から最後までダイアログが表示されているようなプログラム) の記述例はネット上にありましたので分かりましたが、 メインのプログラムから一時的にダイアログを表示して、 ダイアログが閉じられたら再びメインのプログラムに戻って、 処理を進めていくようなプログラムの基本的な書き方がよく分かりません。 具体的には、 Pythonのプログラムを実行すると、 1) 実行条件を設定する設定ダイアログを表示して ユーザーが実行条件の設定を完了したら開始ボタンで この設定ダイアログを閉じる。 2) 設定された実行条件に基づいてデータ処理を行い、 実行結果をファイルに出力する。 3) 処理が終了したことを示す終了ダイアログを表示して ユーザーからの完了ボタンで このダイアログを閉じてプログラムを終了する。 という処理を行いたいのですが、 以下のコードでは、 1)のユーザーの設定が終わる前に、 2)3)の処理が実行されてしまいます。 ``` import tkinter import win32api #flg=0 # 1) 開始処理 root1=tkinter.Tk() root1.title('開始') root1.geometry('300x200') label1=tkinter.Label(root1,text='実行を開始します') label1.grid() button1=tkinter.Button(root1,text='開始',command=lambda : pushed1()) button1.grid() #while flg!=1: # print(flg) # 2) 本処理 win32api.Sleep(10000) # 3) 終了処理 root2=tkinter.Tk() root2.title('終了') root2.geometry('300x200') label2=tkinter.Label(root2,text='終了しました') label2.grid() button2=tkinter.Button(root2,text='完了',command=lambda : pushed2()) button2.grid() #while flg!=2: # print(flg) print('END') def pushed1(): # global flg # flg=1 root1.destroy() def pushed2(): # global flg # flg=2 root2.destroy() ``` 1)で開始ボタンが押されるまで、2)以降の処理を実行しないようにするには、 どのように記述すればよいのでしょうか。できましたら、 グローバル変数を使用しない方法でお願いします。 (Windows10,Python 3.7.3) 【追記】 ●list1 ``` import tkinter import win32api def pushed1(): root1.destroy() def pushed2(): root2.destroy() #メイン処理 # 1) 開始処理 root1=tkinter.Tk() root1.title('開始') root1.geometry('300x200') label1=tkinter.Label(root1,text='実行を開始します') label1.grid() button1=tkinter.Button(root1,text='開始',command=lambda : pushed1()) button1.grid() root1.mainloop() # 2) 本処理 win32api.Sleep(10000) # 3) 終了処理 root2=tkinter.Tk() root2.title('終了') root2.geometry('300x200') label2=tkinter.Label(root2,text='終了しました') label2.grid() button2=tkinter.Button(root2,text='完了',command=lambda : pushed2()) button2.grid() root2.mainloop() print('END') ``` ●list2 ``` import tkinter import win32api def pushed1(): root1.destroy() def pushed2(): root2.destroy() #メイン処理 # 1) 開始処理 root1=tkinter.Tk() root1.title('開始') root1.geometry('300x200') label1=tkinter.Label(root1,text='実行を開始します') label1.grid() button1=tkinter.Button(root1,text='開始',command=lambda : pushed1()) button1.grid() root1.grab_set() root1.wait_window(root1) # 2) 本処理 win32api.Sleep(10000) # 3) 終了処理 root2=tkinter.Tk() root2.title('終了') root2.geometry('300x200') label2=tkinter.Label(root2,text='終了しました') label2.grid() button2=tkinter.Button(root2,text='完了',command=lambda : pushed2()) button2.grid() root2.grab_set() root2.wait_window(root2) print('END') ```
回答: このような他のウィンドウに制御を移さないダイアログを、モーダルダイアログとかモーダルウィンドウとかいいます。 ということで、「tkinter モーダルダイアログ」でぐぐってみればどうでしょう