我是python的新手并尝试制作一个Tkinter标签,该标签会在运行时更改其图像。这是我的代码:
from Tkinter import *
from PIL import ImageTk, Image
import os
import time
#time.sleep(1)
class projector:
def __init__(self):
self.root = Tk()
self.frame = Frame(self.root)
self.label = Label(self.frame )
self.number = 1
def callback(self,e):
self.changeimage()
def check(self):
scr_height = self.root.winfo_screenheight()
scr_width = self.root.winfo_screenwidth()
image_src = "img/pattern/1.png"
im_temp = Image.open(image_src)
im_temp = im_temp.resize((scr_width, scr_height), Image.ANTIALIAS)
im_temp.save("ArtWrk.ppm", "ppm")
photo = PhotoImage(file="artwrk.ppm")
self.label.configure(image=photo)
self.label.pack()
self.frame.pack()
self.root.bind("<Return>", self.callback)
self.root.geometry("{0}x{1}+0+0".format(scr_width, scr_height))
#self.root.overrideredirect('true')
self.root.mainloop()
def nextpattern(self):
abc=''
def changeimage(self):
self.number= self.number+1;
path = "img/pattern/"+str(self.number)+".png"
self.image = ImageTk.PhotoImage(Image.open(path))
self.label.config(image = self.image)
print "loaded image "+ str(self.number)
def main():
projector().check()
if __name__ == "__main__":
main()
如果将changeimage()方法附加到事件侦听器并在按下enter时提供图像序列,则效果很好。但是当我尝试使用循环更改标签图像时,它只显示最后一张图像。任何建议我如何使用changeimage()即时通讯? 帮助将非常适合。
答案 0 :(得分:0)
当您使用self.root.mainloop()
时,它会创建自己的事件循环,其中一部分是更新GUI。多次更新GUI的任何回调都将在应用程序更新之前运行,除非明确更新(reference到方法,使用.update()
或.update_idle_tasks()
)
for i in range(10):
self.changeimage()
self.root.update_idle_tasks()
这使得图像如此快速地闪烁以至于在您打开窗口之前它可能会结束,您可以添加time.sleep
但是会锁定您的应用程序,因为它无法恢复{{ 1}},所以最好的办法是使用mainloop
方法。
请求Tkinter在延迟至少delay_ms毫秒之后使用参数args调用函数回调。它实际需要多长时间没有上限,但你的回叫不会比你的请求更快被调用,它只会被调用一次。
所以要在1000毫秒(1秒)后调用.after
,你可以使用:
self.changeimage
你可能会在程序开始时(初始化)调用一次(或者只是self.changeimage()),然后在self.root.after(1000, self.changeimage)
结束时调用下一次更改,同时请注意,如果需要取消延迟(如果用户按下则重置)它也包括:
此方法返回“标识符后”的整数,如果要取消回调,可以将其传递给.after_cancel()方法。