使用python更新标签中的图像

时间:2015-10-25 11:14:01

标签: python python-2.7 tkinter

我有一个python模块,可以转换python的datetime.datetime.now()函数,根据看到的数字返回一个图像。如果它看到01秒,则返回0和1中的一个中的两个图像。这些只是jpg图像。我的python模块只是重新修改了一个字典:

{'am_pm': '{file_path}am.jpg', 'hour': '{file_path}five.jpg', 'second2': {file_path}one.jpg, 'second1': {file_path}zero.jpg, 'colon': '{file_path}Colon.jpg', 'minute2': '{file_path}zero.jpg', 'minute1': '{file_path}zero.jpg'}

然后,我尝试将以下代码显示在标签中。但是使用tKinter还是比较新的。

from PIL import ImageTk, Image
import datetime
from translator import Translator # my converter to get the above dict
import Tkinter as tk


def counter_label(label):
    def count():
        clock.get_time(datetime.datetime.now())
        image = clock.return_images() # this is the dict mentioned above
        label.configure(image=ImageTk.PhotoImage(Image.open(image['second2']))) # just using one entry in the dict for now.
        label.after(1000, count)
    count()


root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="green")
label.pack()
clock = Translator()
counter_label(label)
button = tk.Button(root, text='Stop', width=25, command=root.destroy)
button.pack()
root.mainloop()

代码运行,我可以看到标签刷新,但是我看不到标签中的jpg图像。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

问题是您没有让应用程序保持对图像对象的引用。既然你做了 -

label.configure(image=ImageTk.PhotoImage(Image.open(image['second2'])))

label没有对您创建的图像对象进行强引用,并将image关键字参数的值作为label.configure()发送。因此,只要执行上面的行,图像对象就有资格进行垃圾收集(并且会收集垃圾),因此您看不到图像。

您需要让您的应用程序/程序对您的对象保持强烈的引用。一种非常简单的方法是使用全局变量来存储对图像的引用。示例 -

def counter_label(label):
    def count():
        global image_obj
        clock.get_time(datetime.datetime.now())
        image = clock.return_images() # this is the dict mentioned above
        image_obj = ImageTk.PhotoImage(Image.open(image['second2']))
        label.configure(image=image_obj) # just using one entry in the dict for now.
        label.after(1000, count)
    count()