2012-09-11 69 views
1

我正在开发一个应用程序来显示图像网格,非常类似于iPhoto或其他类似程序的主屏幕。要做到这一点,我设置了一个画布,并通过文件名列表循环,创建从每一个光象,并在画布上显示它们:Tkinter create_image not displayed

self.canvas = Canvas(self.bottomFrame, width = 700, height = 470, bg = "Red") 
self.canvas.pack() 

for i, filename in enumerate(image_list): 
    photo_image = PhotoImage(filename) 
    self.canvas.create_image(100*(round(i/4)+1), 100*(i+1), image = photo_image) 
    self.labelList.append(photo_image) 

的labelList是应用程序类的属性,以及image_list填充了.gif照片的文件名。但是,当我运行该应用程序时,不会显示图像。我知道画布在那里,因为一个红色的矩形出现了,但它上面没有图像。

我在这里错过了什么 - 我滚动浏览无尽的讨论寻找结果,并没有找到任何工作。

+0

什么类型的文件是'filename'? – mgilson

+0

“应用程序必须保留对图像对象的引用。”从http://effbot.org/tkinterbook/canvas.htm#Tkinter.Canvas.create_image-method。你确定吗? – lolopop

+0

@pythonm - 引用应该保存在'self.labelList'中。那里没问题。 – mgilson

回答

2
photo_image = PhotoImage(filename) 

应该

photo_image = PhotoImage(file=filename) 

否则,您只需设置name,因为PhotoImage__init__功能如下:

__init__(self, name=None, cnf={}, master=None, **kw) 

铝所以请注意,PhotoImage只能处理GIF和PGM/PPM文件。如果您需要其他文件类型,则必须使用PIL(example)。

+0

argv!对他们来说,这是一种看似愚蠢的方式来定义功能。 (+1) – mgilson

+0

@mgilson是的,它并不直观。主要的问题是,如果你陷入这个陷阱,除了没有显示图像,你根本就没有得到任何反馈... – sloth

+0

@BigYellowCactus谢谢!完美工作。现在我只是很恼火,就是这么简单... –