Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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/9/loops/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 Time.sleep()在循环中工作不正常_Python_Loops_Tkinter - Fatal编程技术网

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重新评估每个元素所占的空间。