如何在不使用Pillow的Tkinter应用中用grid布局放置图片
在Tkinter grid布局中展示PhotoImage加载的图片(无需Pillow)
问题场景
正在开发名为“Gift-wrapping with Sally”的Tkinter应用,采用grid布局组织问卷界面,已通过tkinter.PhotoImage加载了壁纸图片,但不知道后续如何编写代码将图片通过grid布局放置到界面中,且要求不使用Pillow库。相关代码片段如下:
import tkinter from tkinter import ttk window = tkinter.Tk() window.title("Gift-wrapping with Sally") frame = tkinter.Frame(window) frame.pack() ... #Wallpaper Legnth wallpaper_legnth_label = tkinter.Label(giftwrapping_frame, text= "How much wallpaper would you like? (Metres)") wallpaper_legnth_spinbox = tkinter.Spinbox(giftwrapping_frame, from_= 0.5, to= 4) wallpaper_legnth_label.grid (row= 1, column= 0) wallpaper_legnth_spinbox.grid (row= 2, column= 0) #Need to preview the two wallpaper prints to choose from wallpaper_prints = tkinter.PhotoImage(file= r"C:\Users\PycharmProjects\pythonProject14\Wallpaper Prints.png") wallpaper_prints_label = tkinter.Label
解决方案
只需完成以下3步即可实现图片的grid布局展示:
- 正确初始化
Label组件并传入加载好的图片对象 - 保留图片对象的引用,避免被Python垃圾回收机制清理
- 调用
grid()方法将Label放置到指定位置
修改后的完整代码片段如下:
# 加载壁纸图片 wallpaper_prints = tkinter.PhotoImage(file=r"C:\Users\PycharmProjects\pythonProject14\Wallpaper Prints.png") # 初始化Label组件,将图片传入image参数 wallpaper_prints_label = tkinter.Label(giftwrapping_frame, image=wallpaper_prints) # 关键:将图片对象绑定到Label的属性上,防止被垃圾回收 wallpaper_prints_label.image = wallpaper_prints # 使用grid布局放置Label,可根据界面需求调整row、column及边距参数 wallpaper_prints_label.grid(row=3, column=0, padx=10, pady=10)
关键说明
- 必须保留图片引用:Tkinter的
PhotoImage仅在有Python变量引用它时才会生效,如果没有绑定引用,即使Label组件声明使用了该图片,Python的垃圾回收也会将其清理,导致图片无法显示。 - 可灵活调整grid参数:
padx/pady用于设置图片与其他组件的间距,sticky参数可控制图片在单元格内的对齐方式(比如sticky="nsew"让图片填充单元格)。
内容的提问来源于stack exchange,提问作者bruce wayne
相关产品推荐
相关产品推荐

