.
.

为了解决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)

python照片修复 python photoimage_全局变量

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()函数第一行

python照片修复 python photoimage_Image_02


此时,运行代码已经没有问题了。还有一种解决方法:将imgphoto移到函数外面,看代码:

python照片修复 python photoimage_python照片修复_03


将它移到外面:

python照片修复 python photoimage_全局变量_04

global一样,能显示图片了。

python照片修复 python photoimage_python_05

可是,问题又来了!

我要是循环加入图片呢?
前面说过,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()

显示结果:

python照片修复 python photoimage_全局变量_06

明明给了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()

看出什么端倪了吗?

显示结果:

python照片修复 python photoimage_Image_07

--------------公布答案:

原代码:

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()