使用 PIL 在 Tkinter Canvas 小部件中嵌入图像
Posted
技术标签:
【中文标题】使用 PIL 在 Tkinter Canvas 小部件中嵌入图像【英文标题】:Embedding an Image in a Tkinter Canvas widget using PIL 【发布时间】:2011-06-18 07:48:02 【问题描述】:我正在尝试使用 PIL 在 Tkinter 画布中嵌入图像,但由于某种原因它没有显示。有任何想法吗?
没有错误或警告。只是一个空白的 Tk 窗口。
我的代码:
import Tkinter
from PIL import ImageTk, Image
class image_manip(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.ImbImage = Tkinter.Canvas(self)
self.ImbImage.pack()
i = ImageTk.PhotoImage(Image.open('test.png'))
self.ImbImage.create_image(0, 0, image=i)
def run():
image_manip(None).mainloop()
if __name__ == "__main__":
run()
【问题讨论】:
【参考方案1】:我的猜测是图像正在被垃圾收集。尝试保存对“i”的引用(例如:self.image=i)
【讨论】:
@Bryan Oakley 这也是我的确切问题。你怎么知道?为什么图像会如此迅速地被垃圾收集,即使在下一行有对它的引用?self.
有什么不同?
@theJollySin:self
的不同之处在于,没有它,i
是一个局部变量。当该函数结束时,i
可能会被垃圾回收。使用self
,引用在对象的整个生命周期内都存在。
@BryanOakley:这令人惊讶,因为这意味着 ImbImage.create_image()
调用确实不创建对图像的引用。我猜这是出乎意料的。
@MartijnPieters:你是对的:ImbImage.create_image()
不会创建对图像对象的引用。它只是告诉底层 tcl/tk 解释器将图像放在画布上。 tcl/tk 解释器和画布不知道 python 对象。以上是关于使用 PIL 在 Tkinter Canvas 小部件中嵌入图像的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Python tkinter canvas postscript 文件转换为 PIL 可读的图像文件?
Python3 tkinter,怎么在Label/Canvas中插入图片?