如何将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
相关产品推荐
相关产品推荐

