.
.
为了解决
PhotoImage
不支持jpg
等格式问题,可以使用Image
+ImageTk
实现多种格式图片的载入。
from PIL import Image, ImageTk
img = Image.open('1.jpg')
photo = ImageTk.PhotoImage(img)
tk.Label(paned, image=photo).grid(row=0, column=0)
jpg
格式显示已经大功告成!心动的赶紧去试试吧!
.
.
.
那么第一个问题解决了,来看第二个问题:
将
PhotoImage
放在函数里图片不显示
先上代码:
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
def load_img():
img = Image.open('1.jpg')
photo = ImageTk.PhotoImage(img)
tk.Label(root, image=photo).grid(row=0, column=0)
load_img()
root.mainloop()
运行代码,图片确实不见了,究竟是怎么回事?
其实load_img()
调用结束后photo
就被回收了。
我们可以将photo
设为全局变量:
global photo
,注意看load_img()
函数第一行
此时,运行代码已经没有问题了。还有一种解决方法:将img
和photo
移到函数外面,看代码:
将它移到外面:
跟global
一样,能显示图片了。
可是,问题又来了!
我要是循环加入图片呢?
前面说过,load_img()
调用后会回收,所以,循环时每次加入的图片都会换掉上一次的图片,即使给photo
设为全局变量,它也会如此。
这就是第三个问题了:
循环加入图片只显示最后一张;
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.wm_geometry("530x150+500+300")
root.resizable(0, 0)
imgs = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']
def load_img(index,path):
global photo
paned = tk.PanedWindow(root)
paned.pack(fill=tk.X, side=tk.LEFT)
img = Image.open(path)
photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小
tk.Label(paned, image=photo).grid(row=index, column=0)
for i in range(len(imgs)):
load_img(i,imgs[i])
root.mainloop()
显示结果:
明明给了5张图片,为什么显示最后一张?怎么解决呢?
办法就是给它一个引用!也就是为photo
设一个引用,这时就不用给photo
设为全局变量了。
接下来改进代码:
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.wm_geometry("530x150+500+300")
root.resizable(0, 0)
imgs = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']
def load_img(index,path):
paned = tk.PanedWindow(root)
paned.pack(fill=tk.X, side=tk.LEFT)
img = Image.open(path)
paned.photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小
tk.Label(paned, image=paned.photo).grid(row=index, column=0)
for i in range(len(imgs)):
load_img(i,imgs[i])
root.mainloop()
看出什么端倪了吗?
显示结果:
--------------公布答案:
原代码:
photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小
tk.Label(paned, image=photo).grid(row=index, column=0)
将photo
修改成paned.photo
。
paned.photo = ImageTk.PhotoImage(img.resize((100, 130))) # 改变图片显示大小
tk.Label(paned, image=paned.photo).grid(row=index, column=0)
这时,photo
的引用在paned
身上。
这就是为什么要创建PanedWindow
的原因,为了能够明白,可以理解成这样:
只要有
paned
在,那么photo
的引用就一直在paned
身上
这样所有图片都会显示啦!
那么,PhotoImage图片显示问题就完美解决了。
献上完整代码:
#!/usr/bin/python3
# coding=utf-8
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.wm_geometry("530x150+500+300")
root.resizable(0, 0)
imgs = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']
def load_img(index,path):
paned = tk.PanedWindow(root)
paned.pack(fill=tk.X, side=tk.LEFT)
img = Image.open(path)
paned.photo = ImageTk.PhotoImage(img.resize((100, 130)))
tk.Label(paned, image=paned.photo).grid(row=index, column=0)
for i in range(len(imgs)):
load_img(i,imgs[i])
root.mainloop()