Python добавить время к обратному отсчету времени уже работает
Я хочу иметь приложение, в котором, если я нажимаю кнопку, я добавляю X времени к моему таймеру обратного отсчета.
Я предполагаю, что я должен использовать темы для этого, но я не уверен, как это реализовать..
Вот код, который у меня есть:
def countdown_controller(add_time):
end_it = False
def timer(time_this):
start = time.time()
lastprinted = 0
finish = start + time_this
while time.time() < finish:
now = int(time.time())
if now != lastprinted:
time_left = int(finish - now)
print time_left
lastprinted = now
if end_it == True:
now = finish
time.sleep(0.1)
# Check if the counter is running otherwise just add time.
try:
time_left
except NameError:
timer(add_time)
else:
if time_left == 0:
timer(add_time)
else:
add_this = time_left
end_it = True
while now != finish:
time.sleep(0.1)
timer(add_time + add_this)
Очевидно, это не будет работать, потому что каждый раз, когда я звоню countdown_controller(15)
FX, он начнет обратный отсчет в течение 15 секунд, и если я нажму на мою кнопку, ничего не произойдет, пока не закончится таймер.
Помощь будет принята с благодарностью.
2 ответа
Я бы сказал, что в дизайне кода есть недостаток, потому что ваш экран блокирует всю программу, ничего не делая (time.sleep(0.1)
).
Как правило, в этих случаях вы хотите, чтобы в вашей программе был основной цикл, который циклически повторял различные операции, запускающие вашу программу. Это гарантирует разумное распределение системных ресурсов между различными задачами.
В вашем конкретном случае, что вы хотели бы иметь в вашем основном цикле:
- Проверьте пользовательский ввод (было ли добавлено дополнительное время?)
- Обновить вывод обратного отсчета
Пример реализации:
import time
import curses
# The timer class
class Timer():
def __init__(self):
self.target = time.time() + 5
def add_five(self):
self.target += 5
def get_left(self):
return int(self.target-time.time())
# The main program
t = Timer()
stdscr = curses.initscr()
stdscr.nodelay(True)
curses.noecho()
# This is the main loop done in curses, but you can implement it with
# a GUI toolkit or any other method you wish.
while True:
left = t.get_left()
if left <= 0:
break
stdscr.addstr(0, 0, 'Seconds left: %s ' % str(left).zfill(3))
c = stdscr.getch()
if c == ord('x') :
t.add_five()
# Final operations start here
stdscr.keypad(0)
curses.echo()
curses.endwin()
print '\nTime is up!\n'
Приведенная выше программа увеличит счетчик на 5 секунд, если вы нажмете x
ключ (строчные). Большая часть кода является образцом для использования curses
модуля, но, конечно, если вы используете PyGTK, PySide или любой другой графический инструментарий, он будет другим.
РЕДАКТИРОВАТЬ: Как правило, в python вы хотите избегать многопоточности настолько, насколько это возможно, и потому, что это часто (но не всегда) замедляет программы (см. " Глобальная блокировка интерпретатора"), и потому, что это затрудняет отладку программного обеспечения / поддерживать.
НТН!
Я бы наверное Timer
объект с finish
атрибут, к которому я мог бы просто добавить int. Есть что timer
работает в другом потоке, который вы можете запросить текущее время, оставшееся от вашего графического интерфейса.
class Timer(object):
def __init__(self, length):
self.finish = time.time() + length
def get_time(self):
return time.time() >= self.finish