如何在Tkinter中使用PIL?

3 投票
2 回答
6312 浏览
提问于 2025-04-15 13:25

我在用PIL加载图片并在Tkinter创建的窗口中显示时,感觉有些基础的东西没搞明白。我想做的最简单的事情是:

import Tkinter as TK
from PIL import Image, ImageTk

im = Image.open("C:\\tinycat.jpg")
tkIm = ImageTk.PhotoImage(im)
tkIm.pack()
TK.mainloop()

当我尝试运行上面的代码时,我得到了以下结果:

RuntimeError: Too early to create image
Exception AttributeError: "PhotoImage instance has no attribute 
'_PhotoImage__photo'" in <bound method PhotoImage.__del__ of 
<PIL.ImageTk.PhotoImage instance at 0x00C00030>> ignored

我确认文件是存在的,可以在图片编辑器中打开,也可以用im.show()显示出来。我到底漏掉了什么呢?

2 个回答

-1

梅雷迪斯说的确实很对,你一定要加上那一行代码!

我想给你看看我的图片格式代码,然后和你的代码做个对比,看看有什么不同。我的图片代码是:

master.image = PhotoImage(file="Banditlogo.gif")
w = Label(master, image=master.image)
w.photo = master
w.pack()

而你的代码是:

im = Image.open("C:\\tinycat.jpg")
tkIm = ImageTk.PhotoImage(im)
tkIm.pack()

我们俩都是用PIL和PhotoImage。我不禁想问,这两种写法都是对的吗?目前我对PIL的知识还不够,不能完全回答你的问题,但比较这两段代码很有意思,因为它们确实不一样。我只能建议你像我一样处理别人分享给我的示例代码,也就是“如果我的代码不管用,就试试示例代码,看看能不能解决问题”。当我找到有效的代码时,我就会坚持使用它。

有没有人对Tkinter更了解的,可以解释一下,如何将PIL与Tkinter结合使用?

知识就是力量,所以请分享一下。

6

Tkinter在你调用ImageTk.PhotoImage()之前必须先被实例化:

TK.Tk()

撰写回答