Example #1
0
    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')
Example #2
0
    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')
Example #3
0
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