方案简介:
    给每一张图片新建一个画布,并且引用画布去存放PhotoImage图片,可以成功显示每张图片。

    实际操作:
    1、创建一个tkinter窗口,导入图片到列表。

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

    2、创建自定义函数:每运行一次函数,都新建一个画布+一张照片,也就是说画面中有十张照片,那么就有十张画布,每张照片都属于自己的画布。

    1. def load_image(x, y, imgName):
    2. canvas = tk.Canvas(window, width=100, height=100)
    3. canvas.place(x=x, y=y)
    4. #注意此处canvas的xy位置是自定义函数的形参
    5. photo = Image.open("./素材/拼图/"+imgName).resize((100,100))
    6. canvas.photo = ImageTk.PhotoImage(photo)
    7. tk.Label(canvas, image=canvas.photo).place(x=0, y=0)
    8. #注意此处图片控件的xy位置是0

    第5~7行,在photo变量open完图片路径之后,需要进行PhotoImage的操作,将photo引用在canvas身上,只要有canvas在,那么photo的引用就一直在canvas身上此句话摘抄网上教程,待深度理解),之后进行create_image的时候,调用的也是canvas.photo变量。
    为什么如注释所说,第3行画布的xy位置是自定义函数的形参,而第7行图片的xy位置是0呢?
    因为,我们之前说了要每一张图片都有一个画布,如下方示意图:
    方案三:引用画布canvas.photo - 图1
    所以每一张画布的位置要根据自定义函数的形参来定。
    那么又为什么图片的xy位置是0呢?图片不是显示在不同的地方吗?
    因为图片在定义的时候,归属于自己的画布(代码第7行),比如图片3属于画布3,那么图片的xy位置坐标系是根据它属于的画布定的,而不是window窗口了。图片在window窗口中可能是在不同的位置,但每一张图片相对于自己属于的画布的,都在x=0、y=0的位置,所以每一张图片xy位置应该都是0。

    3、最后循环遍历存放图片的列表,去依次显示全部的图片。

    1. for i in range(len(imgNameList)):
    2. load_image(100*i, 50, imgNameList[i])
    3. #循环调用显示图片函数,每一张图片位置隔开100

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

    1. import tkinter as tk
    2. from PIL import Image, ImageTk
    3. import os
    4. imgNameList = os.listdir("./素材/拼图")
    5. for i in imgNameList:
    6. if 'png' not in i:
    7. imgNameList.remove(i)
    8. # 筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)
    9. def load_image(x, y, imgName):
    10. canvas = tk.Canvas(window, width=100, height=100)
    11. canvas.place(x=x, y=y)
    12. # 注意此处canvas的xy位置是自定义函数的形参
    13. photo = Image.open("./素材/拼图/" + imgName).resize((100, 100))
    14. canvas.photo = ImageTk.PhotoImage(photo)
    15. tk.Label(canvas, image=canvas.photo).place(x=0, y=0)
    16. # 注意此处图片控件的xy位置是0
    17. window = tk.Tk()
    18. window.geometry("900x200")
    19. for i in range(len(imgNameList)):
    20. load_image(100*i, 50, imgNameList[i])
    21. #循环调用显示图片函数,每一张图片位置隔开100
    22. window.mainloop()

    截屏2022-05-23 11.58.57.png
    代码+素材文件:Show PhotoList (1).zip