勤怠管理の仕方|Tkinterで自作ストップウォッチ

こんな方へ特におすすめ

  • 勤怠管理システムへの申請、特に細かな作業時間の入力が面倒な方
  • タスクごとにどのくらいの時間がかかっているか、感覚でしか分からない方
  • 簡単にPythonのアプリを開発したい方

概要

こんにちは。サイオステクノロジーのはらちゃんです!今回4本目のブログ執筆です。

今回は私が作成したストップウォッチアプリの紹介と、その開発過程、そして皆さんの勤怠管理や作業効率向上に役立つヒントをお伝えします。

なぜ自作ストップウォッチアプリが必要だったのか?

私の職場では、勤怠報告で作業の種類ごとに工数を確認する必要がありました。


「〇〇プロジェクトの設計」「△△タスクのコーディング」「定例会議」など、作業ごとに時間を測りたい──。

そんな想いから自分で作って自由にカスタムできるアプリを作ろうと考えました。

簡単!ストップウォッチの作り方

以下のような単純な機能をもつアプリを作っていこうと思います。

デスクトップに表示されます

機能としては上から

  • ラベルに入力
  • タイマー表示
  • 開始、停止ボタンのクリック
  • タイマー個数の増減ボタンのクリック

が行えます。

前提条件

  • VSCodeのインストール
  • Pythonの開発環境

ステップ1:ホストOSの準備

まず、コンテナーのGUIをPC本体の画面に映し出すための「Xサーバー」というソフトをインストールします。これは初回のみ必要な作業です。

  1. Xサーバーをインストールする。
    • Windowsの場合: VcXsrv をインストールして起動します。
    • Macの場合: XQuartz をインストールして起動します。
  2. Display settings: 「Multiple windows」を選択して「次へ」。
  3. Client startup: 「Start no client」を選択して「次へ」。
  4. Extra settings: 「Disable access control」必ずチェックを入れて「次へ」。
  5. 「完了」をクリックしてVcXsrvを起動します。
このような設定画面が起動します。

ステップ2:ストップウォッチアプリの実装

このPythonコードをコピーしてファイルに保存するだけですぐに動かすことができます。

stopwatch.py
import tkinter as tk
import time


class StopwatchApp:
    def __init__(self, parent):
        # Frameを作成し、親ウィジェット(parent)に配置
        self.frame = tk.Frame(parent)
        self.frame.pack(side=tk.LEFT, padx=15, pady=15)

        # --- ストップウォッチの状態を管理する変数 ---
        self.running = False
        self.start_time = 0.0
        self.elapsed_time = 0.0

        # --- ラベル編集部品 ---
        self.label_var = tk.StringVar()
        self.label_var.set("タイマー")
        self.label_entry = tk.Entry(self.frame, textvariable=self.label_var, font=("Arial", 10), justify="center", width=8)
        self.label_entry.pack(pady=(0,2))

        # --- 画面の部品(ウィジェット)を作成 ---
        self.time_label = tk.Label(self.frame, text="00:00", font=("Arial", 40, "bold"))
        self.time_label.pack(pady=4)

        self.toggle_button = tk.Button(self.frame, text="Start", width=13, command=self.toggle)
        self.toggle_button.pack(pady=4)

        self.update()

    def toggle(self):
        """ボタンが押されたときの処理"""
        if self.running:
            # ストップ処理
            self.running = False
            self.toggle_button.config(text="Start")
        else:
            # スタート処理
            self.running = True
            self.toggle_button.config(text="Stop")
            self.start_time = time.time() - self.elapsed_time

    def update(self):
        """時間を計算して表示を更新する処理"""
        if self.running:
            self.elapsed_time = time.time() - self.start_time
            self._display_time()
        self.frame.after(10, self.update)

    def _display_time(self):
        """経過時間を見やすい形式に変換してラベルに表示(時間:分)"""
        hours = int(self.elapsed_time // 3600)
        minutes = int((self.elapsed_time % 3600) // 60)
        time_string = f"{hours:02}:{minutes:02}"
        self.time_label.config(text=time_string)

# --- アプリケーションの実行 ---

class StopwatchManager:
    def __init__(self, root):
        self.root = root
        self.stopwatches = []
        self.frame = tk.Frame(root)
        self.frame.pack()

        # ボタン配置
        btn_frame = tk.Frame(root)
        btn_frame.pack(pady=4)
        self.add_btn = tk.Button(btn_frame, text="○", font=("Arial", 12), width=4, command=self.add_stopwatch)
        self.add_btn.pack(side=tk.LEFT, padx=4)
        self.remove_btn = tk.Button(btn_frame, text="×", font=("Arial", 12), width=4, command=self.remove_stopwatch)
        self.remove_btn.pack(side=tk.LEFT, padx=4)

        # 初期2つ
        self.add_stopwatch()
        self.add_stopwatch()

    def add_stopwatch(self):
        sw = StopwatchApp(self.frame)
        self.stopwatches.append(sw)
        self.update_window_size()

    def remove_stopwatch(self):
        if self.stopwatches:
            sw = self.stopwatches.pop()
            sw.frame.destroy()
            self.update_window_size()

    def update_window_size(self):
        width = max(205 * len(self.stopwatches), 205)
        self.root.geometry(f"{width}x200")

# --- アプリケーションの実行 ---
if __name__ == "__main__":
    root = tk.Tk()
    root.title("StopWatch")
    root.resizable(False, False)
    root.attributes("-topmost", True)

    manager = StopwatchManager(root)

    # 初期ウィンドウサイズ
    root.geometry("410x200")

    root.mainloop()

ステップ3:実行

ターミナルで以下のコマンドを入力するとアプリが起動します。

bash
python3 stopwatch.py

実行できないときは…

解決策1:ライブラリのダウンロードする

Pythonには「Tkinter」というGUI(画面付きアプリ)を作るためのライブラリが標準で付属しているため、追加のインストールなしですぐに開発を始められます。

しかし、Linuxで操作している場合は手動でのダウンロードが必要です。

bash
sudo apt update
sudo apt install python3 python3-tk

解決策2:ファイアウォールの設定を確認する

VcXsrvを初めて起動したとき、Windows Defenderファイアウォールが警告画面を表示したはずです。

ここで「アクセスを許可する」を選択しないと、通信がブロックされてしまいます。

  1. Windowsの検索バーで「ファイアウォール」と検索し、「Windows Defender ファイアウォールによるアプリの許可」を開きます。
  2. 「設定の変更」をクリックし、「別のアプリの許可」をクリックします。
  3. 「参照」からVcXsrvの実行ファイル(通常は C:\Program Files\VcXsrv\vcxsrv.exe)を選択して追加します。
  4. 一覧に追加された「vcxsrv」の「プライベート」と「パブリック」の両方のチェックボックスをオンにして「OK」をクリックします。

まとめ

今回は、ストップウォッチのアプリ開発を通して、PythonとTkinterを使えば、日常のちょっとした不便を解消するアプリを自作できる楽しさを学んでいきました。

Githubでも、私の開発コードを公開しているので、自由にコードを書き替えて使ってみてくださいね。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です