Igo*_*234 10 python macos canvas tkinter python-3.x
我正在尝试将jpg图像放到tkinter画布上。tkinter给我这个错误:
无法识别图像文件中的数据
我使用文档中的代码:
canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)
img = PhotoImage(file="bll.jpg")
canv.create_image(20,20, anchor=NW, image=img)
Run Code Online (Sandbox Code Playgroud)
png图像也是如此。甚至试图将图像放入标签小部件中,但出现相同的错误。怎么了?
我在Mac上使用Python 3。Python文件和图像位于同一文件夹中。
您的代码似乎正确,这在Windows 7(Python 3.6)上为我运行:
from tkinter import *
root = Tk()
canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)
img = PhotoImage(file="bll.jpg")
canv.create_image(20,20, anchor=NW, image=img)
mainloop()
Run Code Online (Sandbox Code Playgroud)
导致此tkinter GUI:
(imgur将其转换为,bll.png但这也对我有用。)
更多的选择:
更新:解决方案PIL:
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)
img = ImageTk.PhotoImage(Image.open("bll.jpg")) # PIL solution
canv.create_image(20, 20, anchor=NW, image=img)
mainloop()
Run Code Online (Sandbox Code Playgroud)
安装 PIL/Pillow:
pip install Pillow
Run Code Online (Sandbox Code Playgroud)
或者:
sudo pip install pillow
Run Code Online (Sandbox Code Playgroud)
from PIL import Image
from PIL import ImageTk
import tkinter
image = Image.open('bll.jpg')
image = image.resize((20, 20))
image = ImageTk.PhotoImage(image)
canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)
img = PhotoImage(file=image)
Run Code Online (Sandbox Code Playgroud)
同样使用 .PNG 而不是 .JPG 更适合 Tkinter。
直接回答原来的问题:Tkinter 目前不支持 JPG 图像,PNG 支持取决于系统的 Tcl/Tk 版本 - 一个单独的库,用 C 编写,Python 通过 Tkinter 与之交互(因此“inter”部分)。流行的第三方库pillow提供了 Tkinter 类的直接替代品PhotoImage,使其能够支持更多图像格式。
Tcl /Tk 手册描述了对两种独立图像类型的支持 -bitmap并且photo- 如此描述:
位图是一种图像,其像素可以显示两种颜色或透明。
照片是像素可以显示任何颜色或透明的图像。照片图像以全色(每像素 32 位)内部存储,并在必要时使用抖动显示。
这些在 Tkinter 中分别反映为BitmapImage和PhotoImage类。Tkinter 支持的格式稍微取决于安装的 Tcl/Tk版本。然而,从 3.10 开始,Tcl/Tk 8.6 的线程构建包含在官方 Python 二进制版本中
Python Tkinter 文档主要侧重于解释 Tkinter 在 Tcl/Tk 之上添加的功能。对于大多数事情,用户应该参考 Tcl/Tk 文档(或第三方来源;Python 文档提供了一些建议)并了解界面的一般工作方式。
正如Donal Fellows 在另一个 Stack Overflow 问题上指出的那样,Tcl/Tk 无法处理超过 2GB 的单独内存分配,这在理论上限制了图像大小。
Tcl/Tkbitmap比 s 受到更多限制photo,因此实际上来说,PhotoImage会更频繁地使用。但为了完整性:BitmapImage支持 BMP (跨平台)、XPM(用于像素图/彩色位图,主要在 X11 上)和 ICO 格式(ICO 是一种主要用于 Windows 图标的特殊位图)。
如 Tcl/Tk 文档中所述,photo可以从包含原始图像数据的数据字符串创建 a:
该字符串应包含二进制数据,或者对于某些格式,包含 base64 编码的数据(目前保证 PNG 和 GIF 图像支持)。
PhotoImage无论 Tcl/Tk 版本如何,都支持GIF、PPM和PGM图像。
需要Tcl/Tk 版本 8.4来支持透明度。(但是,由于 8.3 分支自 2002 年以来就不再维护,因此实际上可以保证当前支持 Tkinter 的 Python 安装将具有透明度支持。)
Tcl/Tk 版本 8.6添加了对 PNG 图像的支持。如果可能,将对图像进行伽玛校正:
此外,实现应该...允许通过 结合
gAMA导入图像块(如果存在)应用显示伽玛(如果已知)-format "png -gamma value"。
Tcl/Tk 8.7(目前处于 alpha 版本)中计划 支持 SVG (有一些限制)。如果版权问题能够得到解决,将来可能会包含 JPEG 支持。
此外,还有几种方法可以扩展默认库支持:
Stack Overflow 上询问的 Tkinter 图像支持的许多其他问题最终都是由图像引起的,很简单,图像的格式不是程序员期望的。请注意,如果 Tkinter 尚不支持图像格式,则简单地将文件重命名为具有适当的后缀将无济于事。后缀只是提示文件中包含哪些数据。(底层 Tcl/Tk 库还允许显式指定格式,但主要是从后缀和/或数据本身推导出来的。)
以下是验证图像格式的一些方法:
使用图像编辑程序打开它。(无论如何,以指定格式重新保存图像是解决不受支持的格式问题的最简单方法,因此这通常是最实用的方法。)
使用命令行工具,例如fileLinux上的命令。
以编程方式打开文件并检查前几个字节,例如使用第三方文件类型包。
只需使用异常处理 ( try/ except) 并在不支持所需图像时回退到占位符图像。(无论如何,这可能是必要的,例如图像损坏或丢失。)
小智 6
我遇到了同样的问题。我有Windows和Python 3.6。因此,我为此找到了两种解决方案:使用/转换为.png图像(具有与您使用的相同功能):
photo = PhotoImage('xyz.png')
l = Label(image = photo)
l.pack()
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想读取.jpg文件,则使用PIL库读取和显示如下图像:
from PIL import ImageTk, Image
img = ImageTk.PhotoImage(Image.open("xyz.jpg"))
l=Label(image=img)
l.pack()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24208 次 |
| 最近记录: |