#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 минут, чтобы протестировать это … исправлено!