繁体   English   中英

触发时如何在按钮上设置倒数计时器

[英]How to make a count down timer on button when triggered

所以我试图以 mm:ss 的形式创建一个倒计时计时器,并在按下按钮时以 1 秒的间隔开始倒计时。 我试图在倒计时时也让计时器显示在按钮上。 这是我到目前为止所拥有的,我不知道该怎么做。

import tkinter as tk
root = tk.Tk()
monsterTimer = '00:02'
def converter(sec):
    m, s = map(int, sec.split(":"))
    sec = m * 60 + s
    sec -= 1
    m, s = divmod(sec, 60)
    sec = (f'{m:02d}:{s:02d}')
    if sec != '00:00':
        sec = 'end'
    root.after(1000, converter)
    return sec

def update_btn_text():
    btn_text.set(converter(monsterTimer))

btn_text = tk.StringVar()
btn_text.set(monsterTimer)
btn = tk.Button(root, textvariable=btn_text, command=lambda: update_btn_text())
btn.place(x=10, y=10)
root.mainloop()

您的解决方案很接近,使用after而不是线程是 go 的正确方法。

第一个问题是,当您使用root.after时,您正在调用converter ,但您没有传入参数。 您需要将行更改为如下所示,它将每秒调用converter(sec)

root.after(1000, converter, sec)

您遇到的另一个问题是,如果不是00:00,您将set'end' 只有00:00 时才需要设置它:

if sec == '00:00':
    sec = 'end'

第三,您需要更新converter内部的按钮文本,有时在调用after之前:

...
btn_text.set(sec)
root.after(1000, converter, sec)

最后,您根本不需要update_btn 它可以被删除,你可以从你的按钮命令中调用converter

btn = tk.Button(root, textvariable=btn_text, command=lambda: converter(monsterTimer))

把它们放在一起,它看起来像这样:

import tkinter as tk
root = tk.Tk()
monsterTimer = '00:10'
def converter(sec):
    m, s = map(int, sec.split(":"))
    sec = m * 60 + s
    sec -= 1
    m, s = divmod(sec, 60)
    sec = (f'{m:02d}:{s:02d}')
    if sec == '00:00':
        sec = 'end'
    btn_text.set(sec)
    if sec != "end":
        root.after(1000, converter, sec)

btn_text = tk.StringVar()
btn_text.set(monsterTimer)
btn = tk.Button(root, textvariable=btn_text, command=lambda: converter(monsterTimer))
btn.place(x=10, y=10)
root.mainloop()

试试这个代码:

import tkinter as tk
import time
import threading

root = tk.Tk()
monsterTimer = '00:00'
run_tm = 5


def update_btn_text(sec):
    while sec:
        m, s = divmod(sec, 60)
        m, s = str(m).zfill(2), str(s).zfill(2)
        tm = f'{m}:{s}'
        btn_text.set(tm)
        time.sleep(1)
        sec -= 1
    btn_text.set("00:00")


def startThread(t):
    th1 = threading.Thread(target=update_btn_text, args=(t, ))
    th1.start()


btn_text = tk.StringVar()
btn_text.set(monsterTimer)
btn = tk.Button(root, textvariable=btn_text, command=lambda: startThread(run_tm))
btn.place(x=50, y=50)
root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM