Python 使用PIL在Tkinter画布小部件中嵌入图像

Python 使用PIL在Tkinter画布小部件中嵌入图像,python,image,embed,tkinter,python-imaging-library,Python,Image,Embed,Tkinter,Python Imaging Library,我正在尝试使用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 = T

我正在尝试使用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()

我猜图像正在被垃圾收集。尝试保存对“i”的引用(例如:self.image=i)

@Bryan Oakley这也是我的问题所在。你怎么知道的?为什么图像会被如此迅速地垃圾收集,即使在下一行有对它的引用?
self.
有什么区别?@theJollySin:
self
的区别在于,没有它,
i
是一个局部变量。当该函数结束时,
i
可能会被垃圾收集。使用
self
,对象的生命周期中存在引用。@BryanOakley:这很奇怪,因为这意味着
ImbImage.create\u image()
调用不会创建对图像的引用。我想这是出乎意料的。@MartijnPieters:你是对的:
ImbImage.create_image()
不会创建对图像对象的引用。它只是告诉底层的tcl/tk解释器将图像放在画布上。tcl/tk解释器和画布不了解python对象。