使用 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 ,它只接受构造函数中的路径。