Похоже, что мой таймер не тикает, и в цикле не генерируется ошибок

#python #python-2.7

#python #python-2.7

Вопрос:

У кого-нибудь есть представление о том, что здесь происходит не так, я не получаю никаких ошибок в окне консоли, и событие click работает, но оно просто меняется на время и на самом деле никогда не тикает вот мой код…

РЕДАКТИРОВАТЬ — Это компилируется и выполняется нормально, когда вы нажимаете на ярлык, текст меняется на таймер и должен начать тикать. Событие click работает нормально, вы можете щелкнуть по метке, затем оно переходит в указанное время начала 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. Из этого кода очень неясно, чего вы пытаетесь достичь здесь. Что должно произойти, когда вы нажимаете на метку?

2. Извините за это, да, это просто событие click, связанное с меткой. Когда вы нажимаете на метку, текст должен превратиться в таймер, и это происходит, но он не тикает.

3. И таймер должен вести обратный отсчет с 4: 59 до 0: 00?

4. правильно, извините за недостающую информацию, я добавил правку

5. не единственная проблема, но sec == 59 должна быть sec = 59

Ответ №1:

С вашим кодом было много проблем, поэтому я попробовал переделать его для вас.

Это должно соответствовать вашим потребностям:

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

В частности:

  • Вы не всегда использовали self при обращении к minutes и sec
  • У вас не было «цикла» для выполнения обратного отсчета (для этого и нужен вызов after )
  • Вы не очень хорошо контролировали состояние графического интерфейса, то есть то, что должно было произойти, если дважды щелкнуть по ярлыку. Именно это обрабатывает running атрибут, который я добавил
  • Вы делали очень странные вещи со своей my_label_timer функцией, вы не можете вызывать двухпараметрическую функцию с одним параметром за раз.
  • У вас было несколько логических ошибок в вашем коде с уменьшением количества минут / секунд

Комментарии:

1. Большое спасибо, мой способ был мусором по сравнению с этим, намного аккуратнее и понятнее, спасибо. Потрясающе, спасибо, что включили в конкретную часть!

2. @PadraicCunningham Совершенно прав, не задержался на целых 5 минут, чтобы протестировать это … исправлено!