如何在Tkinter中更新已有Label的背景色等属性而非新建组件
问题原因
- 每次调用
display()方法都会重复创建新的Label组件叠加在原有位置,不会复用旧组件 - 创建Label时直接链式调用
.grid()方法,由于grid()返回值为None,你无法通过变量获取到已创建的Label实例,自然无法修改原有组件属性
修改方案
我们新增一个字典存储所有已创建的Label实例,首次渲染时创建组件并存入字典,后续更新时直接从字典中取出对应实例修改属性即可,不需要重新调用display()新建组件。
完整修改后代码
from tkinter import * class Information(): def __init__(self, master): self.master = master self.load_dict_label() # 新增字典存储已创建的Label实例,键和配置字典的键保持一致 self.label_dict = {} self.display() def display(self): for key in self.location_and_condition_label: cfg = self.location_and_condition_label[key] if key not in self.label_dict: # 首次调用时创建Label,拆分创建和grid调用,保存Label实例 lb = Label(self.master, font=("Courier", 14), text=cfg["text"], bg=cfg["color"]) lb.grid(row=cfg["row"], column=cfg["column"], padx=5, pady=5) self.label_dict[key] = lb else: # 已存在的组件直接更新属性,不会新建 self.label_dict[key].config(text=cfg["text"], bg=cfg["color"]) def load_dict_label(self): color = "red" self.location_and_condition_label = { "0000": {"column": 0, "row": 0, "text": "5:00", "color": color}, "0001": {"column": 1, "row": 0, "text": "Getting up", "color": color}, "0002": {"column": 2, "row": 0, "text": "Wash face", "color": color}, "0003": {"column": 3, "row": 0, "text": "Get dress", "color": color}, "0004": {"column": 0, "row": 1, "text": "6:00", "color": color}, "0005": {"column": 1, "row": 1, "text": "Drink coffee", "color": color}, "0006": {"column": 2, "row": 1, "text": "Read newspaper", "color": color}, "0007": {"column": 0, "row": 2, "text": "7:00", "color": color}, "0008": {"column": 1, "row": 2, "text": "Turn on tv", "color": color}, "0009": {"column": 2, "row": 2, "text": "Drink coffee", "color": color}, "0010": {"column": 3, "row": 2, "text": "Wake the child", "color": color}, "0011": {"column": 4, "row": 2, "text": "Organize the\n child", "color": color}, "0012": {"column": 5, "row": 2, "text": "Make us \nbreakfast", "color": color}, "0013": {"column": 0, "row": 3, "text": "8:00", "color": color}, "0014": {"column": 1, "row": 3, "text": "To go \nto work", "color": color}, "0015": {"column": 2, "row": 3, "text": "Say hello to\neveryone", "color": color}, "0016": {"column": 0, "row": 4, "text": "9:00", "color": color}, "0017": {"column": 1, "row": 4, "text": "Make a morning\ncall", "color": color}, "0018": {"column": 2, "row": 4, "text": "Start working", "color": color}, "0019": {"column": 3, "row": 4, "text": "Drink coffee", "color": color} } def update_label(self): # 更新配置字典 self.location_and_condition_label["0010"]["color"] = "green" # 直接修改已有Label的背景色,不需要新建组件 self.label_dict["0010"].config(bg="green") # 如果有批量修改多个Label的需求,也可以直接调用self.display(),不会重复创建组件 class MainPanel(): def __init__(self, master): self._master = master self._master.configure(background="#929591") self._nformation = Information(self._master) self.running = True def run(self): if self.running == True: self._nformation.update_label() # 修改一次后把running设为False,避免重复触发更新 self.running = False # 优化回调引用,避免依赖全局app变量 self._master.after(5000, self.run) if __name__ == "__main__": root = Tk() app = MainPanel(root) root.after(5000, app.run) root.mainloop()
内容的提问来源于stack exchange,提问作者Yovel
相关产品推荐
相关产品推荐

