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 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图片显示问题相关推荐
- python+tkinter使用canvas不显示图片的问题
python+tkinter中使用canvas 切换不显示图片的问题 一.canvas使用 canvas对象的create_image方法有两个重要的点要注意,一个是格式,第二是要保持持续引用: 1. ...
- python tkinter库 密码实时显示_python tkinter库实现气泡屏保和锁屏
本文实例为大家分享了python tkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下 显示效果如下: 代码: import random import tkinter import ...
- Python tkinter 打开本地图片进行矩形框标注
经常会遇到json报文中有图片URL,以及ROI的坐标x.y.w.h,然后需要验证下这个框在图片的什么位置,一般时候只能根据坐标值定性目测下.最近用tkinter写了个打开本地图片并且将rect的坐标 ...
- python tkinter button 透明图片_如何使Tkinter支持PNG透明?
下面是一个例子(PNG文件example.PNG在不同的地方有很多透明度):from Tkinter import Tk, Frame, Canvas import ImageTk t = Tk() ...
- 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 ...
- python tkinter button 透明图片_Tkinter-按钮图像透明背景
据我所知,tkinter本机支持像GIF这样的图像的透明性. 我把你的代码切碎了一点,但对我确实有用.也许你设置代码的方式有问题.你的标签上还有一个按钮.我觉得你不需要两者都有.你可以在你想要的地方创 ...
- Python + Tkinter:图片浏览器(二)
Python + Tkinter:图片浏览器(二) 前言 说明 改进 功能 图片导航 显示上一张高清图片 显示下一张高清图片 缩略图导航 缩略图列表 缩略图上一页 缩略图下一页 缩略图指引 图片管理 ...
- python炫酷动画源代码_Python tkinter实现的图片移动碰撞动画效果【附源码下载】...
本文实例讲述了Python tkinter实现的图片移动碰撞动画效果.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: #!/usr/bin/python # -*- coding ...
- Python之解决tkinter.PhotoImage不显示图片的问题 Python3
Python之解决tkinter.PhotoImage不显示图片的问题 Python3 开始导航 1. tkinter.PhotoImage()不支持jpg等图片格式 2. 将ImageTk.Phot ...
最新文章
- GUN sed高级用法,sed脚本编写
- 去掉字符串里特殊字符的正则表达式方求
- RRT,RRT*,A*,Dijkstra,PRM算法
- 搜索引擎索引之索引基础
- leetcode —— 513. 找树左下角的值
- Centos(Linux)升级git最新版本
- c语言lr分析器的设计与实现_Python3设计模式四 :状态模式
- 第 2 章 设计模式七大原则
- PP-OCR论文笔记
- WebService—实现接口发布和客户端调用的几种方式
- 宋宝华——Linux设备驱动开发详解:基于最新的Linux 4.0内核(第一章)
- Stata: 交叉项\交乘项该这么分析!
- c++语言计算圆周率,计算圆周率的C++程序(30000位)
- 使用最小二乘法和最大似然法估计非线性模型
- 都要和硬件工程师“作对”吗?
- php获取蓝凑云文件列表,【PHP】利用蓝奏网盘做个人小文件网盘和获取真实下载地址...
- 计算机用户名密码不知道了怎么改,电脑系统账号administrator设置了密码,密码忘记了怎么办?...
- 蝴蝶飞舞(butterfly)
- 苹果刷机有好处和坏处_苹果更新要通电源吗
- 服务器c盘有个inetpub文件夹,Win10正式版C盘inetpub文件夹可以删除吗 Win10正式版C盘inetpub文件夹删不掉怎么办...
热门文章
- Peter Meer
- incaformat蠕虫病毒样本分析及查杀防范措施
- 【每日早报】2019/10/21
- 计算机网络光纤工作原理,如何实现宽带上网?详细说明光纤网络的工作原理和架构!...
- 郭台铭执念夏普,富士康转型梦福兮祸兮?
- java base64 转图片不现实_BASE64编码的图片在网页中的显示问题的解决
- softlayer iso_使用IBM SoftLayer标记简化操作
- 横评美国IaaS“8匹狼”:AWS、GCE、Azure、Rackspace、SoftLayer、Dell、HP、Joyent
- 销售管理和销售分析怎么做?
- 手写Promisify函数