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
Другие вопросы по тегам