3

我注意到 tkinter 的一个非常奇怪的错误,我想知道这是否是因为 python 与 tcl 交互的方式存在某些问题,至少在 Win32 中是这样。

在这里,我有一个超级简单的程序,可以显示 gif 图像。它完美地工作。

from Tkinter import *

canvas = Canvas(width=300, height=300, bg='white')   
canvas.pack()

photo=PhotoImage(file=sys.argv[1])
canvas.create_image(0, 0, image=photo, anchor=NW)  # embed a photo
print canvas
print photo

mainloop( )

现在,我稍微更改程序以从函数内编辑画布对象。这一次,我只是得到一个空白画布。

# demo all basic canvas interfaces
from Tkinter import *

canvas = Canvas(width=300, height=300, bg='white')

canvas.pack()

def set_canvas(cv):
    photo=PhotoImage(file=sys.argv[1])
    cv.create_image(0, 0, image=photo, anchor=NW)  # embed a photo
    print cv
    print photo

set_canvas(canvas)
mainloop( )

两者之间的唯一区别是,在一个中,画布对象被传递给函数而不是直接使用。两个打印语句都返回相同的结果。我想知道在 tcl/python 层的对象模型中是否可能存在一些故障。

有什么想法吗,伙计们?

谢谢,/YGA

4

1 回答 1

6

这样做是一种快速的解决方案,我将尝试解释:

def set_canvas(cv):
    global photo # here!
    photo=PhotoImage(file=sys.argv[1])
    cv.create_image(0, 0, image=photo, anchor=NW)  # embed a photo
    print cv
    print photo

PhotoImage 需要至少有一个来自任何 Python 对象的引用,否则它会被垃圾收集。在我的解决方案中,我建议photo使用模块级名称,这样当函数结束时,仍然会有对 PhotoImage 对象的引用。您可能更喜欢创建一个类并制作set_canvas一个方法,并将 PhotoImage 对象存储为实例变量。

于 2009-02-23T21:08:36.473 回答