使用 Pillow 处理图像时出现奇怪的错误(在 tkinter 中)
Odd bugs when image processing with Pillow (in tkinter)
我在尝试使用 Pillow 在 tkinter 中显示图像时遇到了一个奇怪的问题。
我最初尝试以默认的 tkinter 方式显示图像,这对 gifs 效果很好:
import tkinter as tk
root = tk.Tk()
src = tk.PhotoImage(file = "C:\Users\Matt\Desktop\K8pnR.gif")
label = tk.Label(root, image = src)
label.pack()
(K8pnR 只是我在 imgur 上找到的随机 gif)
这很好用,但唯一的问题是我想显示其他文件类型。这让我想到了 Pillow,因为我在 Python 3.4 中工作。我试图从显示相同的文件开始,但使用 Pillow:
import tkinter as tk
from PIL import Image
root = tk.Tk()
src = Image.open("C:\Users\Matt\Desktop\K8pnR.gif")
img = tk.PhotoImage(file = src)
label = tk.Label(image = img, master = root)
label.pack()
这会导致非常奇怪和难看的没有这样的文件或目录错误:
Traceback (most recent call last):
File "C:\Users\Matt\Desktop\pil test.py", line 7, in <module>
img = tk.PhotoImage(file = src)
File "C:\Python34\lib\tkinter\__init__.py", line 3416, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python34\lib\tkinter\__init__.py", line 3372, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=494x260 at 0x26A6CD0>": no such file or directory
我尝试了不同的文件、不同的文件类型,甚至重新安装了 Pillow,但我仍然遇到错误。
有谁知道这里发生了什么?我是不是漏掉了一些显而易见的东西?
编辑:
当我尝试 修复时,我收到这个可怕的错误:
Traceback (most recent call last):
File "C:\Users\Matt\Desktop\pil test.py", line 6, in <module>
img = ImageTk.PhotoImage(file = src)
File "C:\Python34\lib\site-packages\PIL\ImageTk.py", line 84, in __init__
image = Image.open(kw["file"])
File "C:\Python34\lib\site-packages\PIL\Image.py", line 2297, in open
prefix = fp.read(16)
File "C:\Python34\lib\site-packages\PIL\Image.py", line 632, in __getattr__
raise AttributeError(name)
AttributeError: read
问题出在这一行:
img = tk.PhotoImage(file = src)
您正在使用来自 tkinter 的股票 PhotoImage
。它与 PIL
不兼容,您想使用 PIL
中的 ImageTk
。
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
src = Image.open("C:\Users\Matt\Desktop\K8pnR.gif")
img = ImageTk.PhotoImage(file = src)
label = tk.Label(image = img, master = root)
label.pack()
这是股票的文档 PhotoImage
class: http://effbot.org/tkinterbook/photoimage.htm ,它只接受构造函数中的路径。
我在尝试使用 Pillow 在 tkinter 中显示图像时遇到了一个奇怪的问题。
我最初尝试以默认的 tkinter 方式显示图像,这对 gifs 效果很好:
import tkinter as tk
root = tk.Tk()
src = tk.PhotoImage(file = "C:\Users\Matt\Desktop\K8pnR.gif")
label = tk.Label(root, image = src)
label.pack()
(K8pnR 只是我在 imgur 上找到的随机 gif)
这很好用,但唯一的问题是我想显示其他文件类型。这让我想到了 Pillow,因为我在 Python 3.4 中工作。我试图从显示相同的文件开始,但使用 Pillow:
import tkinter as tk
from PIL import Image
root = tk.Tk()
src = Image.open("C:\Users\Matt\Desktop\K8pnR.gif")
img = tk.PhotoImage(file = src)
label = tk.Label(image = img, master = root)
label.pack()
这会导致非常奇怪和难看的没有这样的文件或目录错误:
Traceback (most recent call last):
File "C:\Users\Matt\Desktop\pil test.py", line 7, in <module>
img = tk.PhotoImage(file = src)
File "C:\Python34\lib\tkinter\__init__.py", line 3416, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python34\lib\tkinter\__init__.py", line 3372, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=494x260 at 0x26A6CD0>": no such file or directory
我尝试了不同的文件、不同的文件类型,甚至重新安装了 Pillow,但我仍然遇到错误。
有谁知道这里发生了什么?我是不是漏掉了一些显而易见的东西?
编辑:
当我尝试
Traceback (most recent call last):
File "C:\Users\Matt\Desktop\pil test.py", line 6, in <module>
img = ImageTk.PhotoImage(file = src)
File "C:\Python34\lib\site-packages\PIL\ImageTk.py", line 84, in __init__
image = Image.open(kw["file"])
File "C:\Python34\lib\site-packages\PIL\Image.py", line 2297, in open
prefix = fp.read(16)
File "C:\Python34\lib\site-packages\PIL\Image.py", line 632, in __getattr__
raise AttributeError(name)
AttributeError: read
问题出在这一行:
img = tk.PhotoImage(file = src)
您正在使用来自 tkinter 的股票 PhotoImage
。它与 PIL
不兼容,您想使用 PIL
中的 ImageTk
。
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
src = Image.open("C:\Users\Matt\Desktop\K8pnR.gif")
img = ImageTk.PhotoImage(file = src)
label = tk.Label(image = img, master = root)
label.pack()
这是股票的文档 PhotoImage
class: http://effbot.org/tkinterbook/photoimage.htm ,它只接受构造函数中的路径。