方案简介:
    此方法将经过ImageTk.PhotoImage之后的图片对象放入字典中存储,再调用,可以解决垃圾回收问题。

    实际操作:
    1、从文件夹导入多张图片,创建tkinter窗口+画布。

    1. import tkinter as tk
    2. from PIL import Image, ImageTk
    3. import os
    4. """ 从文件夹内导入图片名称列表 """
    5. imageNameList = os.listdir("./素材/拼图/")
    6. for i in imageNameList:
    7. if 'png' not in i:
    8. imageNameList.remove(i)
    9. # 筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)
    10. """ 创建窗口和画布 """
    11. window = tk.Tk()
    12. window.geometry("900x200")
    13. window.title("Test")
    14. canvas = tk.Canvas(window, width=1000, height=200)
    15. canvas.pack()
    16. window.mainloop()

    2、循环便遍历图片名称列表,进行Image.open和ImageTk.PhotoImage两次操作,但会遇到显示不出来的问题。

    1. imgX = 50
    2. imgY = 100
    3. for i in range(len(imageNameList)):
    4. img = Image.open("./素材/拼图/" + imageNameList[i]).resize((80,80))
    5. #先进行针对图片路径的Image.open操作,改到合适大小
    6. img = ImageTk.PhotoImage(img)
    7. #再进行ImageTk.PhotoImage操作
    8. canvas.create_image(imgX, imgY, image=img)
    9. imgX += 100

    3、我们在进行完两次操作后,在create_image之前,先把图片对象存放到字典中,再进行显示(重要步骤第10~11行)。
    如果此代码需要封装成自定义函数,则需要global存放图片对象的字典。

    1. imgX = 50
    2. imgY = 100
    3. imgNameDic = {}
    4. for i in range(len(imageNameList)):
    5. img = Image.open("./素材/拼图/" + imageNameList[i]).resize((80,80))
    6. #先进行针对图片路径的Image.open操作,改到合适大小
    7. img = ImageTk.PhotoImage(img)
    8. #再进行ImageTk.PhotoImage操作
    9. imgNameDic["img" + str(i)] = img
    10. #此步骤非常重要,将图片存放到字典中,键为“img0”,值为img对象
    11. canvas.create_image(imgX, imgY, image=img)
    12. imgX += 100

    4、最终代码+效果参考。

    1. import tkinter as tk
    2. from PIL import Image, ImageTk
    3. import os
    4. """ 从文件夹内导入图片名称列表 """
    5. imageNameList = os.listdir("./素材/拼图/")
    6. for i in imageNameList:
    7. if 'png' not in i:
    8. imageNameList.remove(i)
    9. # 筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)
    10. """ 创建窗口和画布 """
    11. window = tk.Tk()
    12. window.geometry("900x200")
    13. window.title("Test")
    14. canvas = tk.Canvas(window, width=1000, height=200)
    15. canvas.pack()
    16. """ 读取图片,存放字典,显示 """
    17. def load_image():
    18. global imgNameDic
    19. #用来存放图片对象的字典,一定要进行global
    20. imgX = 50
    21. imgY = 100
    22. imgNameDic = {}
    23. for i in range(len(imageNameList)):
    24. img = Image.open("./素材/拼图/" + imageNameList[i]).resize((80,80))
    25. # 先进行针对图片路径的Image.open操作,改到合适大小
    26. img = ImageTk.PhotoImage(img)
    27. # 再进行ImageTk.PhotoImage操作
    28. imgNameDic["img" + str(i)] = img
    29. # 此步骤非常重要,将图片存放到字典中,键为“img0”,值为img对象
    30. canvas.create_image(imgX, imgY, image=img)
    31. imgX += 100
    32. load_image()
    33. window.mainloop()

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