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

如何将tkinter多表单中的变量传递给不同函数并正确获取值

问题解决说明

根因

你代码的核心问题是重复创建了Tk()实例:Tkinter中每个Tk()实例对应独立的Tcl解释器环境,全局定义的sv3、sv4属于第一个root的运行上下文,和第二个新窗口的上下文完全隔离,因此变量绑定失效,无法正常取值。

修复方案

  • 子窗口不要用Tk()创建,改用Toplevel(),Toplevel是主窗口的派生窗口,和主窗口共享同一个运行上下文
  • 删掉子窗口的单独mainloop(),整个程序仅保留主窗口的一个mainloop()即可

修改后可运行代码

from tkinter import *
root = Tk()

sv1 = StringVar()
sv2 = StringVar()
sv3 = StringVar()
sv4 = StringVar()

def callback2():
    test2 = sv3.get()
    print(test2)
    print(sv4.get())
    print("show second form entry widgets values")
    return True

def callback():
    test = sv1.get()
    print(test)
    print(sv2.get())
    print("show first form entry widgets values")
    new_form()
    return True

def new_form():
    # 替换Tk()为Toplevel()
    newfrm = Toplevel()
    entry3 = Entry(newfrm, textvariable=sv3).pack()
    entry4 = Entry(newfrm, textvariable=sv4).pack()
    button = Button(newfrm, text="Click Me", command=callback2).pack()
    # 删掉多余的newfrm.mainloop()

def main_form():
    entry1 = Entry(root, textvariable=sv1).pack()
    entry2 = Entry(root, textvariable=sv2).pack()
    button = Button(root, text="Click Me", command=callback).pack()
    root.mainloop()

main_form()

补充说明

如果确实有特殊场景需要多Tk()实例,那对应窗口的StringVar必须在对应窗口的上下文里创建,不过这种场景非常少见。对于给高中生演示的多表单场景,用Toplevel是标准最优实现,逻辑更简单也不容易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:45:03