tkinterで作るストップウォッチ


こんなかんじでストップウォッチを作ることができます

モジュールのインポートとクラス定義:

import tkinter as tk
from datetime import datetime

class StopwatchApp:
    def __init__(self, root):

必要なモジュールをインポートし、というStopwatchApp名前のクラスを定義します。このクラスは Tkinter ウィンドウ内のストップウォッチ アプリケーションを構築します。

クラスの初期化メソッド__init__:

    def __init__(self, root):
        self.root = root
        self.root.title("Sleek Stopwatch")
        self.root.geometry("300x180")
        self.root.configure(bg="#333")

        self.running = False
        self.start_time = None
        self.elapsed_time = 0

        self.time_label = tk.Label(root, text="00:00:0", font=("Helvetica", 48), fg="#fff", bg="#333")
        self.time_label.pack(pady=20)

        button_frame = tk.Frame(root, bg="#333")
        button_frame.pack()

        self.start_button = self.create_button(button_frame, "Start", self.start, "#4CAF50")
        self.stop_button = self.create_button(button_frame, "Stop", self.stop, "#FF5733")
        self.reset_button = self.create_button(button_frame, "Reset", self.reset, "#3498DB")

        self.update_time()

このメソッドは、ウィンドウの初期設定と各種ウィジェットの構成を行います。具体的には、ウィンドウのタイトルやサイズ、背景色を設定し、ラベルとボタンを配置します。また、ストップウォッチの動作を管理しますするための変数や時間を初期化し、update_timeメソッドを定期的に呼び出して時間表示を更新します。

ボタンの作成メソッドcreate_button:

    def create_button(self, frame, text, command, color):
        button = tk.Button(frame, text=text, font=("Helvetica", 12), command=command, bg=color, fg="#fff")
        button.pack(side=tk.LEFT, padx=10)
        return button

このメソッドは、指定されたフレーム内にボタンを作成し、ボタンのテキスト、クリック時のコマンド、背景色などを設定します。作成されたボタンをフレーム内に配置し、ボタンオブジェクトを返します。

ストップウォッチの制御メソッド:

    def start(self):
        if not self.running:
            self.running = True
            self.start_time = datetime.now()
            self.update_time()

    def stop(self):
        if self.running:
            self.running = False
            self.elapsed_time += (datetime.now() - self.start_time).total_seconds()

    def reset(self):
        self.running = False
        self.start_time = None
        self.elapsed_time = 0
        self.update_time()

これらのメソッドは、それぞれ「Start」、「Stop」、「Reset」ボタンがクリックされたときに呼び出されます。メソッドはストップウォッチのカウントを開始し、メソッドはカウントを停止startしますstopresetリセットします。

時間表示の更新メソッド:

    def update_time(self):
        if self.running:
            elapsed = self.elapsed_time + (datetime.now() - self.start_time).total_seconds()
        else:
            elapsed = self.elapsed_time
        
        hours = int(elapsed // 3600)
        minutes = int((elapsed % 3600) // 60)
        seconds = elapsed % 60
        seconds_decimal = format(seconds, ".1f")
        
        time_string = f"{hours:02d}:{minutes:02d}:{seconds_decimal}"
        self.time_label.config(text=time_string)
        self.root.after(100, self.update_time)

このメソッドは、ストップウォッチの時間表示を更新します。メソッド内で、を使用して100ミリごとにメソッド自体を再帰的に呼び出すことで、両方が常にupdate_time更新self.root.afterされるようになっています。を適切なフォーマットで計算し、ラベルに表示します。

メインループの開始:

root = tk.Tk()
app = StopwatchApp(root)
root.mainloop()

Tkinter ウィンドウのメインループを開始し、ユーザーのアクションを待ちます。

あんまりすべてのコードを書いてしまうと勉強にならないのですがやってみたいっていう人だけのために一応書いておきます。

import tkinter as tk
from datetime import datetime

class StopwatchApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Sleek Stopwatch")
        self.root.geometry("300x180")
        self.root.configure(bg="#333")

        self.running = False
        self.start_time = None
        self.elapsed_time = 0

        self.time_label = tk.Label(root, text="00:00:0", font=("Helvetica", 48), fg="#fff", bg="#333")
        self.time_label.pack(pady=20)

        button_frame = tk.Frame(root, bg="#333")
        button_frame.pack()

        self.start_button = self.create_button(button_frame, "Start", self.start, "#4CAF50")
        self.stop_button = self.create_button(button_frame, "Stop", self.stop, "#FF5733")
        self.reset_button = self.create_button(button_frame, "Reset", self.reset, "#3498DB")

        self.update_time()

    def create_button(self, frame, text, command, color):
        button = tk.Button(frame, text=text, font=("Helvetica", 12), command=command, bg=color, fg="#fff")
        button.pack(side=tk.LEFT, padx=10)
        return button
        
    def start(self):
        if not self.running:
            self.running = True
            self.start_time = datetime.now()
            self.update_time()

    def stop(self):
        if self.running:
            self.running = False
            self.elapsed_time += (datetime.now() - self.start_time).total_seconds()

    def reset(self):
        self.running = False
        self.start_time = None
        self.elapsed_time = 0
        self.update_time()

    def update_time(self):
        if self.running:
            elapsed = self.elapsed_time + (datetime.now() - self.start_time).total_seconds()
        else:
            elapsed = self.elapsed_time
        
        hours = int(elapsed // 3600)
        minutes = int((elapsed % 3600) // 60)
        seconds = elapsed % 60
        seconds_decimal = format(seconds, ".1f")
        
        time_string = f"{hours:02d}:{minutes:02d}:{seconds_decimal}"
        self.time_label.config(text=time_string)
        self.root.after(100, self.update_time)

root = tk.Tk()
app = StopwatchApp(root)
root.mainloop()

いいなと思ったら応援しよう!