python GUI tcl/tk  子ウィンドウ起動  旧：引数限定版

# 実行サンプル
子ウィンドウ起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423803/f7c7c319-1289-0190-097d-8ad6596622a7.png)


・ボタン押下で 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)

```