如何通过变量获取Python字典对应值 解决Tkinter单选按钮取值问题
问题解决方法
你遇到的是Python循环中创建回调函数的经典延迟绑定问题。循环中的answers变量会在每次迭代时被覆盖,循环结束后answers会固定为最后一个遍历的字典键(也就是"Snake"),所有按钮触发回调时读取的都是这个最终值,因此不管点击哪个选项都只会返回3。
以下是两种可行的修改方案:
方案1:通过回调参数绑定当前选项值
利用lambda的默认参数在定义时求值的特性,把每次迭代的answers或num值绑定到回调函数上:
首先修改处理函数,接收选中的选项参数:
def quiz_processAnswer(selected_answer): # 传入选项名的情况,查字典得数值 print(values.get(selected_answer)) # 如果直接绑定num作为参数,直接打印即可,不需要查字典: # def quiz_processAnswer(selected_num): # print(selected_num)
然后修改循环中创建Radiobutton的command参数:
for (answers, num) in values.items(): Radiobutton( master, text = answers, variable = v, value = num, indicator = 0, background = "darkslategray", fg = "goldenrod", # 绑定当前迭代的answers值到参数ans command = lambda ans=answers: quiz_processAnswer(ans) # 如果要直接传数值就写成: # command = lambda n=num: quiz_processAnswer(n) ).pack(fill = X, ipady = 5)
方案2:直接读取单选按钮绑定的变量值(更简便)
你已经给所有单选按钮绑定了同一个IntVar变量v,选中某个按钮时v会自动被赋值为对应按钮的value属性,也就是你字典里存储的数值,不需要额外传参也不需要查字典:
def quiz_processAnswer(): # 直接读取绑定变量的值即可得到对应数值 print(v.get())
注意你需要提前初始化v变量(你原有代码应该已经写了这步,没写的话加上即可):
v = IntVar()
内容的提问来源于stack exchange,提问作者TheWitheredStriker
相关产品推荐
相关产品推荐

