Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按顺序更改多个图像Tkinter标签_Python_Tkinter - Fatal编程技术网

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

Python 按顺序更改多个图像Tkinter标签,python,tkinter,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.l

我是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()
从Tkinter导入*
从PIL导入ImageTk,图像
导入操作系统
导入时间
#时间。睡眠(1)
班级放映机:
定义初始化(自):
self.root=Tk()
self.frame=frame(self.root)
self.label=标签(self.frame)
self.number=1
def回调(self,e):
self.changeimage()
def检查(自我):
scr\u height=self.root.winfo\u screenheight()
scr_width=self.root.winfo_screenwidth()
image\u src=“img/pattern/1.png”
im_temp=Image.open(Image_src)
im_temp=im_temp.resize((scr_宽度、scr_高度)、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(“,self.callback)
self.root.geometry(“{0}x{1}+0+0.”格式(scr_宽度,scr_高度))
#self.root.OverrideDirect('true')的
self.root.mainloop()
def下一模式(自身):
abc=“”
def更改图像(自身):
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)
打印“已加载图像”+str(自身编号)
def main():
投影仪()检查()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
如果将changeimage()方法附加到事件侦听器,并在按下enter键时给出图像序列,则效果良好。但当我尝试使用循环更改标签图像时,它只显示最后一张图像。有没有关于如何使用changeimage()im循环的建议??
非常感谢您的帮助。

当您使用
self.root.mainloop()
时,它会创建自己的事件循环,其中一部分是更新GUI。任何多次更新GUI的回调都将在应用程序更新之前运行,除非显式更新(对于方法,请使用
.update()
.update\u idle\u tasks()

这会使图像闪烁得如此之快,以至于可能在您打开窗口之前就结束了,您可以添加
时间。睡眠
,但这会在一段时间内锁定您的应用程序,因为它无法恢复
主循环
,因此您最好的选择肯定是使用
.after
方法

请求Tkinter在至少延迟毫秒后调用带有参数args的函数回调。实际需要的时间没有上限,但是回调不会比您的请求更快被调用,而且只会被调用一次

因此,要在1000毫秒(1秒)后调用
self.changeimage
,您可以使用:

self.root.after(1000, self.changeimage)
您可能会在程序开始(初始化)时调用此函数一次(或仅调用self.changeimage()),然后在
self.changeimage
结束时调用此函数以安排下一次更改,还请注意,如果您需要取消延迟(如果用户按下,则重置),它也包括:

如果要取消回调,此方法返回一个整数“after identifier”,该整数可以传递给.after\u cancel()方法


使用
self.after
指定“在X时间后调用此函数”,当您将其放入循环中时,它会在更新GUI之前通过每个图像进行更改。update()函数为我完成了这项工作,因为我只希望将静态图像放在那里。。。。谢谢你。答案真的很有帮助。。。。。。。。
self.root.after(1000, self.changeimage)