chrono.py: ajouter le bouton pause
This commit is contained in:
parent
49df32157d
commit
33b7dbabd8
123
chrono.py
123
chrono.py
|
@ -83,13 +83,24 @@ def parse_timeout(s):
|
|||
return h * 3600 + m * 60 + s
|
||||
|
||||
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
|
||||
elapsed = None
|
||||
date_start = None
|
||||
date_end = None
|
||||
max_elapsed = None
|
||||
initial = None
|
||||
started = None
|
||||
|
||||
def __init__(self, timeout=None, start=False):
|
||||
self.ZERO = self.__delta(0)
|
||||
self.set_timeout(timeout)
|
||||
if start: self.start()
|
||||
|
||||
|
@ -113,31 +124,68 @@ class Chrono:
|
|||
timeout = tmp
|
||||
if timeout == 0: timeout = None
|
||||
self.timeout = timeout
|
||||
if timeout is None: self.initial = '00:00'
|
||||
else: self.initial = self.__format(self.__delta(timeout))
|
||||
self.elapsed = self.ZERO
|
||||
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):
|
||||
if timeout is None: timeout = self.timeout
|
||||
self.elapsed = self.ZERO
|
||||
self.date_start = Datetime.today()
|
||||
if timeout is None: self.date_end = None
|
||||
else: self.date_end = self.date_start + self.__delta(timeout)
|
||||
self.started = True
|
||||
|
||||
def stop(self):
|
||||
self.started = False
|
||||
self.state = self.STATE_STARTED
|
||||
|
||||
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):
|
||||
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):
|
||||
now = Datetime.today()
|
||||
if self.date_end is None: delta = now - self.date_start
|
||||
elif now > self.date_end: delta = Timedelta()
|
||||
else: delta = self.date_end - now
|
||||
elapsed = self.get_elapsed() if self.is_started() else self.elapsed
|
||||
if self.is_minuteur():
|
||||
delta = self.max_elapsed - elapsed
|
||||
if delta < self.ZERO: delta = self.ZERO
|
||||
return self.__format(delta)
|
||||
else:
|
||||
return self.__format(elapsed)
|
||||
|
||||
def run_chronometre(timeout=None, autostart=False):
|
||||
from Tkinter import Tk, Toplevel, Frame, Label, Entry, Button
|
||||
|
@ -217,11 +265,9 @@ def run_chronometre(timeout=None, autostart=False):
|
|||
class Application(Frame):
|
||||
root = None
|
||||
chrono = None
|
||||
stop = None
|
||||
|
||||
def __init__(self, timeout=None, autostart=False, **kw):
|
||||
self.chrono = Chrono(timeout)
|
||||
self.stop = False
|
||||
|
||||
root = Tk()
|
||||
root.title("Chronomètre")
|
||||
|
@ -229,6 +275,8 @@ def run_chronometre(timeout=None, autostart=False):
|
|||
root.rowconfigure(0, weight=1)
|
||||
root.bind("c", lambda event: self.do_config())
|
||||
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())
|
||||
self.root = root
|
||||
|
||||
|
@ -236,19 +284,22 @@ def run_chronometre(timeout=None, autostart=False):
|
|||
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.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.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.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.CONFIG.grid(column=1, row=1, sticky='ew')
|
||||
self.QUIT.grid(column=2, row=1, sticky='ew')
|
||||
self.PAUSE.grid(column=1, 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(1, weight=1)
|
||||
self.columnconfigure(2, weight=2)
|
||||
self.columnconfigure(1, weight=2)
|
||||
self.columnconfigure(2, weight=1)
|
||||
self.columnconfigure(3, weight=1)
|
||||
self.rowconfigure(0, weight=1)
|
||||
|
||||
if autostart: self.do_start()
|
||||
|
@ -263,15 +314,27 @@ def run_chronometre(timeout=None, autostart=False):
|
|||
self.root.after(300, self.update_time)
|
||||
|
||||
def do_start(self):
|
||||
self.PAUSE.configure(state="normal")
|
||||
self.START.configure(text="reStart")
|
||||
self.chrono.start()
|
||||
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):
|
||||
chrono = self.chrono
|
||||
chrono.stop()
|
||||
config = Config(self.root)
|
||||
if config.have_result:
|
||||
try:
|
||||
self.PAUSE.configure(text="Pause", state="disabled")
|
||||
self.START.configure(text="Start")
|
||||
chrono.set_timeout(config.result)
|
||||
self.TIME.configure(text=chrono.initial)
|
||||
except:
|
||||
|
@ -320,14 +383,14 @@ if __name__ == '__main__':
|
|||
AP.set_defaults(autostart=None, timeout=None)
|
||||
AP.add_argument('timeout', metavar='TIMEOUT', nargs='?',
|
||||
help=u"""\
|
||||
>>> (valeur vide)
|
||||
>>> '' (valeur vide)
|
||||
chronomètre qui démarre à 0:00 et ne s'arrête pas
|
||||
>>> H:M:S (heures:minutes:secondes)
|
||||
>>> ou M:S (minutes:secondes)
|
||||
>>> ou M (minutes)
|
||||
>>> 'H:M:S' (heures:minutes:secondes)
|
||||
>>> ou 'M:S' (minutes:secondes)
|
||||
>>> ou 'M' (minutes)
|
||||
minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin
|
||||
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
|
||||
d'arrivée, et que la durée est calculée automatiquement""")
|
||||
AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false',
|
||||
|
|
Loading…
Reference in New Issue