如何使倒数显示在tkinter窗口而不是cmd中?

时间:2019-01-07 15:59:52

标签: python tkinter

此代码基本上允许用户设置倒数计时(以秒为单位),当倒数计时为零时,将显示一条消息。我是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()

2 个答案:

答案 0 :(得分:3)

您应避免使用sleep,因为它会停止该过程,并且您将看不到“动画”。

.after(delay,callback = None)是为所有tkinter小部件定义的方法。给定延迟(以毫秒为单位)后,此方法仅调用函数回调。
Read more
它从x秒开始倒数,当它达到0时,屏幕上会出现一个消息框。

enter image description here

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()

Demo