根据上例切割的9宫格图片,采用Canvas及TK.PhotoImage无间距显示:
解决tkinter.PhotoImage(file='xx.gif')不能显示图片却不报错的问题,原因在于加载前原对象没有保存。
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 29 17:30:40 2019
@author: Roger Liu
"""
import tkinter as tk
import os
from PIL import Image,ImageTk #TK.PhotoImage支持的图片格式有限,可先用PIL打开通过ImageTk.PhotoImage转化为TK.PhotoImage对象
import glob
window = tk.Tk()
window.title("多图片拼接显示")
#window.geometry('1024x768')
#window.maxsize(460, 300)
#window.minsize(460, 300)
# welcom image
canvas = tk.Canvas(window, height=312, width=312)
#root,dirs,img=[ a for a in os.walk(r'.\result')][0]
#img=[os.path.join(root,i) for i in img]
img=glob.glob(r'.\result\*[1-9].png') # glob用法,实现同样功能,iglob用来生成生成器
#print(img)
image_file=[]
for ix,img_name in enumerate(img):
image_file.append(tk.PhotoImage(file=img_name))
x=ix%3
y=round((ix-x)/3)
# print(x,y)
# print(ix)
canvas.create_image(104*x, 104*y, anchor='nw', image=image_file[-1]) #此时图片还未加载,原ID对象必须存在!!!
canvas.create_line(104, 0, 104, 312,width=2,fill='gray')
canvas.create_line(208, 0, 208, 312,width=2,fill='gray')
canvas.create_line(0, 104, 312, 104,width=2,fill='gray')
canvas.create_line(0, 208, 312, 208,width=2,fill='gray')
'''
错误示范,只在右下角显示图片9,DEBUGGGGGGG
for ix,img_name in enumerate(img):
img_name=os.path.join(root,img_name)
# print(img_name)
image_file=tk.PhotoImage(file=img_name) #赋值新对象给image_file,原对象未保存
x=ix%3
y=round((ix-x)/3)
# print(x,y)
# print(ix)
print(id(image_file)) #赋新值后,原ID对象清除。
canvas.create_image(104*x, 104*y, anchor='nw', image=image_file) #此时图片还未加载
for y in range(3):
for x in range(3):
img_name=os.path.join(root,img[3*y+x])
print(img_name)
image_file = tk.PhotoImage(file=img_name) #赋值新对象给image_file,原对象未保存
canvas.create_image((104*x, 104*y), anchor='nw', image=image_file) #此时图片还未加载
#image_file1 = tk.PhotoImage(file=r'.\result\python1.png')
#image_file2 = tk.PhotoImage(file=r'.\result\python2.png')
#canvas.create_image(104*0, 104*0, anchor='nw', image=image_file1)
#canvas.create_image(104*2, 104*2, anchor='nw', image=image_file2)
'''
canvas.pack()
window.mainloop()