【问题标题】:Time.sleep() not working properly inside a loopTime.sleep() 在循环内无法正常工作
【发布时间】:2019-02-14 13:15:37
【问题描述】:

这是一个非常简单的问题,已经在我的标题中解释过,代码如下:

def flash():
    import time
    for i in range(1,len(says)):
        label5.config(bg=says[i])
        time.sleep(1)

time.sleep,在这种情况下,什么都不做,只是将我的程序延迟几秒钟,然后只显示函数的最终结果并跳过对我来说非常重要的整个过程。

【问题讨论】:

  • 您不能使用sleep 阻止 tkinter UI 线程。我认为它有自己可以使用的延迟机制。
  • Python time.sleep的可能重复
  • 这是一个松散的副本,但它可能会回答您的问题。
  • 这种情况下如何使用? .after 之前是什么?
  • @Treemur 您可能需要使flash 递归或类似的东西。您可以给flash 一个包含剩余says 项目的参数,然后执行def flash(rest): label5.config(bg=says[0]); label5.after(1000, lambda: flash(rest[:1])) 之类的操作,然后处理rest 为空。然后将flash 称为flash(says)

标签: python loops tkinter


【解决方案1】:

Tkinter 中,您应该使用after 而不是sleep 来安排稍后执行的函数(以毫秒为单位)。在你的情况下,你可以尝试这样的事情。

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 函数而不是 @ 987654327@。 (关于lambda i=i:见here

【讨论】:

  • 这远远超出了我的水平,但我只是复制了你的代码并且它有效,尽管我真的不知道为什么。谢谢!
  • @Treemur 不,它只是一个在一段时间后调用另一个函数的函数,就像command 用于按钮一样。也许你还没有使用过lambda,但这基本上只是一个匿名的内联函数。
  • @Treemur 你到底遇到了什么问题?是拉姆达吗?如果您遇到麻烦,所有这些都可以轻松解释。了解您的代码的作用很重要。使用你不理解的代码只会导致以后出现问题。
  • @carcigenicate 是的,lambda,我不太清楚“.pack”是什么意思。
  • @Treemur lambda 只是一个没有名称的函数。 def f(n): return n + 1 也可以写成lambda n: n + 1。它们适用于您想要传递尚未在其他地方定义的函数时。而且我相信pack 告诉 tkinter 重新评估每个元素占用的空间。
猜你喜欢
  • 1970-01-01
  • 2019-01-01
  • 2016-06-05
  • 2013-08-17
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多