Tkinter使用Slider滑块设置Label文本时乘积计算结果不生效问题
问题成因
Scale组件的command参数要求传入可调用的函数引用,代码中直接写command=setCost(var, newsPapers[0])属于直接调用函数并将返回值绑定给command,程序启动时就执行了一次setCost,之后拖动滑块不会再触发计算逻辑。- Tkinter的
Scale触发回调时,会自动将滑块当前的最新值作为第一个参数传入回调函数,原有setCost的参数设计不符合该规则。 - 同一个
IntVar同时绑定给了Scale和Label,如果直接修改这个变量的值,会导致滑块的实际数值也跟着变化,和需要展示的计算结果冲突。
解决方法
拆分滑块绑定变量和展示用变量,用lambda包装回调避免函数提前执行,修改后的参考代码如下:
from tkinter import * class NewsPaper: def __init__(self, title, pageNumber): self.title = title self.pageNumber = pageNumber newsPapers = [] newsPaper1 = NewsPaper("daily news", 52) newsPapers.append(newsPaper1) root = Tk() # 拆分两个变量:滑块绑定原始值,label绑定计算后的值 slider_var = IntVar() show_var = IntVar() def setCost(slider_val, newsPaper): # 用滑块传入的最新值计算,更新展示变量 show_var.set(int(slider_val) * newsPaper.pageNumber) Label(root, textvariable=show_var).pack() # 用lambda包装回调,接收Scale自动传入的滑块值,再传给setCost Scale(root, from_=0, to=20, variable=slider_var, command=lambda val: setCost(val, newsPapers[0])).pack() root.mainloop()
修改后拖动滑块即可正常展示滑块值乘以报纸页数的计算结果。
内容的提问来源于stack exchange,提问作者Gobhniu
相关产品推荐
相关产品推荐

