Python tkinter之PhotoImage图片显示问题 | 您所在的位置:网站首页 › tkinter程序在python文件中关闭后以后就不弹出来了 › Python tkinter之PhotoImage图片显示问题 |
作为Python小白的你,有没有遇到过这几个问题? PhotoImage不支持jpg等图片格式;将PhotoImage放在函数里图片不显示;循环加入图片只显示一张;这些难倒了一大批小白,那么接下来,本文教你如何解决这些问题。 . . 【2021-09-03更】本篇内容太糟,于是写了片新文章。点击前往 . . . 为了解决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() |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |