在Tkinter中插入多张图片

3
我在tkinter的Listbox小部件中插入多个图像时遇到了问题。当我插入新图像时,以前的图像就会消失。我该怎么办?这是我遇到问题的代码:

img = PhotoImage(file = Client.dir + "emo1.gif")
self.listBox.insert(END, sender)
self.listBox.image_create(END, image=img)
self.listBox.insert(END, "\n")
self.listBox.yview(END)

3
如果你没有保存每一个引用,它们很可能被垃圾回收。 - Bryan Oakley
我要做什么?如何引用它们每一个? - user6036956
我正在创建一个聊天消息系统,可以发送图片。 - user6036956
2
global images; ... images = []; ... images.append(img) ... - Bryan Oakley
谢谢Bryan!它起作用了! - user6036956
1个回答

3
根据文档 (以及 BryanOakley的评论),图像对象可以在支持image选项的小部件(例如标签、按钮、菜单)中使用。在这些情况下,Tk不会保留对图像的引用。当最后一个Python引用被删除时,图像数据也会被删除,并且Tk将在使用图像的地方显示一个空框。虽然BryanOakley的建议绝对是最简单的解决方案,但它会阻止未使用的图像被垃圾回收,可能是不想要的。请注意:我的建议是假设self.listBox是一个Text小部件,因为Listbox小部件没有image_create方法。如果您正在使用不同类型的小部件,则仍可以制作类似的类来处理使用的图像并保留引用。你可以制作一个Text的子类来保留插入的图像的引用,覆盖相关方法(image_createdelete是最重要的)。
from tkinter import Text #, PhotoImage, Tk

class Text_autoReferenceImage(Text):
    def __init__(self,*varg,**kw):
        self.images = {}
        Text.__init__(self,*varg,**kw)

    def image_create(self,index,**options):
        img = options.get("image",None)
        name = Text.image_create(self,index,**options)
        if img is not None:
            self.images[name] = img #this may remove previous reference with same name but different image
        return name

    def delete(self,*varg,**kw):
        Text.delete(self,*varg,**kw)
        self.clean_up_images()

    def clean_up_images(self):
        """deletes reference to all images that are no longer present in Text widget (called by .delete())"""
        images_still_in_use = self.image_names()
        for name in set(self.images.keys()): #need to put .keys() into a set in python3 or it complains about dictionary changing size during iteration
            if name not in images_still_in_use:
                del self.images[name]

    def destroy(self):
        self.images.clear() #remove all references to own images
        return Text.destroy(self)

如果self.listBox是这个类的实例而不是Text,它将为您处理图像引用。

1
谢谢McDonald-Jensen。现在我知道Python的工作原理了。非常有启发性的回答。谢谢 :) - user6036956

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接