タイマー使いたいけど、プレゼンしている時WEBサイト開けなくない？

今回、pythonで、
**「完全ミュートで動作するタイマーアプリ」**
を作成しました。特徴はこれだけです。
WEBが使えない時、デスクトップアプリがおすすめです。

※YouTube動画です。音量に気をつけてください
[![YouTube動画](https://img.youtube.com/vi/NqbcnabYPDQ/hqdefault.jpg)](https://youtube.com/shorts/NqbcnabYPDQ?feature=share)





```
30秒ごとに画面がさりげなく点滅する
1分、3分、5分とボタンでクリックできる
```

## tkinter　コード一部解説
<環境>
🖥 Windows
🐍 python 3.12.5
🏆 VSCode

① 時間の変更
使用用途によって変更してください。（デフォルトでは、1分/3分/5分）

```python:python
# タイマー時間の設定
    self.create_button(self.buttons_frame, "1分", 60)
    self.create_button(self.buttons_frame, "3分", 180)
    self.create_button(self.buttons_frame, "5分", 300)
```    

② 残り30秒/終了　の色変更
デフォルトでは、「赤」にしていますが、他の色でもOK
```

```python:python
def flash_background(self, duration, end=False):
    self.root.config(bg="red")
    self.root.after(int(duration * 1000), lambda: self.reset_background(end))
``` 

## 全体コード
<details><summary>全体コードはこちら</summary>

```python:python
import tkinter as tk

class TimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("タイマーアプリ")

        # 時間設定ボタン
        self.buttons_frame = tk.Frame(root)
        self.buttons_frame.pack(pady=10)

        self.timer_label = tk.Label(root, text="時間を設定してください", font=("Arial", 20))
        self.timer_label.pack(pady=10)

        # タイマー
        self.time_left = 0
        self.is_running = False

        # タイマー時間の設定
        self.create_button(self.buttons_frame, "1分", 60)
        self.create_button(self.buttons_frame, "3分", 180)
        self.create_button(self.buttons_frame, "5分", 300)

        # スタートボタン
        self.start_button = tk.Button(root, text="スタート", font=("Arial", 14), command=self.start_timer)
        self.start_button.pack(pady=10)

        # リセットボタン
        self.reset_button = tk.Button(root, text="リセット", font=("Arial", 14), command=self.reset_timer)
        self.reset_button.pack(pady=10)

    def create_button(self, parent, text, time):
        button = tk.Button(parent, text=text, font=("Arial", 14), command=lambda: self.set_time(time))
        button.pack(side="left", padx=5)

    def set_time(self, time):
        if not self.is_running:
            self.time_left = time
            self.timer_label.config(text=f"残り: {self.format_time(self.time_left)}")

    def start_timer(self):
        if self.time_left > 0 and not self.is_running:
            self.is_running = True
            self.run_timer()

    def reset_timer(self):
        self.is_running = False
        self.time_left = 0
        self.timer_label.config(text="時間を設定してください")
        self.root.config(bg="black")  # 背景を黒にリセット

    def run_timer(self):
        if self.time_left > 0:
            self.time_left -= 1
            self.timer_label.config(text=f"残り: {self.format_time(self.time_left)}")
            if self.time_left == 30:
                self.flash_background(0.5)  # 残り30秒で背景色変更（赤→黒）
            self.root.after(1000, self.run_timer)
        else:
            self.timer_label.config(text="タイマー終了")
            self.is_running = False
            self.flash_background(2, end=True)  # 終了時背景色変更（赤→黒）

    def format_time(self, seconds):
        minutes, seconds = divmod(seconds, 60)
        return f"{minutes:02}:{seconds:02}"

    def flash_background(self, duration, end=False):
        self.root.config(bg="red")
        self.root.after(int(duration * 1000), lambda: self.reset_background(end))

    def reset_background(self, end=False):
        self.root.config(bg="black")  # 常に黒にリセット

if __name__ == "__main__":
    root = tk.Tk()
    root.geometry("400x200")
    root.config(bg="black")  # 初期背景色を黒に設定
    app = TimerApp(root)
    root.mainloop()

```
</details>


## 最後に
今回、デスクトップアプリにした理由は「プレゼンしている時、WEBサイト開けなくない？」からのヒントで作りました。
少しでも役立てばいいなと思います✨