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


此时,运行代码已经没有问题了。

还有一种解决方法:将imgphoto移到函数外面,看代码:

将它移到外面:

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

Python tkinter之PhotoImage图片显示问题相关推荐

  1. python+tkinter使用canvas不显示图片的问题

    python+tkinter中使用canvas 切换不显示图片的问题 一.canvas使用 canvas对象的create_image方法有两个重要的点要注意,一个是格式,第二是要保持持续引用: 1. ...

  2. python tkinter库 密码实时显示_python tkinter库实现气泡屏保和锁屏

    本文实例为大家分享了python tkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下 显示效果如下: 代码: import random import tkinter import ...

  3. Python tkinter 打开本地图片进行矩形框标注

    经常会遇到json报文中有图片URL,以及ROI的坐标x.y.w.h,然后需要验证下这个框在图片的什么位置,一般时候只能根据坐标值定性目测下.最近用tkinter写了个打开本地图片并且将rect的坐标 ...

  4. python tkinter button 透明图片_如何使Tkinter支持PNG透明?

    下面是一个例子(PNG文件example.PNG在不同的地方有很多透明度):from Tkinter import Tk, Frame, Canvas import ImageTk t = Tk() ...

  5. python tkinter库 密码实时显示_Python3 tkinter基础 Entry show textvariable 密码输入框

    Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...

  6. python tkinter button 透明图片_Tkinter-按钮图像透明背景

    据我所知,tkinter本机支持像GIF这样的图像的透明性. 我把你的代码切碎了一点,但对我确实有用.也许你设置代码的方式有问题.你的标签上还有一个按钮.我觉得你不需要两者都有.你可以在你想要的地方创 ...

  7. Python + Tkinter:图片浏览器(二)

    Python + Tkinter:图片浏览器(二) 前言 说明 改进 功能 图片导航 显示上一张高清图片 显示下一张高清图片 缩略图导航 缩略图列表 缩略图上一页 缩略图下一页 缩略图指引 图片管理 ...

  8. python炫酷动画源代码_Python tkinter实现的图片移动碰撞动画效果【附源码下载】...

    本文实例讲述了Python tkinter实现的图片移动碰撞动画效果.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: #!/usr/bin/python # -*- coding ...

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

    Python之解决tkinter.PhotoImage不显示图片的问题 Python3 开始导航 1. tkinter.PhotoImage()不支持jpg等图片格式 2. 将ImageTk.Phot ...

最新文章

  1. GUN sed高级用法,sed脚本编写
  2. 去掉字符串里特殊字符的正则表达式方求
  3. RRT,RRT*,A*,Dijkstra,PRM算法
  4. 搜索引擎索引之索引基础
  5. leetcode —— 513. 找树左下角的值
  6. Centos(Linux)升级git最新版本
  7. c语言lr分析器的设计与实现_Python3设计模式四 :状态模式
  8. 第 2 章 设计模式七大原则
  9. PP-OCR论文笔记
  10. WebService—实现接口发布和客户端调用的几种方式
  11. 宋宝华——Linux设备驱动开发详解:基于最新的Linux 4.0内核(第一章)
  12. Stata: 交叉项\交乘项该这么分析!
  13. c++语言计算圆周率,计算圆周率的C++程序(30000位)
  14. 使用最小二乘法和最大似然法估计非线性模型
  15. 都要和硬件工程师“作对”吗?
  16. php获取蓝凑云文件列表,【PHP】利用蓝奏网盘做个人小文件网盘和获取真实下载地址...
  17. 计算机用户名密码不知道了怎么改,电脑系统账号administrator设置了密码,密码忘记了怎么办?...
  18. 蝴蝶飞舞(butterfly)
  19. 苹果刷机有好处和坏处_苹果更新要通电源吗
  20. 服务器c盘有个inetpub文件夹,Win10正式版C盘inetpub文件夹可以删除吗 Win10正式版C盘inetpub文件夹删不掉怎么办...

热门文章

  1. Peter Meer
  2. incaformat蠕虫病毒样本分析及查杀防范措施
  3. 【每日早报】2019/10/21
  4. 计算机网络光纤工作原理,如何实现宽带上网?详细说明光纤网络的工作原理和架构!...
  5. 郭台铭执念夏普,富士康转型梦福兮祸兮?
  6. java base64 转图片不现实_BASE64编码的图片在网页中的显示问题的解决
  7. softlayer iso_使用IBM SoftLayer标记简化操作
  8. 横评美国IaaS“8匹狼”:AWS、GCE、Azure、Rackspace、SoftLayer、Dell、HP、Joyent
  9. 销售管理和销售分析怎么做?
  10. 手写Promisify函数