You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tkinter的新窗口中显示Entry组件的输入内容?

解决Tkinter跨窗口传递Entry输入内容的问题

嘿,我完全懂你遇到的困扰——在Tkinter里让两个窗口共享输入内容,直接调用组件或者乱用全局变量确实容易掉坑。下面给你几个实用的解决方案,每种都带可运行的代码示例,你可以根据自己的需求选:

方法1:用Tkinter的StringVar共享变量

这是最推荐的方式,因为StringVar是Tkinter专门设计的同步变量,能自动和Entry组件绑定,跨窗口访问也很安全。

import tkinter as tk

def open_marksheet():
    # 创建第二个窗口
    marksheet_win = tk.Toplevel(root)
    marksheet_win.title("Marksheet")
    
    # 直接使用共享的StringVar获取内容并显示
    tk.Label(marksheet_win, text=f"输入的内容:{name_var.get()}").pack(pady=20)

# 主窗口(第一个窗口)
root = tk.Tk()
root.title("Enter Details")

# 定义共享的StringVar
name_var = tk.StringVar()

# Entry组件绑定这个变量
tk.Label(root, text="输入内容:").pack(pady=5)
e1 = tk.Entry(root, textvariable=name_var)
e1.pack(pady=5)

# 按钮触发打开第二个窗口
tk.Button(root, text="打开成绩单", command=open_marksheet).pack(pady=10)

root.mainloop()

方法2:打开第二个窗口时直接传递参数

如果不想用StringVar,可以在触发打开第二个窗口的动作时,先获取Entry的内容,再把它作为参数传给第二个窗口的创建函数。

import tkinter as tk

def open_marksheet(input_content):
    marksheet_win = tk.Toplevel(root)
    marksheet_win.title("Marksheet")
    
    # 使用传递过来的参数显示内容
    tk.Label(marksheet_win, text=f"输入的内容:{input_content}").pack(pady=20)

root = tk.Tk()
root.title("Enter Details")

tk.Label(root, text="输入内容:").pack(pady=5)
e1 = tk.Entry(root)
e1.pack(pady=5)

# 用lambda把Entry的内容作为参数传递
tk.Button(root, text="打开成绩单", command=lambda: open_marksheet(e1.get())).pack(pady=10)

root.mainloop()

方法3:正确使用全局变量(不推荐,但如果一定要用)

你之前用全局变量失败,大概率是没在函数里正确声明global关键字,导致创建了局部变量覆盖了全局的。试试这样写:

import tkinter as tk

e1_input = ""  # 全局变量

def save_and_open():
    global e1_input  # 声明要使用全局变量
    e1_input = e1.get()  # 保存输入内容到全局变量
    open_marksheet()

def open_marksheet():
    marksheet_win = tk.Toplevel(root)
    marksheet_win.title("Marksheet")
    
    tk.Label(marksheet_win, text=f"输入的内容:{e1_input}").pack(pady=20)

root = tk.Tk()
root.title("Enter Details")

tk.Label(root, text="输入内容:").pack(pady=5)
e1 = tk.Entry(root)
e1.pack(pady=5)

tk.Button(root, text="打开成绩单", command=save_and_open).pack(pady=10)

root.mainloop()

为什么你之前的方法失败?

  • 直接调用e1.get():如果第一个窗口被关闭(比如用destroy()),e1组件会被销毁,再调用get()就会报错或者返回空。
  • 全局变量没生效:如果在函数里没加global声明,你其实是在函数内部创建了一个同名的局部变量,全局变量根本没被修改。

内容的提问来源于stack exchange,提问作者Mayank_pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:27:34