tkinter父子窗口传值示例

3 阅读1分钟

在 GUI 开发中,窗口间的交互是常见需求。在 Tkinter 中,如何实现多窗口传值以及在关闭子窗口时触发父窗口操作

import tkinter as tk
from tkinter import messagebox

class MainWindow:
    def __init__(self, root):
        self.root = root
        self.root.title("主窗口")
        self.root.geometry("300x150")

        # 创建一个输入框用于输入要传递的值
        self.entry = tk.Entry(root)
        self.entry.pack(pady=10)

        # 创建一个按钮,点击后打开第二个窗口并传递值
        self.open_button = tk.Button(root, text="打开第二个窗口并传递值", command=self.open_second_window)
        self.open_button.pack(pady=5)

        # 创建一个标签,用于显示从子窗口获取的值
        self.value_label = tk.Label(root, text="从子窗口获取的值:")
        self.value_label.pack(pady=10)

    def open_second_window(self):
        # 获取输入框中的值
        value_to_pass = self.entry.get()

        # 如果没有输入值,提示用户
        if not value_to_pass:
            messagebox.showwarning("警告", "请输入要传递的值!")
            return

        # 创建第二个窗口,并将值传递给它
        self.second_window = tk.Toplevel(self.root)
        second_window_instance = SecondWindow(self.second_window, value_to_pass, self)
        self.second_window_instance = second_window_instance

    def update_value(self, received_value):
        # 更新主窗口中的标签
        self.value_label.config(text=f"从子窗口获取的值:{received_value}")

class SecondWindow:
    def __init__(self, root, received_value, main_window):
        self.root = root
        self.root.title("第二个窗口")
        self.root.geometry("250x150+300+300")
        self.main_window = main_window

        # 显示从主窗口接收到的值
        self.label = tk.Label(root, text=f"从主窗口接收到的值:{received_value}")
        self.label.pack(pady=10)

        # 创建一个输入框,用于输入要传递回主窗口的值
        self.entry = tk.Entry(root)
        self.entry.pack(pady=10)

        # 创建一个关闭按钮,点击后关闭子窗口并触发父窗口操作
        self.close_button = tk.Button(root, text="关闭并传递值", command=self.close_and_update_main_window)
        self.close_button.pack(pady=5)

    def close_and_update_main_window(self):
        # 获取要传递回主窗口的值
        value_to_pass_back = self.entry.get()

        # 调用主窗口的方法来更新其内容
        self.main_window.update_value(value_to_pass_back)

        # 关闭子窗口
        self.root.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    main_window = MainWindow(root)
    root.mainloop()