使用 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中插入图片?

tkinter canvas create_window

如何使用 tkinter Canvas 小部件制作按钮?

使用 matplotlib 清除 Tkinter Canvas 小部件的问题

仅在一侧向 tkinter 小部件添加填充