直接回答原问题:Tkinter目前不支持JPG图片,PNG支持取决于系统的Tcl/Tk版本——这是一个单独的库,用C语言编写,Python通过Tkinter进行接口交互(因此有“inter”部分)。流行的第三方库pillow提供了Tkinter PhotoImage类的即插即用替代品,使其支持更多图像格式。
Tkinter支持的图像格式
Tcl/Tk手册描述了对两种不同图片类型的支持——bitmap和photo,如下所述:
位图是一种图像,其像素可以显示两种颜色或是透明。
一张照片是一个像素可以显示任何颜色或透明的图像。照片图像以全彩(每像素32位)存储在内部,并在必要时使用抖动显示。
在Tkinter中,它们分别被表示为BitmapImage
和PhotoImage
类。 Tkinter支持的格式将略有不同,具体取决于安装的 Tcl / Tk版本。 但是,从3.10开始,官方Python二进制发行版中包含了Tcl / Tk 8.6的线程构建。
Python Tkinter文档主要集中在解释Tkinter在Tcl/Tk上添加的功能。对于大多数事情,用户应该参考Tcl/Tk文档(或第三方来源;Python文档提供了一些建议),并理解接口的工作原理。
如Donal Fellows在另一个Stack Overflow问题中所指出的, Tcl/Tk无法处理单个内存分配超过约2GB,这从理论上限制了图像大小。
Tcl/Tk中的
bitmap
比
photo
功能更加有限,因此实际上
PhotoImage
会更常用。但为了完整起见:
BitmapImage
支持BMP
(跨平台), XPM格式(用于
pixmap / 彩色位图,主要在
X11上),以及ICO格式(ICO是一种特殊的位图,主要用于Windows图标)。
如Tcl/Tk文档所述,可以从包含原始图像数据的数据字符串创建photo
:
该字符串应包含二进制数据或某些格式的base64编码数据(目前保证支持PNG和GIF图像)。
PhotoImage
支持
GIF、
PPM和
PGM图像,无论Tcl/Tk版本如何。
Tcl/Tk版本8.4 需要支持透明度。(然而,由于8.3分支自2002年以来未得到维护,因此当前带有Tkinter支持的Python安装几乎可以保证具有透明度支持。)
Tcl/Tk版本8.6 添加了对PNG图像的支持。如果可能,图像将进行伽马校正:
此外,实现应该... [a]llow应用显示伽玛(如果已知)与导入图像的gAMA
块相结合,如果存在,则通过-format“png -gamma value”
。
Tcl/Tk 8.7(目前处于alpha版本)计划支持SVG(有一些限制) 。如果版权问题得到解决,JPEG支持也可能会在未来被包含。
此外,还有几种方法可以扩展默认库的支持:
验证图片格式
许多其他关于Tkinter图像支持的问题在Stack Overflow上被问及,结果发现问题很简单,即程序员所期望的图像格式不正确。请注意,如果Tkinter尚未支持图像格式,则仅仅将文件重命名为适当的后缀是无法解决问题的。后缀只是提示文件中应该包含哪些数据。(底层的Tcl/Tk库也允许显式指定格式,但主要是从后缀和/或数据本身推断出来的。)
以下是验证图像格式的一些方法:
使用图像编辑程序打开它。(重新保存图像为指定格式是解决不支持格式问题最简单的方法,因此这通常是最实用的方法。)
使用命令行工具,例如Linux上的file
命令。
以编程方式打开文件并检查前几个字节,例如使用第三方filetype软件包。
如果不支持所需的图像,则简单地使用异常处理(try
/except
)并回退到占位符图像。(这可能在图像损坏或丢失的情况下是必要的。)
window = Tk()
并以window.mainloop()
结束。 - Batata