I made a stopwatch with tkinter

├── stop_watch.bat
├── code
│   └── main.py
└── sound
└── Appropriate music file.mp3
main.py
import os
import time
import pickle
import tkinter as tk
import tkinter.font as tk_font
import threading
from pygame import mixer
class StopWatch:
    def __init__(self):
        self.prev_path = '../prev.pickle'
        self.sound_path = '../sound/Appropriate music file.mp3'
        self.time_value = self.load_pickle(self.prev_path)
        if self.time_value is None:
            self.time_value = 0
        self.starting_time_value = self.time_value
        w0 = 40
        y0 = 60
        y02 = y0 -20
        w1 = 80
        h1 = 40
        wspace = 10
        w2 = w1 * 3 + wspace * 2
        h2 = 50
        x1 = 40
        x2 = x1 + w1 + wspace
        x3 = x2 + w1 + wspace
        x0 = x3 + 60
        y1 = 10
        y2 = 95
        y3 = 140
        size1 = 56
        bg1 = '#ffffee'
        bg2 = '#ffffaa'
        bg0 = '#ffccff'
        bg02 = '#ffaaff'
        self.root = tk.Tk()
        self.enable_count_down = False
        self.root.title("Python GUI")
        self.root.geometry("340x215")
        self.time_text = tk.StringVar()
        self.time_label = tk.Label(self.root, textvariable=self.time_text, font=tk_font.Font(size=size1))
        self.time_label.place(x=x1, y=y1)
        button_up_1_hour = tk.Button(text="Time", command=self.plus_1_hour, font=tk.font.Font(size=14), bg=bg1)
        button_up_1_hour.place(x=x1, y=y2, width=w1, height=h1)
        button_up_1_min = tk.Button(text="Minutes", command=self.plus_1_min, font=tk.font.Font(size=14), bg=bg1)
        button_up_1_min.place(x=x2, y=y2, width=w1, height=h1)
        button_up_1_sec = tk.Button(text="Seconds", command=self.plus_1_sec, font=tk.font.Font(size=14), bg=bg1)
        button_up_1_sec.place(x=x3, y=y2, width=w1, height=h1)
        button_start = tk.Button(text="START/STOP", command=self.start_stop, font=tk.font.Font(size=14), bg=bg2)
        button_start.place(x=x1, y=y3, width=w2, height=h2)
        button_reset = tk.Button(text="RESET", command=self.reset, font=tk.font.Font(size=8), bg=bg0)
        button_reset.place(x=x0, y=y0, width=w0)
        button_again = tk.Button(text="AGAIN", command=self.again, font=tk.font.Font(size=8), bg=bg02)
        button_again.place(x=x0, y=y02, width=w0)
        thread = threading.Thread(target=self.count_down)
        thread.start()
        self.update()
        self.root.mainloop()
    def plus_1_hour(self):
        self.time_value += 60 * 60
        self.update()
    def plus_1_min(self):
        self.time_value += 60
        self.update()
    def plus_1_sec(self):
        self.time_value += 1
        self.update()
    def reset(self):
        self.time_value = 0
        self.enable_count_down = False
        self.update()
    def again(self):
        self.time_value = self.starting_time_value
        self.enable_count_down = False
        self.update()
    def sound(self):
        mixer.init()
        mixer.music.load(self.sound_path)
        mixer.music.play(1)
    def count_down(self):
        while True:
            if self.time_value > 0 and self.enable_count_down:
                self.time_value -= 1
                self.update()
            if self.time_value <= 0 and self.enable_count_down:
                self.time_value = 0
                self.enable_count_down = False
                self.update()
                self.sound()
            time.sleep(1)
    def start_stop(self):
        self.starting_time_value = self.time_value
        self.enable_count_down = not self.enable_count_down
    @staticmethod
    def sec_to_hms(sec):
        minutes, sec = divmod(sec, 60)
        hour, minutes = divmod(minutes, 60)
        return '{}:{:0>2}:{:0>2}'.format(hour, minutes, sec)
    def update(self):
        hms = self.sec_to_hms(self.time_value)
        self.time_text.set(hms)
        self.save_pickle(self.time_value, self.prev_path)
    @staticmethod
    def save_pickle(model, model_path, protocol=4):
        with open(model_path, mode='wb') as f:
            if protocol is None:
                pickle.dump(model, f)
            else:
                pickle.dump(model, f, protocol=protocol)
    @staticmethod
    def load_pickle(path):
        if os.path.exists(path):
            try:
                with open(path, mode='rb') as f:
                    obj = pickle.load(f)
                return obj
            except EOFError as e:
                print('load_pickle():', e)
                return None
        else:
            print('NOT FOUND load_pickle():', path)
            return None
if __name__ == '__main__':
    StopWatch()
It is convenient if you create a batch file or shell script.
stop_watch.bat
start C:/Users/username/Anaconda3/envs/conda environment name/pythonw.exe ./code/main.py
Recommended Posts