Pythonで作る透明なデスクトップ時計アプリケーション

PythonのGUI開発についての記事です。まずは完成したアプリケーションの機能を紹介します:

実装された機能:

  1. デスクトップ時計は常に他のウィンドウの最前面に表示され、ウィンドウの透明度は0.8に設定されています
  2. 閉じるボタンがなく、時計上で任意のキーを押すことで閉じることができます
  3. マウス追従機能をサポート
  4. バイナリファイルとして直接実行可能

それではコードを見てみましょう:

# -*- encoding: utf-8 -*-
__date__ = '2023/12/04 13:00:32'

import tkinter as tk
import time

class DesktopClock(tk.Tk):
    def __init__(self):
        super().__init__()
        self.overrideredirect(1)                            # ウィンドウボーダーを削除
        self.wm_attributes("-alpha", 0.8)                   # 透明度を設定
        self.wm_attributes("-topmost", True)                # 常に最上位に表示
        
        self.title('カスタム時計')
        self.geometry('300x100')
        self.configure(bg='black')
        
        self.time_display = tk.Label(self, text='', font=('Arial', 50), fg='white', bg='black')
        self.time_display.pack(expand=True)
        
        self.refresh_time()
        self.bind("<ButtonPress-1>", self.initiate_move)     # 左クリック押下時の処理
        self.bind("<ButtonRelease-1>", self.terminate_move)  # 左クリック解放時の処理
        self.bind("<B1-Motion>", self.handle_movement)      # マウス移動時の処理
        self.bind("<Any-KeyPress>", self.exit_application)   # 閉じる処理
        
    def refresh_time(self):
        current_time = time.strftime('%H:%M:%S')
        self.time_display.config(text=current_time)
        self.time_display.after(1000, self.refresh_time)
        
    def initiate_move(self, event):
        global start_x, start_y
        start_x = event.x
        start_y = event.y
        
    def terminate_move(self, event):
        global start_x, start_y
        start_x = None
        start_y = None
        
    def handle_movement(self, event):
        global start_x, start_y
        dx = event.x - start_x
        dy = event.y - start_y
        self.geometry("+%s+%s" % (self.winfo_x() + dx, self.winfo_y() + dy))
        self.update()
        
    def exit_application(self, *args):
        self.destroy()
        
if __name__ == "__main__":
    clock_app = DesktopClock()
    clock_app.mainloop()

実行方法は従来の方法から変更しました:

python clock_app.py

今回は便利なツール「pyinstaller」を導入します。まずはインストールが必要です:

pip install pyinstaller

このツールの特徴について、公式サイトでは以下のように説明されています:

  • pyinstallerWindowsLinuxMac などのオペレーティングシステムでPythonソースファイルをパッケージ化でき、ソースファイルをパッケージ化することで、Python環境がインストールされていない環境でもPythonプログラムを実行でき、独立したファイルとして簡単に転送や管理が可能になります。

インストールが完了したら、以下のコマンドを実行してプログラムをパッケージ化できます:

pyinstaller -F clock_app.py

最後に、ファイルのディレクトリにdistフォルダが追加されます:

現在の実行方法はコマンドラインから直接実行することです:

実はまだ少し不便な点があり、ダブルクリックでは開けないのですが、Python環境や各種依存パッケージへの依存から解放され、ターミナルから直接開くことで、ほぼ開梱してすぐ使える状態になりました。より良い方法はまだ研究段階ですが、皆様の共有や交流を歓迎します。

タグ: Python tkinter GUI デスクトップアプリ PyInstaller

6月25日 22:42 投稿