无法在Tkinter中显示图像

时间:2010-07-29 05:33:45

标签: python image tkinter

当我运行程序时,画布会显示,但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版本

3 个答案:

答案 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 answerthis more popular question & answer以及effbot.page

中所述
  

将PhotoImage或其他Image对象添加到Tkinter小部件时,   你必须保持自己对图像对象的引用。如果你不这样做,   图像不会一直显示出来。

     

问题是Tkinter / Tk接口不处理引用   到图像对象正确; Tk小部件将保存对该引用的引用   内部对象,但Tkinter没有。当Python的垃圾收集器   抛弃Tkinter对象,Tkinter告诉Tk释放图像。   但由于图像由小部件使用,因此Tk不会破坏它。不   完全。它只是使图像空白,完全成像   透明...

     

解决方案是确保保留对Tkinter的引用   对象,

例如,下面的代码won’t always show up中的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的属性,will be shown

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])