Last Updated on 2024年2月1日
こんにちは、50sEngineerです。前回はPythonを使って基本的なデスクトップストップウォッチの作成方法をご紹介しました。今回は、そのストップウォッチをさらに改良し、休憩時間が終わったことを知らせてくれる機能を追加したタイマーバージョンを作成しました。
プログラミング学習や仕事中に短い休憩を取ることは、集中力を維持する上で非常に重要です。このタイマーウォッチは、設定した休憩時間が終了するとビープ音で知らせ、画面上に表示されるコーヒーカップの画像が揺れることで視覚的にも休憩時間の終了を合図してくれます。
使用する技術
- Python: プログラミング言語
- Tkinter: Pythonの標準GUIツールキット
- timeモジュール: 時間計測に使用
- winsoundモジュール: Windows環境での音声出力に使用
- threadingモジュール: ビープ音の非同期処理に使用
ストップウォッチの機能
- スタート、ストップ、リセットボタン
- 休憩時間の終了をビープ音と画像の揺れで知らせる
- 休憩時間はユーザーがドロップダウンから設定可能
ストップウォッチのコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import tkinter from tkinter import PhotoImage, StringVar, ttk # ttkをインポート import time import winsound # Windowsの場合 import threading # ここでthreadingモジュールをインポート class Stopwatch: def __init__(self, root): """ GUIの基本設定 """ self.root = root self.root.geometry("500x350") # ウィンドウのサイズを設定 self.root.title("Break Timer") # ウィンドウのタイトル # ラベルの設定(休憩時間終了時のメッセージ表示用) self.label = tkinter.Label(root, font=("Meiryo UI", 20), text="") self.label.grid(row=0, column=0, columnspan=4, sticky='ew') # 中央配置 # 画像表示用のキャンバス設定 self.canvas = tkinter.Canvas(root, width=400, height=150) self.canvas.grid(row=3, column=0, columnspan=4) self.image = PhotoImage(file="coffee.png") # コーヒーカップの画像ファイルを読み込む # 画像をキャンバスに表示するための変数を初期化。最初は画像が表示されていないためNoneに設定 self.image_on_canvas = None # タイマー用の変数 self.start_time = 0 self.elapsed_time = 0 self.running = False self.break_time = 30 # 初期設定値としての役割を明確にする(実際の動作には影響しない) # 休憩時間設定のドロップダウン self.time_options = [5, 10, 15, 30, 45, 60] # 選択可能な休憩時間(秒)に5秒を追加 self.time_var = StringVar(root) self.time_var.set(self.time_options[3]) # ドロップダウンのデフォルト値を30秒に設定 self.option_menu = ttk.Combobox(root, textvariable=self.time_var, values=self.time_options, state="readonly", width=18, font=("Times New Roman", 15)) self.option_menu.grid(row=1, column=0, columnspan=4, pady=10) self.option_menu.bind("<<ComboboxSelected>>", self.update_break_time) # ドロップダウンの選択値が変更されたときの処理を設定 # ボタンのフォントを設定 button_font = ("Times New Roman", 15) # ボタンを配置 start_button = tkinter.Button(root, text='Start', command=self.start_break, font=button_font, bg='#AFEEEE') start_button.grid(row=2, column=0, padx=5, pady=20, sticky='nsew') stop_button = tkinter.Button(root, text='Stop', command=self.stop, font=button_font, bg='#AFEEEE') stop_button.grid(row=2, column=1, padx=5, pady=20, sticky='nsew') reset_button = tkinter.Button(root, text='Reset', command=self.reset, font=button_font, bg='#AFEEEE') reset_button.grid(row=2, column=2, padx=5, pady=20, sticky='nsew') self.root.grid_columnconfigure(0, weight=1) self.root.grid_columnconfigure(1, weight=1) self.root.grid_columnconfigure(2, weight=1) def update_break_time(self, event=None): """ ドロップダウンで選択された休憩時間を更新する """ self.break_time = int(self.time_var.get()) def start_break(self): self.update_break_time() # ここでドロップダウンで選択された時間を更新 self.show_image() self.start_time = time.time() self.running = True self.check_break_time() def beep_sound(self): """ ビープ音を「プー 1秒無音 プー」とするためのメソッド """ winsound.Beep(440, 1000) # 最初のプー time.sleep(1) # 1秒間待つ winsound.Beep(440, 1000) # 2回目のプー def check_break_time(self): if self.running: self.elapsed_time = time.time() - self.start_time if self.elapsed_time >= self.break_time: self.running = False self.label["text"] = "休憩時間終了!" threading.Thread(target=self.beep_sound).start() # ビープ音を別スレッドで実行 self.shake_image(duration=18) # コーヒー画像が揺れる else: self.root.after(100, self.check_break_time) def show_image(self): if not self.image_on_canvas: self.image_on_canvas = self.canvas.create_image(200, 75, image=self.image) else: self.canvas.itemconfig(self.image_on_canvas, image=self.image) def shake_image(self, duration=10): for _ in range(duration): self.canvas.move(self.image_on_canvas, 5, 0) self.root.update() time.sleep(0.05) self.canvas.move(self.image_on_canvas, -5, 0) self.root.update() time.sleep(0.05) def stop(self): self.running = False def reset(self): self.stop() if self.image_on_canvas: self.canvas.delete(self.image_on_canvas) self.image_on_canvas = None self.label["text"] = "" self.time_var.set(self.time_options[0]) # デフォルトの休憩時間にリセット self.break_time = self.time_options[0] root = tkinter.Tk() stopwatch = Stopwatch(root) root.mainloop() |
画像ファイルの保存場所について
このタイマーウォッチでは、コーヒーカップの画像を使用しています。画像ファイルはスクリプトと同じディレクトリに保存する必要があります。別の場所に保存する場合は、ファイルパスを正確に指定してください。
まとめ
この改良版ストップウォッチを使えば、効率的に時間管理を行いながら、適切なタイミングで休憩を取ることができます。プログラミング学習や仕事だけでなく、どんなタスクにも応用可能です。ただし、現在のバージョンでは「Stop」ボタンが期待通りに機能していません。私のプログラミングスキルが向上した際に、この問題を解決するための改修を行う予定です。ぜひ試してみてください。


コメント