方案简介:
此方法将经过ImageTk.PhotoImage之后的图片对象放入字典中存储,再调用,可以解决垃圾回收问题。
实际操作:
1、从文件夹导入多张图片,创建tkinter窗口+画布。
import tkinter as tkfrom PIL import Image, ImageTkimport os""" 从文件夹内导入图片名称列表 """imageNameList = os.listdir("./素材/拼图/")for i in imageNameList:if 'png' not in i:imageNameList.remove(i)# 筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)""" 创建窗口和画布 """window = tk.Tk()window.geometry("900x200")window.title("Test")canvas = tk.Canvas(window, width=1000, height=200)canvas.pack()window.mainloop()
2、循环便遍历图片名称列表,进行Image.open和ImageTk.PhotoImage两次操作,但会遇到显示不出来的问题。
imgX = 50imgY = 100for i in range(len(imageNameList)):img = Image.open("./素材/拼图/" + imageNameList[i]).resize((80,80))#先进行针对图片路径的Image.open操作,改到合适大小img = ImageTk.PhotoImage(img)#再进行ImageTk.PhotoImage操作canvas.create_image(imgX, imgY, image=img)imgX += 100
3、我们在进行完两次操作后,在create_image之前,先把图片对象存放到字典中,再进行显示(重要步骤第10~11行)。
如果此代码需要封装成自定义函数,则需要global存放图片对象的字典。
imgX = 50imgY = 100imgNameDic = {}for i in range(len(imageNameList)):img = Image.open("./素材/拼图/" + imageNameList[i]).resize((80,80))#先进行针对图片路径的Image.open操作,改到合适大小img = ImageTk.PhotoImage(img)#再进行ImageTk.PhotoImage操作imgNameDic["img" + str(i)] = img#此步骤非常重要,将图片存放到字典中,键为“img0”,值为img对象canvas.create_image(imgX, imgY, image=img)imgX += 100
4、最终代码+效果参考。
import tkinter as tkfrom PIL import Image, ImageTkimport os""" 从文件夹内导入图片名称列表 """imageNameList = os.listdir("./素材/拼图/")for i in imageNameList:if 'png' not in i:imageNameList.remove(i)# 筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)""" 创建窗口和画布 """window = tk.Tk()window.geometry("900x200")window.title("Test")canvas = tk.Canvas(window, width=1000, height=200)canvas.pack()""" 读取图片,存放字典,显示 """def load_image():global imgNameDic#用来存放图片对象的字典,一定要进行globalimgX = 50imgY = 100imgNameDic = {}for i in range(len(imageNameList)):img = Image.open("./素材/拼图/" + imageNameList[i]).resize((80,80))# 先进行针对图片路径的Image.open操作,改到合适大小img = ImageTk.PhotoImage(img)# 再进行ImageTk.PhotoImage操作imgNameDic["img" + str(i)] = img# 此步骤非常重要,将图片存放到字典中,键为“img0”,值为img对象canvas.create_image(imgX, imgY, image=img)imgX += 100load_image()window.mainloop()

代码+素材文件:Show PhotoList (3).zip
