Tkinter网格布局下Frame添加图片不显示问题求助
解决Tkinter中Label无法显示图片的问题
嘿,我一眼就看出问题所在啦——这是Tkinter + PIL组合里超常见的垃圾回收陷阱!
你的代码里,img = ImageTk.PhotoImage(Image.open('Hercu.jpg'))是__init__方法里的局部变量。当__init__执行完毕后,Python会自动回收这个不再被引用的变量,导致Label里的图片失去了数据源,自然就显示不出来了。另外我还发现两个小问题:一是你导入ttk的方式错了,二是calc方法里找不到label_frame变量,也得一起修正。
具体修正步骤:
- 修正ttk导入:把
import tkinter as ttk改成from tkinter import ttk,不然你的ttk组件调用会报错。 - 保存图片引用到实例:把
img赋值给self.img,让实例对象持有这个引用,避免被垃圾回收。 - 将label_frame设为实例属性:这样
calc方法里才能访问到它,创建的结果标签才能正确显示。
修正后的完整代码:
import tkinter as tk from tkinter import ttk from PIL import ImageTk, Image class Calc(tk.Tk): def __init__(self,*args,**kwargs): tk.Tk.__init__(self,*args,**kwargs) tk.Tk.iconbitmap(self,default='smile.ico') tk.Tk.wm_title(self,"Name") frame = tk.Frame(self,width = 50,height = 50,pady =3) frame.grid(row=0,column=0) # 将label_frame改为实例属性 self.label_frame = ttk.LabelFrame(self,text = "Calculator",width = 50,height = 100) self.label_frame.grid(row=3, column=0, columnspan=2, rowspan=10, \ sticky='NS', padx=5, pady=5) # Image Logo - 保存引用到self self.img = ImageTk.PhotoImage(Image.open('Hercu.jpg')) panel = tk.Label(frame,image = self.img, width = 50, height = 50) panel.grid(row=0,column=0) text1 = ttk.Entry(self.label_frame) text1.grid(row=1,column=1) label1 = ttk.Label(self.label_frame,text = 'Number of Windows') label1.grid(row=1,column=2,sticky='w') text2 = ttk.Entry(self.label_frame) text2.grid(row=2,column=1) label2 = ttk.Label(self.label_frame,text = 'Number of Doors') label2.grid(row=2,column=2,sticky='w') text3 = ttk.Entry(self.label_frame) text3.grid(row=3,column=1) label3 = ttk.Label(self.label_frame,text = 'Number of Shear Walls') label3.grid(row=3,column=2,sticky='w') text4 = ttk.Entry(self.label_frame) text4.grid(row=4,column=1) label4 = ttk.Label(self.label_frame,text = 'Plate Height') label4.grid(row=4,column=2,sticky='w') text5 = ttk.Entry(self.label_frame) text5.grid(row=5,column=1) label5 = ttk.Label(self.label_frame,text = 'Laminated') label5.grid(row=5,column=2,sticky='w') text6 = ttk.Entry(self.label_frame) text6.grid(row=6,column=1) label6 = ttk.Label(self.label_frame,text = 'Painted') label6.grid(row=6,column=2,sticky='w') text7 = ttk.Entry(self.label_frame) text7.grid(row=7,column=1) label7 = ttk.Label(self.label_frame,text = 'Number of Billets') label7.grid(row=7,column=2,sticky='w') text8 = ttk.Entry(self.label_frame) text8.grid(row=8,column=1) label8 = ttk.Label(self.label_frame,text = 'Number of Pallets') label8.grid(row=8,column=2,sticky='w') text9 = ttk.Entry(self.label_frame) text9.grid(row=9,column=1) label9 = ttk.Label(self.label_frame,text = 'Divising Walls') label9.grid(row=9,column=2,sticky='w') total_prod = ttk.Label(self.label_frame,text = '') total_prod.grid(row=10,column = 1) total_prod_label = ttk.Label(self.label_frame,text= 'Total Production Time') total_prod_label.grid(row=10,column=2,sticky='w') calcButton = ttk.Button(self.label_frame,text = 'Calculate',command = self.calc) calcButton.grid(row=11,column=1) def calc(self): total = 'Hey' # 使用self.label_frame访问容器 label10 = ttk.Label(self.label_frame,text= total) label10.grid(row=11,column = 2) app = Calc() app.mainloop()
额外注意事项:
- 确保
Hercu.jpg和你的脚本在同一个文件夹里,或者使用完整的绝对路径(比如C:/images/Hercu.jpg)。 - 如果图片尺寸太大,你可以用
Image.open('Hercu.jpg').resize((50,50))来调整大小,和Label的尺寸匹配。
内容的提问来源于stack exchange,提问作者Losercoder2345
相关产品推荐
相关产品推荐

