Tkinter Checkbutton变量值无法更新问题求助
嘿,我看到你的问题了,这两个小细节导致了Checkbutton的异常,咱们一个个来捋清楚:
问题1:多个Tk()实例引发的变量绑定混乱
你已经在主程序里创建了master=Tk(),然后在runp函数里又新建了window=Tk()——Tkinter并不支持同时运行多个Tk()实例,因为每个实例都会启动独立的Tcl解释器,这会让你的变量无法正确和子窗口的控件绑定,最终导致值始终没变化。
解决办法很简单:把子窗口改成用Toplevel()创建,它会依附于主窗口的Tcl解释器,变量就能正常和控件绑定了。
问题2:代码里的笔误
看这段代码:
RwMatrixRadio=Checkbutton(window, text="RwMatrix.Rdata", variable=RwMatrix, command=lambda: cb(RwInfo))
这里的command参数里你传的是RwInfo变量,但这个Checkbutton绑定的明明是RwMatrix!所以点击这个按钮时,打印的是RwInfo的值,而不是当前控件对应的RwMatrix,这会让你误以为变量没更新。把它改成cb(RwMatrix)就对了。
修正后的完整代码
from tkinter import * def runp(): def cb(vari): print ("variable is {0}".format(vari.get())) # 改用Toplevel创建子窗口,依附于主窗口的解释器 window = Toplevel() window.title("Please choose the parameters") window.geometry('500x350') labelSelect=Label(window, text="Which Rdata file would you like to load? (from output directory)") labelSelect.grid(column=0, row=11) FastaC=BooleanVar() RwMatrix=BooleanVar() RwSum=BooleanVar() RwInfo=BooleanVar() FastaCRadio=Checkbutton(window, text="FastaClean.Rdata", variable=FastaC, command=lambda: cb(FastaC)) FastaCRadio.grid(column=1, row=11) # 修正笔误,传入当前控件绑定的RwMatrix变量 RwMatrixRadio=Checkbutton(window, text="RwMatrix.Rdata", variable=RwMatrix, command=lambda: cb(RwMatrix)) RwMatrixRadio.grid(column=1, row=12) RwSumRadio=Checkbutton(window, text="RwSum.Rdata", variable=RwSum, command=lambda: cb(RwSum)) RwSumRadio.grid(column=1, row=13) RwInfoRadio=Checkbutton(window, text="RwInfo.Rdata", variable=RwInfo,command=lambda:cb(RwInfo)) RwInfoRadio.grid(column=1, row=14) window.mainloop() master=Tk() Button(master, text="RW", command=runp).pack() master.mainloop()
这样修改后,你点击每个Checkbutton时,就能正确打印对应变量的状态变化了。另外,如果你想设置默认选中/未选中状态,可以用BooleanVar(value=True)或者FastaC.set(True)这样的方式初始化变量哦。
内容的提问来源于stack exchange,提问作者MagicLettuce
相关产品推荐
相关产品推荐

