Python之解决tkinter.PhotoImage不显示图片的问题 Python3 |
您所在的位置:网站首页 › pycharm读取不了图片 › Python之解决tkinter.PhotoImage不显示图片的问题 Python3 |
Python之解决tkinter.PhotoImage不显示图片的问题 Python3
开始导航1. tkinter.PhotoImage()不支持jpg等图片格式2. 将ImageTk.PhotoImage()放在函数里图片不显示3. 循环加入多张图片却只显示一张
开始导航
作为Python小白的你,初学tkinter时,有没有遇到过一些难的问题? 例如:图片格式不支持、不显示图片,等等。 本文章将教大家解决,代码尽量简洁。 (之前有写过一篇,也有好多博主都写过了,本来不想再写,但之前的内容太糟,于是决定重写一篇,希望大家会好理解一些。) 写得不好,大神请不要嘲笑,谢谢。 1. tkinter.PhotoImage()不支持jpg等图片格式由于tkinter.PhotoImage()仅支持GIF和PGM/PPM文件格式,在使用jpg等其他格式的图片时,会报“_tkinter.TclError: couldn’t recognize data in image file “img.jpg””的错误: 报错代码: import tkinter root = 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包的Image和ImageTk模块实现多种格式图片的载入,支持30多种格式。 2.抛弃tkinter.PhotoImage(),改用ImageTk.PhotoImage()。 注意!!!都是PhotoImage(),别理解混了。 代码如下: import tkinter from PIL import Image, ImageTk root = 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, ImageTk root = 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全局变量。如下(为了做对比,代码用图片展示):![]() 栗子太多,只举其一叭~ from tkinter import Tk, Label from PIL import Image, ImageTk root = 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 photo photo = 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被抛弃,变成了Label组件,为的就是给每个显示图片的Label一个引用,不至于像变量那样被回收。 同样,前面的第1、2个问题,只需要添加个引用就完美了。这样就大功告成啦。 妈妈再也不用担心内存被回收啦!奥利给!! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |