在 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()