tkinter鼠标点击计数器不会脱离我的倒计时循环

时间:2018-06-22 13:03:23

标签: python tkinter

我正在尝试使用tkinter在python中编写一个小程序,以计算鼠标在60秒内单击按钮的次数,但是我遇到了一个问题:我无法中断倒计时循环

下面是我的代码:

from tkinter import *

class Application(Frame):
    def __init__(self,master):
        super(Application,self).__init__(master)
        self.pack()
        self.bttn_clicks = 0
        self.createWidgets()

    def createWidgets(self):

        self.labelvariable = StringVar()
        self.labelvariable.set("60")

        self.thelabel = Label(self,textvariable = self.labelvariable,font=('Helvetica',50))
        self.thelabel.pack(side=TOP)

        self.firstButton = Button(self, text="Start", command=self.update_count)
        self.firstButton.pack(side=TOP)

    def update_count(self):
        self.bttn_clicks += 1
        self.firstButton["text"] = "Counter: " + str(self.bttn_clicks)
        if self.bttn_clicks == 1:
            countdown(1559)

def countdown(timeInSeconds):
    mins, secs = divmod(timeInSeconds, 60)
    timeformat = "{1:02d}".format(mins, secs)
    app.labelvariable.set(timeformat)
    root.after(1000, countdown, timeInSeconds-1)

if __name__ == '__main__':
    root = Tk()
    root.title("Timer")
    app = Application(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

我要做的是将所有内容保留在班级内。使用外部功能只会使事情变得更难管理。

那是说您应该使用IntVar()而不是字符串var,因为这将有助于我们跟踪时间。

我的下面代码将首先检查计时器是否为60。如果是,则开始递减计数并添加到计数器。当计数器达到零时,该按钮将禁用其命令,并且不再添加到计数器中。

我更改的另一件事是为计时器添加管理器方法。因为我们现在正在使用IntVar(),所以我们要做的只是一个get()命令,后跟-1after()语句,以使计时器一直运行到零。

我还清理了一些代码以遵循PEP8标准。

import tkinter as tk

class Application(tk.Frame):
    def __init__(self,master):
        super(Application,self).__init__(master)
        self.bttn_clicks = 0
        self.labelvariable = tk.IntVar()
        self.create_widgets()

    def create_widgets(self):
        self.labelvariable.set(60)
        self.thelabel = tk.Label(self, textvariable=self.labelvariable, font=('Helvetica',50))
        self.thelabel.pack(side=tk.TOP)
        self.firstButton = tk.Button(self, text="Start", command=self.update_count)
        self.firstButton.pack(side=tk.TOP)

    def update_count(self):
        if self.labelvariable.get() == 60:
            self.manage_countdown()
        if self.labelvariable.get() != 0:
            self.bttn_clicks += 1
            self.firstButton.config(text="Counter: {}".format(self.bttn_clicks))
        else:
            self.firstButton.config(command=None)

    def manage_countdown(self):
        if self.labelvariable.get() != 0:
            self.labelvariable.set(self.labelvariable.get() - 1)
            self.after(1000, self.manage_countdown)


if __name__ == '__main__':
    root = tk.Tk()
    root.title("Timer")
    app = Application(root).pack()
    root.mainloop()