Python tkinter之PhotoImage图片显示问题

article/2025/7/28 10:18:10

作为Python小白的你,有没有遇到过这几个问题?

  1. PhotoImage不支持jpg等图片格式;
  2. PhotoImage放在函数里图片不显示;
  3. 循环加入图片只显示一张;

这些难倒了一大批小白,那么接下来,本文教你如何解决这些问题。
.
.

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

photo设为全局变量
此时,运行代码已经没有问题了。

还有一种解决方法:将imgphoto移到函数外面,看代码:
img、photo在函数里面
将它移到外面:
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 photopaned = 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()

http://chatgpt.dhexx.cn/article/jvhT3dTM.shtml

相关文章

python图显示在新的窗口_python在新的图片窗口显示图片(图像)的方法

python在新的图片窗口显示图片(图像)的方法 使用python画图,发现生成的图片在console里。不仅感觉很别扭,很多功能也没法实现(比如希望在一幅图里画两条曲线)。 想像matlab一样单独地生成一个图片窗口,然后我在网上找了一个多小时,都没有找到想要的,要么仅仅是画图的教…

python人工智能-动态显示图片的几种办法实现

python人工智能动态显示图片 任务简介,在电脑创建一个文件加,利用代码往文件加入照片文件, 然后动态显示该文件夹中的照片,显示给用户观看,可以利用open-cv,matplotlib,PIL等技术实现 这里是电脑一个装有照…

Python 3 显示图像的方法

如果你正在寻找一个库来帮助你在 Python 中显示图像,那么你很幸运。Python 有许多不同的库可用于显示图像。三个最受欢迎的库是Pickel、Matplotlib 和 OpenCV。 到底应该选哪一个,还是看自己的个人喜好了。我喜欢并使用 OpenCV 而不是 Pillow 和 Matplot…

python显示图片_python图像显示

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 使用python进行数字图片处理,还得安装pillow包。 虽然python里面自带一个pil(python images library), 但这个库现在已经停止更新了,所以使用pillow, 它是由p…

python显示图片

python显示图片两种方法 1.利用Pillow包 未安装的可以通过pip install Pillow安装 from PIL import Image img Image.open(notMNIST_large/A/aGFua28udHRm.png) img.show() 显示的图片如下: 2.利用matplotlib 同样可以通过pip进行安装 from PIL import Image …

使用Python查看并显示图像

今天又来写一个Python的基础用法,使用Python来显示图像,不多说,代码如下: import matplotlib.pyplot as plt from matplotlib.image import imreadimg imread(C:/Users/xx/Desktop/xx.jpg) plt.imshow(img)plt.show() 2022.05.1…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用

普通数码相机记录了红、绿、蓝三种波长的光,多光谱成像技术除了记录这三种波长光之外,还可以记录其他波长(例如:近红外、热红外等)光的信息。与昂贵、不易获取的高光谱、高空间分辨率卫星数据相比,中等分辨…

推扫式和快照式高光谱成像系统在红肉掺假检测中的应用

目录 摘要 推扫式高光谱成像系统的应用 快照式高光谱成像系统的应用 总结 参考文献 摘要 肉类掺假常见于用低价肉代替高价肉获取非法利益,它不但影响了食品的质量,甚至会威胁到人们的健康。目前的检测手段一般是取样后送样检测,很难实时…

不同光谱信息的图像比较

首先,我们要知道普通光学相机在自然光下拍的照片其实并不包含完整的光谱信息,一般在遥感领域,多/高光谱数据应该包含近红外波段,例如Landsat有如下波段: 编号 波长(m) 1 0.433–0.453 深蓝/紫…

双目多光谱融合_Matlab标定+OpenCV

1.标定注意事项 (1)标定板平整度 (2)棋盘格,圆(偏心误差);精度:圆>棋盘格,前提条件优化偏心误差 (3)所有标定数据加一起尽量布满整个视野 (4)左右相机采用近处标定数据分别进行单目标定,…

卫星扫描高光谱图像成像原理图

中文版高清高光谱图像卫星扫描成像原理图。 因为毕业论文需要,自己弄了个pdf高清版的。可以转成eps、svg、png等。 下面上传个截图。

【高光谱】成像基础知识

图像分类及成像原理 RGB图像遥感成像原理全色图像高光谱图像多光谱图像 RGB图像 首先提出一个问题可以通过RGB图像恢复高光谱图像吗? 一句话就是RGB图像本身就不包含高光谱的信息,自然也就无法通过图像处理从RGB图像恢复到高光谱图像。 可见普通的可见…

功能近红外光谱成像技术在神经科学领域的临床应用

类似于功能磁共振成像技术(fMRI),功能近红外光谱成像技术(fNIRS)检测大脑内血红蛋白种类的变化,但是是通过光学吸收的差异。在近红外光谱中,光可以穿透生物组织并被发色团(如氧合血红…

AOTF偏振光谱成像仪的原理及构造

偏振超光谱成像技术是一个新兴的交叉技术领域,探索该技术在航天、民用等领域的应用已经成为国内外的重点研究课题,特别是基于声光可调谐滤波器(AOTF)的光谱成像仪,与传统仪器相比,在工作机制和仪器设计上都…

基于光谱成像的柑橘黄龙病检测

目录 前言 研究现状 室内检测 室外检测 移动地面传感器平台多光谱 无人机多光谱 讨论 参考文献 前言 柑橘黄龙病(又称绿化)是一种由病原菌介导的免疫疾病,因其危害性和快速传播的特点成为影响柑橘生长的最具破坏性的疾病。由…

光谱基础知识__多光谱相关笔记_未整理

根据传感器光谱分辨率的不同,光谱成像可以分为多光谱成像、高光谱成像以及超光谱成像这三类。 多光谱成像技术主要是以物体对不同波长光线的吸收存在差异为原理,通过对目标物体在一组红外和近红外范围内特定光线波长中的光强度变化来实现检测、辨别等应…

光谱成像技术用于河北鸭梨的物理损伤检测

目录 前言 相关工作 相关工作一: 相关工作二: 本文实验 样本 实验设备 数据处理 面检测方法一 面检测方法二 结论 参考文献 前言 高光谱成像技术可以对大范围的农产品进行识别和检测,已经在工业界得到应用,取代了效率低…

光谱成像知多少

点击进入—>3D视觉工坊学习交流群 光谱成像技术是一类将成像技术和光谱技术相结合的新型多维信息获取技术,能探测获得被测目标的二维空间信息和一维光谱信息构成的数据立方体,经过数据处理能够获得不同地物的光谱曲线。 光谱成像技术分类 光谱成像技术…

2. 高光谱成像技术

图1 光谱分布示意图 注:可见光波长分布范围:380nm~780nm。红外光分为:近红外、中红外、远红外等。 一、基本概念 1、光谱(Spectrum):全称为"光学频谱",是由复色光经过色散系统&…

高光谱成像 Hyperspectral Imaging

Introduction to Hyperspectral Imaging 高光谱成像的介绍 高光谱成像指具有多光谱分辨率的数字图像,每个高光谱图像中的空间点(pixel)包含了一条连续的曲线用于记录不同波段下的光强(light intensity)。如下图所示&am…