はじめに
久しぶりの投稿である。
どうしても日付と時刻の両方が表示される時計をスクリーンに配置したくて、自作することにした。
当方の環境は以下の通り。
M1 Pro MacBook Pro 14"
macOS Sequoia 15.0.1
Python 3.13.0
Tcl/Tk 8.6.15
やったこと
やったことは以下の通り。
- Python Tkinterを用いてデジタル時計を表示するプログラムを作成。
- MacのAutomatorで作成したプログラムを起動するシェルスクリプトをapp化(Pythonのありかと実行するプログラム名はフルパスで記載)
- Elgato Stream Deckに入れ込んでワンタッチでいつでも表示できるようにする。
(注意事項)
私は、MacBookにpyenvでPython環境を作っているが、同様の環境の方は以下に注意。
- tcl-tkが入っていないとTkinterは使えないこと
- tcl-tkをインストールするにはopenssl@3が必要であること
- tcl-tk導入前のpythonは一度削除し、tcl-tk導入後に新たにpyenvでpythonを入れ直す必要があること
参考サイト
参考にさせてもらったサイト(記事)は以下の通り。なおStream Deckへの配置は持っている人にとっては特に説明の必要もないと思うので省略。ただしStream Deckに入れ込むことでとても便利になる。
Pythonで時計アプリを作ってみた
https://qiita.com/Chihiro_0808/items/d978a671358fcaf859bb
time --- 時刻データへのアクセスと変換
http://docs.python.jp/2/library/time.html
Macでシェルスクリプトを .appアイコン化する方法
https://qiita.com/KurosawaTsuyoshi/items/425cd484e8d7759af460
動作中写真
動作中の写真は以下の通り。見やすい。文字の大きさもコードをいじることにより自由に変えられる。app化してはいるが、Pythonコードを実行するシェルスクリプトを実行しているだけなので、Pythonのシステムはコンピュータ内に存在している必要がある。その分ソースコードをいじってもautomatorでのapp作り直しは必要ないところが良いところか。
コード
コードは以下の通り。独自性はほとんどありません。時刻と日付の表示はもっと効率的にできそうな気がしますが、とりあえず私の実力ではここまで。
import tkinter as tk
import time
def show_time():
now = time.strftime('%H:%M')
clock1.config(text=now)
clock1.after(1000, show_time)
def show_date():
now = time.strftime('%a %d %b %Y')
clock2.config(text=now)
clock2.after(1000, show_date)
root = tk.Tk()
root.title('tk_clock')
root.geometry('180x90')
clock1 = tk.Label(root, font=('consolas', 40, 'bold'))
clock2 = tk.Label(root, font=('consolas', 20, 'bold'))
clock1.pack()
clock2.pack()
show_time()
show_date()
root.mainloop()
追記(2024.10.25 21:25)
@shiracamus(しらかみゅ)さんから、以下のコード修正案をいただきました。root.after
で再帰させればいいのですね。とてもスッキリしました。ありがとうございます。
import time
import tkinter as tk
def update():
clock_time['text'] = time.strftime('%H:%M')
clock_date['text'] = time.strftime('%a %d %b %Y')
root.after(1000, update)
root = tk.Tk()
root.title('tk_clock')
root.geometry('180x90')
clock_time = tk.Label(root, font=('consolas', 40, 'bold'))
clock_time.pack()
clock_date = tk.Label(root, font=('consolas', 20, 'bold'))
clock_date.pack()
update()
root.mainloop()
以上