LoginSignup
21
18

More than 5 years have passed since last update.

【Python】raspberry pi を置き時計に仕立てる

Posted at

Raspberry pi を使って Python を勉強中です。
とりあえず、3.5 inch ディスプレイを活用するため置き時計風 GUI 画面を作ります。

やったこと

  • 日付と時刻を表示 → プログラムで実現
  • 画面は常に最大化、最前面に表示 → プログラムで実現
  • Raspberry pi 起動時に実行したい → autostart に登録
  • スリープモードはいらない → LXDE-autostart config を編集

環境

  • Raspberry pi 3 Model B Rev 1.2
  • SD: Samsung microSD Card 32GB EVOPlus Class10 UHS-I
  • Display: Kuman 3.5inch HDMI Monitor Touch Screen Display Resolution (480*320 To 1920*1080)
  • Python 3.5.3

ソースコード

コメントもたくさん入れているし、ググれば分かることばかりなので説明は省略。

clock.py
# Tkinter モジュールをインポートしてコード内で省略可能とする
from tkinter import *
from datetime import datetime

# メインウィンドウ作成
root = Tk()

# メインウィンドウサイズ
root.geometry("720x480")

# メインウィンドウタイトル
root.title("Clock")

# Canvas 作成
c = Canvas(root, bg="#FFFFFF", width=720, height=480)
c.pack(expand=True, fill=BOTH)

# 文字列作成
cd = c.create_text(100, 100, font=('', 40, 'bold'), fill='black')
ct = c.create_text(100, 160, font=('', 120), fill='black')

# 画面がリサイズされたとき
def change_size(event):
    # 画面の中心座標を取得
    w = c.winfo_width()  / 2
    h = c.winfo_height() / 2

    # 文字列の矩形の中心座標を取得
    cd_coords = c.bbox(cd)
    cd_w = cd_coords[0] + (cd_coords[2] - cd_coords[0]) / 2
    cd_h = cd_coords[1] + (cd_coords[3] - cd_coords[1]) / 2
    ct_coords = c.bbox(ct)
    ct_w = ct_coords[0] + (ct_coords[2] - ct_coords[0]) / 2
    ct_h = ct_coords[1] + (ct_coords[3] - ct_coords[1]) / 2

    # 中心座標を合わせるように移動
    c.move(cd, w - cd_w, h - cd_h - 60)
    c.move(ct, w - ct_w, h - ct_h + 60)

# 画面のリサイズをバインドする
root.bind('<Configure>', change_size)

# メインウィンドウの最大化
root.attributes("-zoomed", "1")

# 常に最前面に表示
root.attributes("-topmost", True)

def cupdate():
    # 現在時刻を表示
    now = datetime.now()
    d = '{0:0>4d}/{1:0>2d}/{2:0>2d} ({3}.)'.format(now.year, now.month, now.day, now.strftime('%a'))
    t = '{0:0>2d}:{1:0>2d}:{2:0>2d}'.format(now.hour, now.minute, now.second)
    c.itemconfigure(cd, text=d)
    c.itemconfigure(ct, text=t)
    c.update()

    # 1秒間隔で繰り返す
    root.after(1000, cupdate)

# コールバック関数を登録
root.after(1000, cupdate)

# メインループ
root.mainloop()

Raspberry pi 起動時に実行したい

autostart に登録(新規作成)すれば良いらしいです。

$ mkdir ~/.config/autostart; cd $_
$ vi clock.desktop

で、clock.desktop にはこんな感じで設定を書いておきます。

clock.desktop
[Desktop Entry]
Type=Application
Name=Desktop Clock
Exec=/usr/bin/python3 /home/pi/clock.py
Terminal=false

再起動して、GNOME が起動したとき自動的に clock.py が実行されます。

画面のスリープモードを無効にする

10 分くらい放置していたらスリープモードになってしまったので、スリープモードを無効化します。

$ sudo vi /etc/xdg/lxsession/LXDE/autostart

ファイルの最下行に追加します。
すでに書いてある場合は省略して OK です。

@xset s off
@xset s noblank
@xset -dpms

完成

起動して何もしない状態で、ちゃんと置き時計風の表示になりました。個人的には満足。
(ちょっと表示がダサいのはご愛嬌)

IMG_1622.JPG

21
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18