Python Time.sleep()在循环中工作不正常
这是一个非常简单的问题,在我的标题中已经解释过,下面是代码:Python Time.sleep()在循环中工作不正常,python,loops,tkinter,Python,Loops,Tkinter,这是一个非常简单的问题,在我的标题中已经解释过,下面是代码: def flash(): import time for i in range(1,len(says)): label5.config(bg=says[i]) time.sleep(1) time.sleep,在这种情况下,除了将我的程序延迟几秒钟之外,什么都不做,然后只显示函数的最终结果,并跳过对我来说非常重要的整个过程。在Tkinter中,您应该在之后使用,而不是睡眠来安排函数稍后
def flash():
import time
for i in range(1,len(says)):
label5.config(bg=says[i])
time.sleep(1)
time.sleep
,在这种情况下,除了将我的程序延迟几秒钟之外,什么都不做,然后只显示函数的最终结果,并跳过对我来说非常重要的整个过程。在Tkinter
中,您应该在之后使用,而不是睡眠
来安排函数稍后执行(以毫秒为单位)。对你来说,你可以试试这样的
def flash():
for i in range(1,len(says)):
label5.after(i*1000, lambda i=i: label5.config(bg=says[i]))
import tkinter as tk
says = ["white", "red", "green", "blue"]
root = tk.Tk()
label5 = tk.Button(root, text="Flashing label", command=flash)
label5.pack()
root.mainloop()
请注意,这不会延迟循环本身的执行,而只是计划在将来的不同时间更新标签。如果循环中有更多的代码应该与颜色更改同时发生,则必须将其放入回调函数中,当然,回调函数也可以是常规的def
函数,而不是lambda
。(关于lambda i=i
:请参阅)您不能使用睡眠
阻止tkinter UI线程。我认为它有自己的延迟机制,你可以使用。它的可能副本是松散副本,但它可能会回答你的问题。在这种情况下,我如何使用它?什么是前。后?@Treemur您可能需要使flash
recursive或类似的东西。您可以给flash
一个包含剩余says
项的参数,然后执行类似deflash(rest):label5.config(bg=says[0]);label5.在(1000,lambda:flash(rest[:1]))之后
,然后处理rest
为空。然后调用flash
作为flash(says)
。这远远超出我的水平,但我只是复制了你的代码,它工作了,尽管我真的不知道为什么。谢谢@Treemur不,它只是一个函数,在一段时间后调用另一个函数,就像按钮的command
。也许您还没有使用lambda,但这基本上只是一个匿名的内嵌函数。@Treemur您到底遇到了什么问题?是兰姆达吗?如果你遇到麻烦,所有这些都可以很容易地解释。理解代码的功能很重要。使用您不理解的代码只会导致以后出现问题。@carcigenicate是的,lambda,我不太清楚“.pack”是什么意思。@Treemur lambda只是一个没有名称的函数def(n):返回n+1
也可以写成lambda n:n+1
。它们适用于您希望传递其他地方尚未定义的函数的情况。我相信pack
会告诉tkinter重新评估每个元素所占的空间。