使用 tkinter 创建计时器

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

我正在创建一个 GUI,需要有从 0 开始并每秒计数直到达到限制的计时器 这是我现在的代码

limit = 10
score = 0

def update():
    global score, limit
    time.sleep(1)
    score += 1
    ScoreL.configure(text=score)
    if score < limit:
        update()

ScoreL = tkinter.Label(window, text = score)
ScoreL.pack()
update()
window.mainloop

现在,分数每秒都会增加,但直到分数达到限制时才会打开 GUI。我怎样才能让 GUI 在分数为 0 时打开,但会继续每秒更新?

python user-interface tkinter timer
3个回答
3
投票

您可以使用 window 的 after 方法在指定的毫秒数后调用函数。

要将其用于计时器,您可以在被调用函数结束时再次调用 after 。

在函数中,您将增加分数直到达到限制,然后使用 after_cancel 方法“停止”计时器。

from tkinter import *

window = Tk()

def update(score, limit):
    score +=1
    if score < limit:
        ScoreL.configure(text=score)
        timer = window.after(1000, update, score)
    else:
        window.after_cancel(timer)
        ScoreL.configure(text='Game over')

limit = 10
score = 0
ScoreL = Label(window, text = score)
ScoreL.pack()
timer = window.after(1000, update, score, limit)
window.mainloop()

2
投票

time.sleep()
会阻止 tkinter mainloop 更新,因此只有在分数达到限制后才能看到结果,因为那时 tkinter mainloop 收回了控制权。

使用

.after()
代替:

import tkinter

window = tkinter.Tk()

limit = 10
score = 0

def update():
    global score
    score += 1
    ScoreL.configure(text=score)
    if score < limit:
        # schedule next update 1 second later
        window.after(1000, update)

ScoreL = tkinter.Label(window, text=score)
ScoreL.pack()

window.after(1000, update) # start the update 1 second later
window.mainloop()

0
投票

@acw1668 不错,非常有用。事实证明,基本代码有助于在 tkinter 中编写带有小时/分钟/秒 GUI 的简单计时器。谢谢。

从 tkinter 导入 *

类主窗口(Tk): def init(自我,标题): self.秒 = 0 self.分钟 = 0 自我小时数 = 0 self.text = "%02d:%02d:%02d" % (self.小时, self.分钟, self.秒 ) self.carry_on = True

    self.master = Tk()
    self.master.title(title)
   
    # set up a main frame
    self.window = Frame(self.master, bd=0, relief=SUNKEN)
    self.window.grid( column = 0, row = 0)

    self.ScoreL = Label(self.window, text = self.text)
    self.ScoreL.grid(row=0, column=0, sticky='NSWE', padx=5, pady=5)

    self.btn1 = Button(self.window, text = 'Quit', bd = '5',  command = self.master.destroy)
    self.btn1.grid(row=0, column=1, sticky='NSWE', padx=5, pady=5)

    self.btn2 = Button(self.window, text = 'Start', bd = '5',  command = self.start)
    self.btn2.grid(row=0, column=2, sticky='NSWE', padx=5, pady=5)

    self.btn3 = Button(self.window, text = 'Stop', bd = '5',  command = self.stop)
    self.btn3.grid(row=0, column=3, sticky='NSWE', padx=5, pady=5)
    
    self.master.mainloop()

def update(self):
    self.seconds += 1
    if self.seconds == 60:
        self.seconds = 0
        self.minutes += 1
    if self.minutes == 60:
        self.minutes = 0
        self.hours += 1
    self.text = "%02d:%02d:%02d" % (self.hours, self.minutes, self.seconds )
    self.ScoreL.configure(text=self.text)
    if self.carry_on == True:
        # schedule next update 1 second later
        self.master.after(1000, self.update)

def start(self):
    self.seconds  = 0
    self.minutes  = 0
    self.hours    = 0
    self.carry_on = True
    self.master.after(1000, self.update)

def stop(self):
    self.carry_on = False

if name == 'main': mainwin = mainwindow( "定时器" )

© www.soinside.com 2019 - 2024. All rights reserved.