此代码基本上允许用户设置倒数计时(以秒为单位),当倒数计时为零时,将显示一条消息。我是tkinter和python的初学者,所以我不完全知道如何在tkinter窗口中显示倒数,因为它仅显示在cmd中。
import time
import tkinter as Alarm
class test(Alarm.Frame):
def __init__(self, parent):
Alarm.Frame.__init__(self, parent)
self.prompt = Alarm.Label(self, text="Enter seconds:", anchor="w")
self.entry = Alarm.Entry(self)
self.output = Alarm.Label(self, text="")
self.submit = Alarm.Button(self, text="Submit", command = self.startTimer)
self.prompt.pack(side="top", fill="x")
self.entry.pack(side="top", fill="x", padx=20)
self.output.pack(side="top", fill="x", expand=True)
self.submit.pack(side="right")
def countdown(k,q):
j=q
k=0
while True:
if(j>=0):
print(str(j),end="\r")
time.sleep(1)
j-=1
if(j==-1):
break
if(j==-1):
print("Alarm!", end="\r")
time.sleep(1)
def startTimer(self):
try:
i = int(self.entry.get())
self.countdown(i)
except ValueError:
print("Please enter whole digits only in all boxes")
if __name__ == "__main__":
root = Alarm.Tk()
test(root).pack(fill="both", expand=True)
root.mainloop()
答案 0 :(得分:3)
您应避免使用sleep
,因为它会停止该过程,并且您将看不到“动画”。
.after(delay,callback = None)是为所有tkinter小部件定义的方法。给定延迟(以毫秒为单位)后,此方法仅调用函数回调。Read more
import time
import tkinter as Alarm
from tkinter import messagebox
class test(Alarm.Frame):
def __init__(self, parent):
Alarm.Frame.__init__(self, parent)
self.prompt = Alarm.Label(self, text="Enter seconds:", anchor="w")
self.entry = Alarm.Entry(self)
self.output = Alarm.Label(self, text="")
self.submit = Alarm.Button(self, text="Submit", command = self.startTimer)
self.secondsLabel = Alarm.Label(self, text="")
self.prompt.pack(side="top", fill="x")
self.entry.pack(side="top", fill="x", padx=20)
self.output.pack(side="top", fill="x", expand=True)
self.submit.pack(side="right")
self.secondsLabel.pack(side="left", fill="x")
self.seconds = 0
def countdown(self):
if self.seconds > 0:
self.seconds -= 1
self.secondsLabel.after(1000, lambda: self.countdown())
else:
messagebox.showinfo("DONE")
self.secondsLabel.configure(text="%i s" % self.seconds)
def startTimer(self):
try:
time = int(self.entry.get())
self.seconds = time
self.countdown()
except ValueError:
print("Please enter whole digits only in all boxes")
if __name__ == "__main__":
root = Alarm.Tk()
test(root).pack(fill="both", expand=True)
root.mainloop()
答案 1 :(得分:2)
如果要显示一些动画,可以使用after()
。不要使用time.sleep()
,因为它会冻结您的mainloop
。
import tkinter as Alarm
class test(Alarm.Frame):
def __init__(self, parent):
Alarm.Frame.__init__(self, parent)
self.prompt = Alarm.Label(self, text="Enter seconds:", anchor="w")
self.entry = Alarm.Entry(self)
self.output = Alarm.Label(self, text="Start")
self.submit = Alarm.Button(self, text="Submit", command = self.startTimer)
self.prompt.pack(side="top", fill="x")
self.entry.pack(side="top", fill="x", padx=20)
self.output.pack(side="top", fill="x", expand=True)
self.submit.pack(side="right")
def countdown(self, s):
if s==0:
self.output.configure(text="Alarm!")
return
self.output.configure(text=str(s))
s -= 1
self.output.after(1000, lambda: self.countdown(s))
def startTimer(self):
try:
i = int(self.entry.get())
self.countdown(i)
except ValueError:
print("Please enter whole digits only in all boxes")
if __name__ == "__main__":
root = Alarm.Tk()
test(root).pack(fill="both", expand=True)
root.mainloop()