我正在创建一个 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 时打开,但会继续每秒更新?
您可以使用 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()
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()
@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( "定时器" )