如何使用Pillow在Tkinter GUI中正常显示PNG图片
问题根因
你的代码有两个核心逻辑缺失,导致图片无法显示:
- 加载完图片资源后,没有创建用于展示图片的控件,也没有把控件通过布局管理器添加到窗口中,相当于图片只存在于内存里,根本没有被渲染到界面上。
ImageTk.PhotoImage生成的图片对象如果没有被持久持有引用,会被Python的垃圾回收机制自动回收,哪怕你把控件加上了,最终也只会显示空白区域。
修复方案
在原有代码基础上补全图片控件创建、引用持有、布局挂载三步即可,修复后的完整代码如下:
from tkinter import * from PIL import ImageTk, Image w = 650 p = 470 x = (w/2) - (w/2) y = (w/2) - (p/2) def fourthWindowFunction(): fourthWindow = Tk() fourthWindow.title("TED") fourthWindowTitle = Label(fourthWindow, text="Resultados") fourthWindowTitle.grid(column=1, row=0, padx=10, pady=10) image = Image.open(r"c:\users\tomas\deformada.png") # 如果图片尺寸过大超出窗口,可以放开下面这行调整尺寸适配 # image = image.resize((400, 300)) display = ImageTk.PhotoImage(image) # 创建承载图片的标签控件 image_label = Label(fourthWindow, image=display) # 持有图片对象引用,防止被垃圾回收 image_label.image = display # 把控件放到窗口布局中 image_label.grid(column=1, row=1, padx=10, pady=10) generatePDF = Button(fourthWindow, text="Gerar Relatório PDF", command=None) generatePDF.grid(column=0, row=9, padx=10, pady=10) exit = Button(fourthWindow, text="Sair", command=quit) exit.grid(column=2, row=9, padx=10, pady=10) fourthWindow.geometry('%dx%d+%d+%d' % (w, p, x, y)) fourthWindow.mainloop() fourthWindowFunction()
额外说明
- Tkinter 不推荐在一个程序中创建多个
Tk()根窗口,如果后续需要多窗口,建议用Toplevel()控件实现,避免出现消息循环、资源引用相关的异常。 - 如果图片显示不全,直接调用Pillow的
resize()方法把图片调整到适配窗口的尺寸即可。
内容的提问来源于stack exchange,提问作者amotoli
相关产品推荐
相关产品推荐

