当我运行程序时,画布会显示,但Image不显示。
canvas = Canvas(frame, width = 128, height = 128, bg= 'white')
image_data = Image.open('NoArt.gif')
ppm_f = ImageTk.PhotoImage(image_data)
canvas.create_image(0, 0, image = ppm_f, anchor = NW)
canvas.pack(side=BOTTOM)
任何想法??
PS。
我有 PIL版本1.6, python 2.6,和 python 2.6附带的Tkinter版本答案 0 :(得分:9)
好的,我想出来了。显然,由于python处理垃圾处理的方式,图片才会被删除。需要在全局范围内引用图像。这是我最终使用的工作代码:
self.photo = PhotoImage(file="noart.ppm")
self.Artwork = Label(self.frame, image=self.photo)
self.Artwork.photo = self.photo
self.Artwork.pack()
self.Artwork.photo = self.photo
是重要的一部分。它确保显示图像。
答案 1 :(得分:2)
正如this very answer和this more popular question & answer以及effbot.page
中所述将PhotoImage或其他Image对象添加到Tkinter小部件时, 你必须保持自己对图像对象的引用。如果你不这样做, 图像不会一直显示出来。
问题是Tkinter / Tk接口不处理引用 到图像对象正确; Tk小部件将保存对该引用的引用 内部对象,但Tkinter没有。当Python的垃圾收集器 抛弃Tkinter对象,Tkinter告诉Tk释放图像。 但由于图像由小部件使用,因此Tk不会破坏它。不 完全。它只是使图像空白,完全成像 透明...
解决方案是确保保留对Tkinter的引用 对象,
例如,下面的代码中的image
,如果没有,因为它未在全局范围内声明:
import tkinter as tk
root = tk.Tk()
def show_image():
img_label = tk.Label(root)
image = tk.PhotoImage(file="test.png")
img_label['image'] = image
img_label.pack()
show_image()
root.mainloop()
而在下面的示例中,img_label.image
是全局声明的,在此示例中作为附加到我们的img_label
的属性,:
import tkinter as tk
root = tk.Tk()
def show_image():
img_label = tk.Label(root)
img_label.image = tk.PhotoImage(file="test.png")
img_label['image'] = img_label.image
img_label.pack()
show_image()
root.mainloop()
虽然img_label
未全局声明,但仍然很奇怪。一种不那么混乱的方式是将global image
添加为show_image
的第一行。
答案 2 :(得分:1)
如果其他人遇到类似问题,您可以尝试这种硬编码解决方案:
import Image
import Tkinter as tk
def cleanhex(x):
return str(hex(x))[-2:]
def renderimage(target,data,w,h):
canvas = tk.Canvas(target,width=w,height=h)
canvas.pack()
for x in range(w):
for y in range(h):
c = "#" + cleanhex(data[x,y][0]) + cleanhex(data[x,y][1]) + cleanhex(data[x,y][2])
canvas.create_line(x,y,x+1,y+1,fill=c)
im = Image.open("whatever.whatever")
renderimage(root,im.load(),im.size[0],im.size[1])