実行サンプル
子ウィンドウ起動
・ボタン押下で mode 指定して、子ウィンドウ起動
モード指定により、画面GUIが違うものとして表示される
・ChildWindowが既に存在する場合はメッセージボックスで通知し、新たに開かないようにする
・childWin.py で mode を引数として受け取る
・childWin 起動後、画面が閉じられるまで、次の処理は実行されないようにする
・main.py と childWin.py で情報受け渡しする
実行環境
windows10
python3.9.5
pythonモジュール tcl/tk
実行手順
ソースコードを作成する
windowsコマンドプロンプトでプログラム作成したフォルダに移動し、下記実行する
python プログラム名.py
参考 URL
なし
ソースコード
main.py
import tkinter as tk
from tkinter import messagebox
import childWin
class MainWindow(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
#self.master.geometry(str(320) + "x" + str(200) + "+" + str(200) + "+" + str(200))
self.master.geometry("320x280+200+200")
self.master.title("parent window")
self.child_window = None # ChildWindowのインスタンスを保持するための変数
self.g_parent_str = ""
self.create_widgets()
def create_widgets(self):
# 部品定義
self.button1 = tk.Button(self, text="Open Child Window (Mode 1)", command=lambda: self.open_child_window(1))
self.button2 = tk.Button(self, text="Open Child Window (Mode 2)", command=lambda: self.open_child_window(2))
# 部品配置
self.button1.pack(side='top', anchor='w', padx=5, pady=5)
self.button2.pack(side='top', anchor='w', padx=5, pady=5)
# 部品定義
self.label1 = tk.Label(self, text='子ウィンドウへの情報送付欄')
self.entry_p1 = tk.Entry(self)
# 部品配置
self.label1.pack(side='top', anchor='w') # 左寄せ: anchor='w'
self.entry_p1.pack(side='top', anchor='w')
#
self.entry_p1.insert(0,"from paretn test01")
# 部品定義
self.label2 = tk.Label(self, text='子ウィンドウから情報受け取り 01')
self.entry_p2 = tk.Entry(self)
# 部品配置
self.label2.pack(side='top', anchor='w')
self.entry_p2.pack(side='top', anchor='w')
# 部品定義
self.label3 = tk.Label(self, text='子ウィンドウから情報受け取り 02')
self.entry_p3 = tk.Entry(self)
# 部品配置
self.label3.pack(side='top', anchor='w')
self.entry_p3.pack(side='top', anchor='w')
def open_child_window(self, mode):
# ChildWindowが既に存在する場合はメッセージボックスで通知し、新たに開かないようにする
if self.child_window is not None and self.child_window.winfo_exists():
messagebox.showinfo("Info", "Child Window is already open.")
else:
self.child_window = childWin.ChildWindow(self.master, self, mode)
self.child_window.wait_window() # ChildWindowが閉じるまで待機
msg = "from parent\n child window close\n parent g_parent_str=" + self.g_parent_str
messagebox.showinfo("Info", msg)
self.entry_p3.delete(0, tk.END)
self.entry_p3.insert(0, self.g_parent_str)
if __name__ == "__main__":
root = tk.Tk()
app = MainWindow(master=root)
app.pack()
app.mainloop()
childWin.py
import tkinter as tk
import datetime
class ChildWindow(tk.Toplevel):
def __init__(self, master=None, parent=None, mode=None):
super().__init__(master)
self.master = master
self.parent = parent
#self.geometry(str(400) + "x" + str(200) + "+" + str(400) + "+" + str(400))
self.geometry("400x200+400+400")
self.title("child window")
self.g_cnt = 0
# 部品定義 全体レイアウトのためのフレーム
self.frame1 = tk.Frame(self)
self.frame2 = tk.Frame(self)
self.frame3 = tk.Frame(self)
self.frame4 = tk.Frame(self)
self.frame5 = tk.Frame(self)
# 部品配置 全体レイアウトのためのフレーム
self.frame1.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
self.frame2.grid(row=1, column=0, padx=10, pady=10, sticky="nsew")
self.frame3.grid(row=2, column=0, padx=10, pady=10, sticky="nsew")
self.frame4.grid(row=3, column=0, padx=10, pady=10, sticky="nsew")
self.frame5.grid(row=4, column=0, padx=10, pady=10, sticky="nsew")
if mode == 1:
self.label1 = tk.Label(self.frame1, text="Mode 1: Label 1")
self.label1.pack(side='left')
elif mode == 2:
self.label2 = tk.Label(self.frame2, text="Mode 2: Label 2")
self.label2.pack(side='left')
else:
self.label_invalid = tk.Label(self, text="Invalid Mode")
self.label_invalid.pack(side='left')
# 部品定義
self.button_c1= tk.Button(self.frame3, text="親ウィンドウから情報取得", command=self.func_on_button_c1_clicked)
self.entry_c1 = tk.Entry(self.frame3)
# 部品配置
self.button_c1.pack(side='left', padx=5, pady=5)
self.entry_c1.pack(side='left', padx=5, pady=5)
# 部品定義
self.button_c2= tk.Button(self.frame4, text="親ウィンドウへ情報送付", command=self.func_on_button_c2_clicked)
self.entry_c2 = tk.Entry(self.frame4)
# 部品配置
self.button_c2.pack(side='left', padx=5, pady=5)
self.entry_c2.pack(side='left', padx=5, pady=5)
# 部品定義
self.button_close = tk.Button(self.frame5, text="子ウィンドウを閉じる", command=lambda: self.destroy())
# 部品配置
self.button_close.pack(side='left', padx=5, pady=5)
# 親に情報送付
self.parent.g_parent_str = "from child:" + datetime.datetime.now().isoformat()
def func_on_button_c1_clicked(self):
msg = self.parent.entry_p1.get()
self.entry_c1.delete(0, tk.END)
self.entry_c1.insert(tk.END, msg)
def func_on_button_c2_clicked(self):
self.g_cnt += 1
self.parent.entry_p2.delete(0, tk.END)
self.parent.entry_p2.insert(0, "from child test1: " + str(self.g_cnt))
self.parent.g_parent_str = "from child test2: " + str(self.g_cnt)
