Python之解决tkinter.PhotoImage不显示图片的问题 Python3

  • 开始导航
    • 1. tkinter.PhotoImage()不支持jpg等图片格式
    • 2. 将ImageTk.PhotoImage()放在函数里图片不显示
    • 3. 循环加入多张图片却只显示一张

开始导航

作为Python小白的你,初学tkinter时,有没有遇到过一些难的问题?
例如:图片格式不支持不显示图片,等等。
本文章将教大家解决,代码尽量简洁。
(之前有写过一篇,也有好多博主都写过了,本来不想再写,但之前的内容太糟,于是决定重写一篇,希望大家会好理解一些。)
写得不好,大神请不要嘲笑,谢谢。

1. tkinter.PhotoImage()不支持jpg等图片格式

由于tkinter.PhotoImage()仅支持GIFPGM/PPM文件格式,在使用jpg等其他格式的图片时,会报“_tkinter.TclError: couldn’t recognize data in image file “img.jpg””的错误:

  • 报错代码:
import tkinterroot = tkinter.Tk()# 如下会报错:couldn't recognize data in image file "img.jpg"
# 报错翻译:无法识别图像文件“img.jpg”中的数据
photo = tkinter.PhotoImage(file="img.jpg")
tkinter.Label(master=root,image=photo).grid(row=0, column=0)root.mainloop()
  • 解决办法如下:
    1.使用PIL包的ImageImageTk模块实现多种格式图片的载入,支持30多种格式。
    2.抛弃tkinter.PhotoImage(),改用ImageTk.PhotoImage()
    注意!!!都是PhotoImage(),别理解混了。 代码如下:
import tkinter
from PIL import Image, ImageTkroot = tkinter.Tk()img = Image.open("img.jpg")  # 打开图片
photo = ImageTk.PhotoImage(img)  # 使用ImageTk的PhotoImage方法
tkinter.Label(master=root,image=photo).grid(row=0, column=0)root.mainloop()

OK啦!(但只适合用在代码量少且简单的情况下,更好的方法请看第3个问题。)

2. 将ImageTk.PhotoImage()放在函数里图片不显示

不显示图片的代码如下:

from tkinter import Tk, Label
from PIL import Image, ImageTkroot = Tk()def load_img():# 打开图片。# resize():无关紧要,示例图片太大,这里缩小一些。img = Image.open('img.jpg').resize((200, 200))photo = ImageTk.PhotoImage(img)  # 将该方法放在函数中,图片不显示# 图片用Label来显示Label(master=root, image=photo).grid(row=0, column=0)load_img()  # 执行函数root.mainloop()

运行后,图片并没有显示,究竟是怎么回事?

  • 原因:在调用load_img()函数后,垃圾回收机制会把变量photo给回收了。
  • 解决办法:使用global全局变量。如下(为了做对比,代码用图片展示):

    只需要在声明photo变量之前将它设为全局变量即可。
    注意global不要放在函数外面,否则会没效果。

3. 循环加入多张图片却只显示一张

栗子太多,只举其一叭~

from tkinter import Tk, Label
from PIL import Image, ImageTkroot = Tk()
# 总共4张图片
img_list = ["img.jpg", "img.png", "img.gif", "img.webp"]def load_img(index, item):# 打开图片。# resize():示例图片太大,这里缩小一些。img = Image.open(item).resize((200, 200))# 设全局global photophoto = ImageTk.PhotoImage(img)# 图片用Label来显示Label(master=root, image=photo).grid(row=0, column=index)# 使用for循环添加图片。enumerate:获取元素与其索引值,没啥意义,只是为了grid()显示
for index, item in enumerate(img_list):load_img(index, item)  # 执行函数root.mainloop()

显示结果:

啊!!为什么只有一张?
前面说过,垃圾回收机制会自动回收,可是,这里(第15行)明明添加了global,它却显示了最后一张,怎么办?
呵呵,阿娇:冇有使惊。解决办法这不就来了嘛!
解决办法:给他一个引用!至于什么引用,请看以下代码(注意第15、16、20行):

from tkinter import Tk, Label
from PIL import Image, ImageTkroot = Tk()
# 总共4张图片
img_list = ["img.jpg", "img.png", "img.gif", "img.webp"]def load_img(index, item):# 打开图片。# resize():示例图片太大,这里缩小一些。img = Image.open(item).resize((200, 200))# 引用:添加一个Label,用来存储图片。使用PanedWindow也行。panel = Label(master=root)panel.photo = ImageTk.PhotoImage(img)  # 将原本的变量photo改为panel.photo# 图片用Label来显示,参数master改不改为panel都行,这里就不改了。# 注意:参数image改为panel.photoLabel(master=root, image=panel.photo).grid(row=0, column=index)# 使用for循环添加图片,enumerate:获取元素与其索引值
for index, item in enumerate(img_list):load_img(index, item)  # 执行函数root.mainloop()

显示结果:

第15行的global被抛弃,变成了Label组件,为的就是给每个显示图片的Label一个引用,不至于像变量那样被回收。
同样,前面的第1、2个问题,只需要添加个引用就完美了。这样就大功告成啦。
妈妈再也不用担心内存被回收啦!奥利给!!

Python之解决tkinter.PhotoImage不显示图片的问题 Python3相关推荐

  1. tkinter Label Button 显示图片的问题解决

    在使用tkinter 中组件显示图片过程中,需要加载PIL模块进行图片处理,才能正常显示. import tkinter import os from PIL import Image,ImageTk ...

  2. Python - 如何在Tkinter窗口中显示视频预览

    from moviepy.editor import * from moviepy.video.fx.resize import resize import pygame pygame.display ...

  3. 解决tkinter.PhotoImage()仅支持gif等几种不常用的图片格式问题

    如果想用 ".jpg"文件格式,直接用下面的代码,会报"couldn't recognize data in image file "C:\Users\happ ...

  4. 关于tkinter.Canvas 不显示图片的问题

    问题描述 本想使用tkinter开发一个"蜘蛛纸牌"游戏, 但是在测试tkinter.Canvas上创建图像时却不显示图像. 测试代码如下: from tkinter import ...

  5. Python实例讲解 -- tkinter canvas (设置背景图片及文字)

    先来一个绘图: from Tkinter import *master = Tk()w = Canvas(master, width=200, height=100) w.pack()w.create ...

  6. 【python】使用plt.imshow(image)显示图片一片空白,像素值有数据

    使用pgd生成对抗样本的时候,图片显示为白色 ==================================================== 原因是在生成的过程中是使用 float,显示的时 ...

  7. 解决服务器终端无法显示图片的问题

    看了网络上比较多的解决方法,最后使用如下方法. 先使用conda install jupyternotbook 安装: 然后在本机上终端上输入ssh -N -f -L localhost:9999:l ...

  8. ionic5+angular 中 modal的ngIf报错,同时解决ngx-img-cropper组件无法显示图片的问题

    使用ionic5弹框,代码如下: const modal = await this.modalController.create({component: MyComponent,componentPr ...

  9. python无法显示动图_python,html_用Python实现的HTTP服务器无法显示图片,python,html,html5 - phpStudy...

    Hello, World!

最新文章

  1. 【C#食谱】【杭帮菜】菜单2:写一个TCP客户端
  2. Linux 文件和目录的属性及权限
  3. 纪念9.11十周年 奥巴马诵读圣经原文
  4. 分布式版本控制系统Git学习资源收集汇总
  5. 错误代码1500什么意思_啊早安打工人是什么梗???
  6. java弹出虚拟键盘_JS实现电脑虚拟键盘的操作
  7. php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...
  8. Java中序列化的好处及意义
  9. 一次Linux驱动升级的问题记录
  10. java的流套接_Java是什么原因导致网络套接字的流结束?
  11. 无法加载oracle驱动程序998,无法加载oracle in oradb10g_home2 odbc驱动程序的安装例程,因为存在系统错误代码998 解决方法...
  12. 交换机不同vlan不同网段通过核心交换机配置VLANIF通信
  13. 概要设计的必要性及写法
  14. 詹姆斯麦迪逊大学计算机专业,詹姆斯麦迪逊大学简介_詹姆斯麦迪逊大学介绍_詹姆斯麦迪逊大学James Madison University (JMU)...
  15. 程序员的996简史!我们是怎么一步步陷入996工作制的
  16. 新学习之 jQuery-boxy
  17. spring 解决循环依赖
  18. bigbluebutton视频直播服务器调用接口
  19. 问游戏java面试问题_JAVA程序员面试32问,你能回答多少题?
  20. 【bootstrap 入门】

热门文章

  1. Warshell算法实现
  2. Accenture国内出差常用报销填法
  3. mac下查看本机在某wifi下所对应的ip地址
  4. int? 是什么类型?和int有何区别
  5. 25.请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字 符串。
  6. C#生成word压缩下载
  7. 区块链行业前景还好吗?区块链技术有没有经过时间的检验?
  8. VLAN的原理及配置
  9. Gradle源码全解析,已拿offer
  10. 分布式存储系统Kudu(一)、核心原理