当使用 tkinter 更新小部件中的值时,屏幕上会出现旧小部件状态的痕迹,我想知道是否对此有任何修复。我假设 tkinter 只是重新绘制它需要的任何内容,而不是更新旧小部件/旧小部件的状态。下面是最小的可重复示例。
from tkinter import *
from tkinter.ttk import *
window=Tk()
ttk.Style().configure("Info.TLabel",foreground="white", background="#1e2124",relief="sunken")
def update_label(currvar):
current_var_levels = current_var.get()
var_label=ttk.Label(window,text=f'{current_var_levels}'+'%',style="Info.TLabel")
var_label.grid(row=0,column=1)
current_var=IntVar()
scale_bar = ttk.Scale(window, from_=0, to=100, length=200, variable=current_var, command=update_label)
current_var.set(100)
scale_bar.grid(row=0,column=0)
# Initialize scale's display label. Works without this, but it shows everything from the start
var_label=ttk.Label(window,text=f'{current_var.get()}'+'%',style="Info.TLabel")
var_label.grid(row=0,column=1)
window.mainloop()
我尝试过
conf_label.grid_forget()
,然后在更新功能上重新网格化它,但这不起作用。我还尝试过制作两个单独的标签(全局/本地),尽管我可能思考得太线性了。我想我正在寻找“屏幕刷新”,但我不知道它是什么样的。在没有前景色/背景色,甚至完全没有浮雕的情况下也会发生这种情况;从标签中删除样式配置和样式分配仍然会留下一小部分 %
可见,如果当前值为两位数,则为 1 部分,如果为一位数,则为 2 部分。一个可行的错误是通过用空格填充来强制长度,但这是一个很好的学习机会。感谢您的阅读!
tkinter
不会删除旧的 Label
,但会将新的 Label
放在旧的 Label
之上 - 所以你在一个地方有两个标签。
您可以使用
grid_forget()
或 destroy()
删除旧的 Label
- 但这需要将 var_label
保留为 global
变量。
或者您应该仅创建
Label
一次,然后替换现有 Label
中的文本
def update_label(currvar):
current_var_levels = current_var.get()
#current_var_levels = int(float(currvar))
var_label.config(text=f'{current_var_levels}%') # replace text
#var_label['text'] = f'{current_var_levels}%') # replace text