按顺序更改多个图像Tkinter标签

时间:2016-05-11 16:44:21

标签: python tkinter

我是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()即时通讯? 帮助将非常适合。

1 个答案:

答案 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()方法。