Как сделать так, чтобы обратный отсчет отображался в окне tkinter, а не в моем cmd? - PullRequest
0 голосов
/ 07 января 2019

Этот код в основном позволяет пользователю установить обратный отсчет (в секундах), и когда обратный отсчет достигает нуля, появляется сообщение. Я новичок в 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 голосов
/ 07 января 2019

Вам следует избегать sleep, потому что это останавливает процесс, и вы не сможете увидеть «анимацию».

.after (delay, callback = None) - это метод, определенный для всех виджетов tkinter. Этот метод просто вызывает функцию обратного вызова после заданной задержки в мс.
Подробнее
Он отсчитывает от 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()
0 голосов
/ 07 января 2019

Если вы хотите показать анимацию, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...