多Tk窗口程序中Tkinter Radiobutton(StringVar)返回空值问题咨询
问题原因及解决办法
根本原因:多个
Tk()实例导致变量绑定失效
Tkinter的StringVar这类变量是和创建它时所在的Tcl解释器绑定的。每个Tk()实例都会启动一个独立的Tcl解释器,大型程序里如果创建了多个Tk()窗口,而单选按钮的StringVar是在第一个Tk()实例下创建的,放到第二个Tk()窗口里时,两个解释器不共享变量,单选按钮的选择无法同步到变量上,自然返回空值。小型程序只有一个Tk(),变量和单选按钮在同一个解释器环境下,所以能正常工作。解决办法:用
Toplevel()替代额外的Tk()实例
保留一个主Tk()作为程序的根窗口,所有其他弹出窗口都用Toplevel()创建,它会依附于主Tk的解释器,这样StringVar就能和单选按钮正常绑定。
示例代码:
import tkinter as tk def open_new_window(): # 使用Toplevel而非Tk()创建新窗口 new_win = tk.Toplevel(root) gender_var = tk.StringVar(value="男") male_radio = tk.Radiobutton(new_win, text="男", variable=gender_var, value="男") male_radio.pack() female_radio = tk.Radiobutton(new_win, text="女", variable=gender_var, value="女") female_radio.pack() def get_gender(): print(gender_var.get()) tk.Button(new_win, text="获取性别", command=get_gender).pack() root = tk.Tk() tk.Button(root, text="打开新窗口", command=open_new_window).pack() root.mainloop()
- 额外注意事项
如果需要在不同窗口间共享变量,要确保变量是在主Tk()实例创建后定义的,或者创建变量时通过master=root参数明确关联到主窗口的解释器。
内容的提问来源于stack exchange,提问作者daring dodo
相关产品推荐
相关产品推荐

