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しますstop。resetリセットします。
時間表示の更新メソッド:
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()