我有一个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图像。我究竟做错了什么?
答案 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()