我的计时器似乎没有滴答作响,并且循环中没有抛出任何错误

时间:2014-07-05 17:42:38

标签: python python-2.7

有没有人知道这里出了什么问题,我没有在控制台窗口中出现任何错误,点击事件有效,但它只是改变了时间而且实际上从来没有在这里打勾是我的代码......

编辑 - 编译并运行正常,当您单击标签时,文本将更改为计时器并应开始打勾。点击事件工作正常,你可以点击标签然后变成特定的开始时间4:59但冻结并且不会打勾。

from Tkinter import *
from time import *
from Queue import *
from threading import *

class exp_timer(Frame):
  def __init__(self):
    c = Frame.__init__(self)
    self.master.title("Exp Bonus")
    self.master.geometry("350x250")

    self.five_exp = Label(c,text = "5% exp")

    self.five_exp.grid(row=0,column=0)   

    self.five_exp.bind("<Button-1>",self.five_exp_click)

    self.minutes = 4
    self.sec = 59


  def my_label_timer(minutes,sec):
    sec -= 1
    if sec < 60:
        sec -= 1
    if sec == 0:
        sec = 59
        minutes -=1
    if minutes == 0 and sec == 0:
      return self.five_exp.configure(text="5% exp")

  def five_exp_start(self):
    self.five_exp.configure(text = "{0}:{1:02}".format(self.minutes,self.sec))
    self.five_exp.update()
    self.minutes = self.my_label_timer(self.minutes)
    self.sec = self.my_label_timer(self.sec)
  def five_exp_click(self,event):
    self.five_exp.configure(self.five_exp_start())
    self.five_exp.update()



exp_timer().mainloop()

1 个答案:

答案 0 :(得分:0)

您的代码存在很多问题,因此我已经为您重新安装了代码。

这应该符合您的需求:

class exp_timer(Frame):
    def __init__(self):
        c = Frame.__init__(self)
        self.master.title("Exp Bonus")
        self.master.geometry("350x250")
        self.label = Label(c, text="start")
        self.label.grid(row=0, column=0)   
        self.label.bind("<Button-1>",self.label_click)
        self.running = False

    def label_click(self,event):
        if not self.running:
            self.start()

    def start(self):
        self.running = True
        self.minutes = 5
        self.sec = 0
        self.tick()

    def tick(self):
        self.sec -= 1
        if self.sec < 0:
            self.sec = 59
            self.minutes -=1
        if self.minutes >= 0 and self.sec >= 0:
            self.label.configure(text = "{0}:{1:02}".format(self.minutes, self.sec))
            self.after(1000, self.tick)
        else:
            self.label.configure(text="start")
            self.running = False

exp_timer().mainloop()

特别是:

  • 在提及selfminutes
  • 时,您并不总是使用sec
  • 你没有&#34;循环&#34;倒计时(这是after的召唤)
  • 你没有很好地控制GUI的状态,即如果标签被点击两次会发生什么。这就是我添加的running属性处理
  • 你使用my_label_timer函数做了很奇怪的事情,你不能一次用一个参数调用一个双参数函数。
  • 您的分钟/秒递减代码中存在一些逻辑错误