def test_running_and_move(self, time_mock): c = Clock() self.assertFalse(c.running) time_mock.return_value = 100 c.start() self.assertTrue(c.running) c.move(300) time_mock.return_value = 400 c.stop() self.assertFalse(c.running) self.assertEqual(c.display_time(True), '00:10:00')
def test_works(self): with patch('time.time') as time_mock: c = Clock() time_mock.return_value = 0 c.start() time_mock.return_value = 5 c.stop() self.assertEqual(c.elapsed_time(), 5) time_mock.return_value = 10 c.start() time_mock.return_value = 65 c.stop() self.assertEqual(c.elapsed_time(), 60) self.assertEqual(c.display_time(True), '00:01:00')
class StopWatch(tk.Frame): def __init__(self, master=None): super().__init__(master) self.clock = Clock() self.with_seconds = False self.timestr = tk.StringVar() self.create_widgets() def create_widgets(self): self.lbl_display = tk.Label(self, textvariable=self.timestr) self.lbl_display.pack(side=tk.LEFT) self.lbl_display.bind('<Double-Button-1>', self.reset) self.lbl_display.bind('<Button-4>', self.add) self.lbl_display.bind('<Button-5>', self.substract) self.lbl_display.bind('<Button-3>', self.toggle_show_seconds) # self.lbl_display.bind('<MouseWheel>', self.add) # windows self.update_label() self.btn_start_stop = tk.Button(self, text=START_TEXT, padx=5, pady=0, command=self.start_stop) self.btn_start_stop.pack(side=tk.LEFT) self.btn_close = tk.Button(self, text=CLOSE_TEXT, padx=5, pady=0, command=quit) self.btn_close.pack(side=tk.LEFT) ## Event handlers def start_stop(self): if self.clock.running: self.clock.stop() self.cancel_refresh_loop() self.btn_start_stop.config(text=START_TEXT) else: self.clock.start() self.refresh_loop() self.btn_start_stop.config(text=STOP_TEXT) def substract(self, event): self.clock.move(-300) self.update_label() def add(self, event): self.clock.move(300) self.update_label() def reset(self, event): if self.clock.running: return self.clock.reset() self.update_label() def toggle_show_seconds(self, event): self.with_seconds = not self.with_seconds if self.clock.running: self.cancel_refresh_loop() self.refresh_loop() else: self.update_label() ## Helper methods def refresh_loop(self): self.update_label() self.refresh_loop_reference = self.after(self.refresh_interval(), self.refresh_loop) def cancel_refresh_loop(self): if not hasattr(self, 'refresh_loop_reference'): return self.after_cancel(self.refresh_loop_reference) def update_label(self): self.timestr.set(self.clock.display_time(self.with_seconds)) def refresh_interval(self): return 1000 if self.with_seconds else 60000 # in milisec