tkinter (ttk) 在更新小部件时留下工件

问题描述 投票:0回答:1

当使用 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 部分。一个可行的错误是通过用空格填充来强制长度,但这是一个很好的学习机会。感谢您的阅读!

python tkinter ttk ttkwidgets tkinter-label
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.