chrono.py: ajouter le bouton pause

This commit is contained in:
Jephté Clain 2018-04-15 03:30:31 +04:00
parent 49df32157d
commit 33b7dbabd8
1 changed files with 94 additions and 31 deletions

123
chrono.py
View File

@ -83,13 +83,24 @@ def parse_timeout(s):
return h * 3600 + m * 60 + s return h * 3600 + m * 60 + s
class Chrono: class Chrono:
MODE_MINUTEUR = 'M'
MODE_CHRONOMETRE = 'C'
STATE_STARTED = 'started'
STATE_PAUSED = 'paused'
STATE_STOPPED = 'stopped'
ZERO = None
state = None
mode = None
timeout = None timeout = None
elapsed = None
date_start = None date_start = None
date_end = None max_elapsed = None
initial = None initial = None
started = None
def __init__(self, timeout=None, start=False): def __init__(self, timeout=None, start=False):
self.ZERO = self.__delta(0)
self.set_timeout(timeout) self.set_timeout(timeout)
if start: self.start() if start: self.start()
@ -113,31 +124,68 @@ class Chrono:
timeout = tmp timeout = tmp
if timeout == 0: timeout = None if timeout == 0: timeout = None
self.timeout = timeout self.timeout = timeout
if timeout is None: self.initial = '00:00' self.elapsed = self.ZERO
else: self.initial = self.__format(self.__delta(timeout)) self.state = self.STATE_STOPPED
if timeout is None:
self.mode = self.MODE_CHRONOMETRE
self.initial = self.__format(self.ZERO)
else:
self.mode = self.MODE_MINUTEUR
self.max_elapsed = self.__delta(timeout)
self.initial = self.__format(self.max_elapsed)
def is_chronometre(self):
return self.mode == self.MODE_CHRONOMETRE
def is_minuteur(self):
return self.mode == self.MODE_MINUTEUR
def get_elapsed(self):
if self.date_start is None: return self.ZERO
delta = Datetime.today() - self.date_start
return self.elapsed + delta
def start(self, timeout=None): def start(self, timeout=None):
if timeout is None: timeout = self.timeout if timeout is None: timeout = self.timeout
self.elapsed = self.ZERO
self.date_start = Datetime.today() self.date_start = Datetime.today()
if timeout is None: self.date_end = None self.state = self.STATE_STARTED
else: self.date_end = self.date_start + self.__delta(timeout)
self.started = True
def stop(self):
self.started = False
def is_started(self): def is_started(self):
return self.started return self.state == self.STATE_STARTED
def pause(self):
if self.state == self.STATE_PAUSED:
self.date_start = Datetime.today()
self.state = self.STATE_STARTED
else:
self.elapsed = self.get_elapsed()
self.state = self.STATE_PAUSED
def is_paused(self):
return self.state == self.STATE_PAUSED
def stop(self):
self.elapsed = self.get_elapsed()
self.state = self.STATE_STOPPED
def is_stopped(self):
return self.state == self.STATE_STOPPED
def is_end(self): def is_end(self):
return self.started and self.date_end is not None and Datetime.today() >= self.date_end if not self.is_started(): return False
if not self.is_minuteur(): return False
elapsed = self.get_elapsed()
return elapsed >= self.max_elapsed
def __repr__(self): def __repr__(self):
now = Datetime.today() elapsed = self.get_elapsed() if self.is_started() else self.elapsed
if self.date_end is None: delta = now - self.date_start if self.is_minuteur():
elif now > self.date_end: delta = Timedelta() delta = self.max_elapsed - elapsed
else: delta = self.date_end - now if delta < self.ZERO: delta = self.ZERO
return self.__format(delta) return self.__format(delta)
else:
return self.__format(elapsed)
def run_chronometre(timeout=None, autostart=False): def run_chronometre(timeout=None, autostart=False):
from Tkinter import Tk, Toplevel, Frame, Label, Entry, Button from Tkinter import Tk, Toplevel, Frame, Label, Entry, Button
@ -217,11 +265,9 @@ def run_chronometre(timeout=None, autostart=False):
class Application(Frame): class Application(Frame):
root = None root = None
chrono = None chrono = None
stop = None
def __init__(self, timeout=None, autostart=False, **kw): def __init__(self, timeout=None, autostart=False, **kw):
self.chrono = Chrono(timeout) self.chrono = Chrono(timeout)
self.stop = False
root = Tk() root = Tk()
root.title("Chronomètre") root.title("Chronomètre")
@ -229,6 +275,8 @@ def run_chronometre(timeout=None, autostart=False):
root.rowconfigure(0, weight=1) root.rowconfigure(0, weight=1)
root.bind("c", lambda event: self.do_config()) root.bind("c", lambda event: self.do_config())
root.bind("s", lambda event: self.do_start()) root.bind("s", lambda event: self.do_start())
root.bind("p", lambda event: self.do_pause())
root.bind("<space>", lambda event: self.do_pause())
root.bind("q", lambda event: self.quit()) root.bind("q", lambda event: self.quit())
self.root = root self.root = root
@ -236,19 +284,22 @@ def run_chronometre(timeout=None, autostart=False):
Frame.__init__(self, **kw) Frame.__init__(self, **kw)
self.TIME = Label(self, width=10, height=2, text=self.chrono.initial, padx=30, pady=10, font=('Helvetica', 18, "normal")) self.TIME = Label(self, width=10, height=2, text=self.chrono.initial, padx=30, pady=10, font=('Helvetica', 18, "normal"))
self.START = Button(self, text="Démarrer", command=self.do_start) self.START = Button(self, text="Start", command=self.do_start)
self.PAUSE = Button(self, text="Pause", command=self.do_pause, state="disabled")
self.CONFIG = Button(self, text="Config", command=self.do_config) self.CONFIG = Button(self, text="Config", command=self.do_config)
self.QUIT = Button(self, text="Quitter", command=self.quit) self.QUIT = Button(self, text="Quit", command=self.quit)
self.grid(column=0, row=0, sticky='nsew') self.grid(column=0, row=0, sticky='nsew')
self.TIME.grid(column=0, row=0, columnspan=3, sticky='nsew') self.TIME.grid(column=0, row=0, columnspan=4, sticky='nsew')
self.START.grid(column=0, row=1, sticky='ew') self.START.grid(column=0, row=1, sticky='ew')
self.CONFIG.grid(column=1, row=1, sticky='ew') self.PAUSE.grid(column=1, row=1, sticky='ew')
self.QUIT.grid(column=2, row=1, sticky='ew') self.CONFIG.grid(column=2, row=1, sticky='ew')
self.QUIT.grid(column=3, row=1, sticky='ew')
self.columnconfigure(0, weight=2) self.columnconfigure(0, weight=2)
self.columnconfigure(1, weight=1) self.columnconfigure(1, weight=2)
self.columnconfigure(2, weight=2) self.columnconfigure(2, weight=1)
self.columnconfigure(3, weight=1)
self.rowconfigure(0, weight=1) self.rowconfigure(0, weight=1)
if autostart: self.do_start() if autostart: self.do_start()
@ -263,15 +314,27 @@ def run_chronometre(timeout=None, autostart=False):
self.root.after(300, self.update_time) self.root.after(300, self.update_time)
def do_start(self): def do_start(self):
self.PAUSE.configure(state="normal")
self.START.configure(text="reStart")
self.chrono.start() self.chrono.start()
self.update_time() self.update_time()
def do_pause(self):
self.chrono.pause()
if self.chrono.is_paused():
self.PAUSE.configure(text="unPause")
else:
self.PAUSE.configure(text="Pause")
self.update_time()
def do_config(self): def do_config(self):
chrono = self.chrono chrono = self.chrono
chrono.stop() chrono.stop()
config = Config(self.root) config = Config(self.root)
if config.have_result: if config.have_result:
try: try:
self.PAUSE.configure(text="Pause", state="disabled")
self.START.configure(text="Start")
chrono.set_timeout(config.result) chrono.set_timeout(config.result)
self.TIME.configure(text=chrono.initial) self.TIME.configure(text=chrono.initial)
except: except:
@ -320,14 +383,14 @@ if __name__ == '__main__':
AP.set_defaults(autostart=None, timeout=None) AP.set_defaults(autostart=None, timeout=None)
AP.add_argument('timeout', metavar='TIMEOUT', nargs='?', AP.add_argument('timeout', metavar='TIMEOUT', nargs='?',
help=u"""\ help=u"""\
>>> (valeur vide) >>> '' (valeur vide)
chronomètre qui démarre à 0:00 et ne s'arrête pas chronomètre qui démarre à 0:00 et ne s'arrête pas
>>> H:M:S (heures:minutes:secondes) >>> 'H:M:S' (heures:minutes:secondes)
>>> ou M:S (minutes:secondes) >>> ou 'M:S' (minutes:secondes)
>>> ou M (minutes) >>> ou 'M' (minutes)
minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin
du décompte, une sonnerie retentit. du décompte, une sonnerie retentit.
>>> @H[:M[:S]] >>> '@H[:M[:S]]'
minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure
d'arrivée, et que la durée est calculée automatiquement""") d'arrivée, et que la durée est calculée automatiquement""")
AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false', AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false',