如何通过类实现TKinter Label图片更新(使用Config()方法动态更新)
代码修复方案
你的代码存在几处典型错误,修正后即可正常更新Label图片:
错误点说明
- 组件实例与布局方法链式调用:
ttk.Label(...).grid()的写法中,grid()返回值为None,因此self.red_smiley_1这类属性实际存储的是空值,无法后续调用configure方法。需要先创建组件实例赋值给属性,再单独调用布局方法。 - 方法缩进错误:
change_row_one方法当前缩进在__init__方法内部,不属于CubeFrame的实例方法,按钮绑定命令时会找不到该方法。需要调整缩进至和__init__同级。 - 变量名拼写错误:定义的Label属性名为
self.red_smiley_1,方法内调用时写为self.red_smile_1,拼写不一致会触发属性不存在报错。 - 图片加载冗余:初始化时已经将白表情加载到
self.white_smiley实例属性中,不需要在方法内重复打开图片文件,直接复用即可。
修正后完整代码
import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk class Cube(tk.Tk): def __init__(self): super().__init__() self.title("John's GUI Cube Application") self.geometry("300x180") self.resizable(True,True) container = ttk.Frame(self) container.grid(padx=10,pady=10,sticky='EW') # 拆分组件创建和布局调用 cube_frame = CubeFrame(container) cube_frame.grid(row=0,column=0,sticky='NSEW') class CubeFrame(ttk.Frame): def __init__(self,container): super().__init__(container) self.red_smiley = ImageTk.PhotoImage(Image.open('./images/red_smile.png')) self.white_smiley = ImageTk.PhotoImage(Image.open('./images/white_smile.png')) self.yellow_smiley = ImageTk.PhotoImage(Image.open('./images/yellow_smile.png')) # 拆分Label创建和布局调用 self.red_smiley_1 = ttk.Label(self,image=self.red_smiley) self.red_smiley_1.grid(row=0,column=0) self.red_smiley_2 = ttk.Label(self,image=self.red_smiley) self.red_smiley_2.grid(row=0,column=1) self.red_smiley_3 = ttk.Label(self,image=self.red_smiley) self.red_smiley_3.grid(row=0,column=2) # 拆分Button创建和布局调用 self.row_one_button = ttk.Button(self,text='Change Row 1',command=self.change_row_one) self.row_one_button.grid(row=0,column=3,sticky='WE') self.row_two_button = ttk.Button(self,text='Change Row 2',command=self.change_row_two) self.row_two_button.grid(row=1,column=3,sticky='WE') self.row_three_button = ttk.Button(self,text='Change Row 3',command=self.change_row_three) self.row_three_button.grid(row=2,column=3,sticky='WE') # 调整缩进至和__init__同级,修正方法逻辑 def change_row_one(self): # 直接复用预加载的图片,修正变量名拼写 self.red_smiley_1.configure(image=self.white_smiley) # 保持图片引用避免被GC回收 self.red_smiley_1.image = self.white_smiley # 其余两个方法按相同逻辑补充即可 def change_row_two(self): pass def change_row_three(self): pass if __name__ == "__main__": app = Cube() app.mainloop()
内容的提问来源于stack exchange,提问作者YohanCho
相关产品推荐
相关产品推荐

