0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2024-04-20

実行サンプル

子ウィンドウ起動

image.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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?