PythonのGUI開発についての記事です。まずは完成したアプリケーションの機能を紹介します:
実装された機能:
- デスクトップ時計は常に他のウィンドウの最前面に表示され、ウィンドウの透明度は0.8に設定されています
- 閉じるボタンがなく、時計上で任意のキーを押すことで閉じることができます
- マウス追従機能をサポート
- バイナリファイルとして直接実行可能
それではコードを見てみましょう:
# -*- 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
このツールの特徴について、公式サイトでは以下のように説明されています:
pyinstallerはWindows、Linux、MacなどのオペレーティングシステムでPythonソースファイルをパッケージ化でき、ソースファイルをパッケージ化することで、Python環境がインストールされていない環境でもPythonプログラムを実行でき、独立したファイルとして簡単に転送や管理が可能になります。
インストールが完了したら、以下のコマンドを実行してプログラムをパッケージ化できます:
pyinstaller -F clock_app.py
最後に、ファイルのディレクトリにdistフォルダが追加されます:
現在の実行方法はコマンドラインから直接実行することです:
実はまだ少し不便な点があり、ダブルクリックでは開けないのですが、Python環境や各種依存パッケージへの依存から解放され、ターミナルから直接開くことで、ほぼ開梱してすぐ使える状態になりました。より良い方法はまだ研究段階ですが、皆様の共有や交流を歓迎します。