window.after() 不在 for 循环中工作?

问题描述 投票:0回答:1

import random, string, tkinter
from tkinter import messagebox

char = string.punctuation + string.ascii_letters
password = ""

def generate():
    global password
    try:
        if var.get() == 0:
            messagebox.showerror("Error","Enter a number higher than 0")
        else:
            for i in range(int(var.get())):
                next_char = random.choice(char)
                password += next_char
            print(password)
            password =""
    except ValueError:
        error()

def error():
    Error_label.pack()
    Error_label.config(fg="red")
    for i in range(5):
        print("hh")
        window.after(1500, lambda : Error_label.config(fg="red"))
        window.after(1500, lambda : Error_label.config(fg="black"))


window = tkinter.Tk()
window.geometry("200x200")

var = tkinter.StringVar(window)

length_entry = tkinter.Entry(window,width=10,textvariable=var)
length_entry.pack()

generate_button = tkinter.Button(window, text="Generate",command=generate,font=("Terminal"))
generate_button.pack(pady=50)

Error_label = tkinter.Label(window,text="Error",font=("Terminal"))

window.mainloop()


在 error() 函数中,程序必须将标签颜色更改为红色并等待 1.5 秒,然后将其更改为黑色并根据 for 循环重复此操作 5 次,但不知何故,程序没有等待并直接执行此操作,我通过打印就知道了。

我尝试在不使用 for 循环的情况下执行此操作,并且它有效,但我想知道为什么它在 for 循环中不起作用。

python for-loop tkinter
1个回答
0
投票

您应该在 lambda 函数中使用默认参数来捕获循环迭代期间

i
的当前值:

def error():
    Error_label.pack()
    Error_label.config(fg="red")
    for i in range(5):
        window.after(1500 * i * 2), lambda i=i: Error_label.condig(fg="red"))
        window.after(1500 * (i * 2 + 1), lambda i=i: Error_label.config(fg="black"))
© www.soinside.com 2019 - 2024. All rights reserved.