方案简介:
给每一张图片新建一个画布,并且引用画布去存放PhotoImage图片,可以成功显示每张图片。
实际操作:
1、创建一个tkinter窗口,导入图片到列表。
import tkinter as tk
from PIL import Image, ImageTk
import 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 tk
from PIL import Image, ImageTk
import os
imgNameList = 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位置是0
window = tk.Tk()
window.geometry("900x200")
for i in range(len(imgNameList)):
load_image(100*i, 50, imgNameList[i])
#循环调用显示图片函数,每一张图片位置隔开100
window.mainloop()
代码+素材文件:Show PhotoList (1).zip