【问题标题】:Python ForLoop with nested after() functions happening after loop循环后发生嵌套 after() 函数的 Python For 循环
【发布时间】:2015-12-22 07:20:25
【问题描述】:

我正在尝试创建一个将一段代码重复三次的函数。 该代码有一个 for 循环以 500 毫秒的间隔改变背景。我想重复三遍。

for x in range(0,3):
    window.after(500, lambda: window.configure(bg = "blue"))
    window.after(1000, lambda: window.configure(bg = "green"))
    window.after(1500, lambda: window.configure(bg = "yellow"))
    window.after(2000, lambda: window.configure(bg = "purple"))
    window.after(2500, lambda: window.configure(bg = "red"))
    window.after(3000, lambda: window.configure(bg = "#a1dbcd"))
    print x

在 IDE 中,“x”被打印了 3 次,但窗口背景只循环了一次。

有人可以帮我修复此代码或找到替代方法吗? 谢谢。

【问题讨论】:

    标签: python for-loop time tkinter


    【解决方案1】:

    你在打电话

    window.after(500, lambda: window.configure(bg = "blue"))
    window.after(1000, lambda: window.configure(bg = "green"))
    ...
    

    3 次。这相当于写:

    window.after(500, lambda: window.configure(bg = "blue"))
    window.after(500, lambda: window.configure(bg = "blue"))
    window.after(500, lambda: window.configure(bg = "blue"))
    

    500 毫秒后,您将背景设置为蓝色 3 次。

    要连续设置背景,请在每次迭代时添加一个间隔。例如,而不是

    for i in range(3):
        window.after(500, lambda: window.configure(bg = "blue"))
        window.after(1000, lambda: window.configure(bg = "green"))
    

    for i in range(3):
        window.after(i * 1000 + 500, lambda: window.configure(bg = "blue"))
        window.after(i * 1000 + 1000, lambda: window.configure(bg = "green"))
    

    这段代码可以:

    • 第一次迭代:

      window.after(500, lambda: window.configure(bg = "blue"))
      window.after(1000, lambda: window.configure(bg = "green"))
      
    • 第二次迭代:

      window.after(1500, lambda: window.configure(bg = "blue"))
      window.after(2000, lambda: window.configure(bg = "green"))
      
    • 第三次迭代:

      window.after(2500, lambda: window.configure(bg = "blue"))
      window.after(3000, lambda: window.configure(bg = "green"))
      

    注意每次迭代的间隔是如何增加而不是保持不变的。

    【讨论】:

    • 非常感谢。很容易看出这一切背后的逻辑。 PM 2Ring 的回答稍微紧凑一些。干杯:)
    【解决方案2】:

    Fernando Matsumoto 已回​​答您的问题,但这里有一种更简洁的方法。

    import Tkinter as tk
    
    bgcolors = ("blue", "green", "yellow", "purple", "red", "#a1dbcd")
    
    def cycle():
        delta = 500
        delay = delta
        for x in range(3):
            for c in bgcolors:
                window.after(delay, lambda c=c: window.configure(bg=c))
                delay += delta
            print x
    
    window = tk.Tk()
    window.pack_propagate(0)
    
    b = tk.Button(window, text='cycle bg', command=cycle)
    b.pack()
    
    window.mainloop()
    

    【讨论】:

    • 非常感谢;我喜欢迭代颜色并增加延迟。这应该可以完美地工作:)
    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多