为什么我的Tkinter程序显示空白而不是图片?

5

我希望使用Tkinter来显示特定目录中的所有图片,因此我首先编写了一个代码来显示给定列表中的所有图片。

代码如下:

import os

from Tkinter import *
from PIL import Image, ImageTk

class Application(Frame):
    def add_pic_panel(self, pic):
        img = ImageTk.PhotoImage(Image.open(pic))
        label = Label(root, image = img)
        print label
        return label

    def create_gui(self):
        pics = ['1.jpg', '2.jpg']
        for pic in pics:
            self.add_pic_panel(pic)
        pass

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.create_gui()

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

环境:Mac OS 10.9,Python 2.7.5 如何显示列表中的所有图片?

1个回答

7
  1. 代码没有对标签进行压缩。
  2. 应该保留图片的引用。

def add_pic_panel(self, pic):
    img = ImageTk.PhotoImage(Image.open(pic))
    label = Label(self.master, image=img)
    label.img = img # to keep the reference for the image.
    label.pack() # <--- pack
    return label

顺便提一下,add_pic_panel 直接使用了 root。最好使用 self.master

最后一行的 root.destroy() 会在关闭窗口时导致 TclError。请删除该行。


“保留图像的引用”是什么意思?(作为一个中国人,我不理解这句话。初始化标签与img后为什么还需要打包?) - Kane Blueriver
@kxxoling,如果您不保留图像对象的引用,它将被垃圾回收。 - falsetru
但我不想两次引用img,有其他更好的实现方法吗? - Kane Blueriver
@kxxoling,我不明白你上一条评论的意思。 - falsetru
@kxxoling,尝试使用以下代码:def add_pic_panel(self, pic): label = Label(self.master); label['image'] = label.img = ImageTk.PhotoImage(Image.open(pic)); label.pack(); return label - falsetru
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接