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 循环中不起作用。
您应该在 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"))