You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter网格布局下Frame添加图片不显示问题求助

解决Tkinter中Label无法显示图片的问题

嘿,我一眼就看出问题所在啦——这是Tkinter + PIL组合里超常见的垃圾回收陷阱!

你的代码里,img = ImageTk.PhotoImage(Image.open('Hercu.jpg'))是__init__方法里的局部变量。当__init__执行完毕后,Python会自动回收这个不再被引用的变量,导致Label里的图片失去了数据源,自然就显示不出来了。另外我还发现两个小问题:一是你导入ttk的方式错了,二是calc方法里找不到label_frame变量,也得一起修正。

具体修正步骤:

  1. 修正ttk导入:把import tkinter as ttk改成from tkinter import ttk,不然你的ttk组件调用会报错。
  2. 保存图片引用到实例:把img赋值给self.img,让实例对象持有这个引用,避免被垃圾回收。
  3. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:59:54