以下内容不会显示任何内容:

def pic(name):
    def p(image=[]): #keep a reference to the image, but only load after creating window
        if not image:
            image.append(PhotoImage("../pic/small/"+name+".png"))
        return image[0]
    def do(canvas, point, angle, size, fill, outline):
        canvas.create_image(*point, image=p(), tag="visual")
    return do

flame = pic("flame")

flame(canvas, (100, 200), 0, 30, "red", "blue")


我第二次打电话给火焰,p仍然记得它的形象。没有异常发生,但图像未显示。

然而:

_pic2 = PhotoImage(file="../pic/small/flame.png")
canvas.create_image(300, 200, image=_pic2)


确实有效

(我知道有一些未使用的参数,但是pic需要与其他需要它们的函数相同的签名

def do(canvas, point, *_):


一样好)

(pic,flame,_pic2,canvas)是全局的

最佳答案

问题似乎根本不是图像被垃圾收集了。您只是缺少了file参数名称,因此该路径被用作图像的“名称”。

使用PhotoImage(file="../pic/small/"+name+".png")应该可以修复它。

但是,谈到垃圾回收,实际上并不需要带list参数的内部p函数。这是在极少数情况下可以在函数中仅将PhotoImage定义为局部变量的情况之一,因为即使在do函数退出后,它仍将保留在pic函数的范围内,因此不被垃圾收集。

def pic(name):
    img = PhotoImage(file="../pic/small/"+name+".png")
    def do(canvas, point, angle, size, fill, outline):
        canvas.create_image(*point, image=img, tag="visual")
    return do


(尽管将在收集flame时收集它,但是您的方法也是如此。但是正如您所说的flame是全局的,这应该不是问题。)

关于python - 尽管未收集到tkinter图像仍未显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46274587/

10-13 09:09