python tkinter 验证码按钮部分问题

点完按钮后不显示“(x)秒后重试”
只在最后闪一下
代码:


import tkinter as tk
from time import sleep

i = 5
def setdisabled():
         global i

         if i != 0:
                  a = '(' + str(i) + 's)后重试'
#                 btn.config(textvariable = a,state = tk.DISABLED,bg="#ccc")
                  btn.config(text = a,state = tk.DISABLED,bg="#ccc")
                  i -= 1
                  sleep(1)
         root.after(100,setnormal)
 
def setnormal():
         btn.config(text = '获取验证码',state = tk.NORMAL,bg = "#090")
 
root = tk.Tk()
 
btn = tk.Button(root,text = '获取验证码',command = setdisabled,bg = "#090")
btn.pack()
 
root.mainloop()

python版本:3.8

有几个问题:

  1. 你应该循环判断时间是否为0s,即使用while而不是单纯的if语句
  2. 每次更新秒数都要刷新界面
    具体代码:
 
import tkinter as tk
from time import sleep
 
i = 5
def setdisabled():
    global i

    while i != 0:
        a = '(' + str(i) + 's)后重试'
        #                 btn.config(textvariable = a,state = tk.DISABLED,bg="#ccc")
        btn.config(text = a,state = tk.DISABLED,bg="#ccc")
        root.update()
        i -= 1
        sleep(1)
    root.after(100,setnormal)
 
def setnormal():
         btn.config(text = '获取验证码',state = tk.NORMAL,bg = "#090")
 
root = tk.Tk()
 
btn = tk.Button(root,text = '获取验证码',command = setdisabled,bg = "#090")
btn.pack()
 
root.mainloop()

这样就可以达成你想要的效果。
ps:多线程可以,但没必要。

在 tk 主线程里sleep , 会让整个界面假死。
你改成 sleep(10) 试试 , 窗口都拖不动了。

你的需求,要结合线程来完成 ,开一个线程去控制显示的内容。