方案简介:
此方法将经过ImageTk.PhotoImage之后的图片对象放入字典中存储,再调用,可以解决垃圾回收问题。
实际操作:
1、从文件夹导入多张图片,创建tkinter窗口+画布。
import tkinter as tk
from PIL import Image, ImageTk
import 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 = 50
imgY = 100
for 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 = 50
imgY = 100
imgNameDic = {}
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 tk
from PIL import Image, ImageTk
import 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
#用来存放图片对象的字典,一定要进行global
imgX = 50
imgY = 100
imgNameDic = {}
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
load_image()
window.mainloop()
代码+素材文件:Show PhotoList (3).zip