方案简介:
给每一张图片新建一个画布,并且引用画布去存放PhotoImage图片,可以成功显示每张图片。
实际操作:
1、创建一个tkinter窗口,导入图片到列表。
import tkinter as tkfrom PIL import Image, ImageTkimport os""" 从文件夹内导入图片名称列表 """imgNameList = os.listdir("./素材/拼图")for i in imgNameList:if 'png' not in i:imgNameList.remove(i)#筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)window = tk.Tk()window.geometry("900x200")window.mainloop()
2、创建自定义函数:每运行一次函数,都新建一个画布+一张照片,也就是说画面中有十张照片,那么就有十张画布,每张照片都属于自己的画布。
def load_image(x, y, imgName):canvas = tk.Canvas(window, width=100, height=100)canvas.place(x=x, y=y)#注意此处canvas的xy位置是自定义函数的形参photo = Image.open("./素材/拼图/"+imgName).resize((100,100))canvas.photo = ImageTk.PhotoImage(photo)tk.Label(canvas, image=canvas.photo).place(x=0, y=0)#注意此处图片控件的xy位置是0
第5~7行,在photo变量open完图片路径之后,需要进行PhotoImage的操作,将photo引用在canvas身上,只要有canvas在,那么photo的引用就一直在canvas身上(此句话摘抄网上教程,待深度理解),之后进行create_image的时候,调用的也是canvas.photo变量。
为什么如注释所说,第3行画布的xy位置是自定义函数的形参,而第7行图片的xy位置是0呢?
因为,我们之前说了要每一张图片都有一个画布,如下方示意图:
所以每一张画布的位置要根据自定义函数的形参来定。
那么又为什么图片的xy位置是0呢?图片不是显示在不同的地方吗?
因为图片在定义的时候,归属于自己的画布(代码第7行),比如图片3属于画布3,那么图片的xy位置坐标系是根据它属于的画布定的,而不是window窗口了。图片在window窗口中可能是在不同的位置,但每一张图片相对于自己属于的画布的,都在x=0、y=0的位置,所以每一张图片xy位置应该都是0。
3、最后循环遍历存放图片的列表,去依次显示全部的图片。
for i in range(len(imgNameList)):load_image(100*i, 50, imgNameList[i])#循环调用显示图片函数,每一张图片位置隔开100
4、最终代码+效果参考。
import tkinter as tkfrom PIL import Image, ImageTkimport osimgNameList = os.listdir("./素材/拼图")for i in imgNameList:if 'png' not in i:imgNameList.remove(i)# 筛选删除列表中不是png格式的文件(mac系统会自动创建.Dstore隐藏文件)def load_image(x, y, imgName):canvas = tk.Canvas(window, width=100, height=100)canvas.place(x=x, y=y)# 注意此处canvas的xy位置是自定义函数的形参photo = Image.open("./素材/拼图/" + imgName).resize((100, 100))canvas.photo = ImageTk.PhotoImage(photo)tk.Label(canvas, image=canvas.photo).place(x=0, y=0)# 注意此处图片控件的xy位置是0window = tk.Tk()window.geometry("900x200")for i in range(len(imgNameList)):load_image(100*i, 50, imgNameList[i])#循环调用显示图片函数,每一张图片位置隔开100window.mainloop()

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