【问题标题】:Why it shows blank instead of picture in my Tkinter program?为什么它在我的 Tkinter 程序中显示空白而不是图片?
【发布时间】:2013-12-28 08:34:29
【问题描述】:

我想使用 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 如何显示列表中的所有图片?

【问题讨论】:

    标签: python image macos python-2.7 tkinter


    【解决方案1】:
    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 在关闭窗口时。删除该行。

    【讨论】:

    • "keep the reference for the image"是什么意思?(我是中国人,没看懂这句话。为什么用img初始化标签后还需要打包?
    • @kxxoling,删除label.img = img 并运行程序。您将看不到任何图像。
    • @kxxoling,如果您不保留图像对象的引用,则会被垃圾回收。
    • 但我不想引用 img 两次,还有其他更好的方法来实现这一点吗?
    • @kxxoling,打包包含框架不会自动打包包含的小部件。想想包含的小部件使用不同布局方法的情况:gridplace 而不是pack
    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2019-03-07
    • 1970-01-01
    • 2017-08-08
    • 2021-07-11
    • 2022-01-17
    相关资源
    最近更新 更多