Raspberry Pi Python GUI アプリケーション 07:現在の日時と

小さな(3.5インチ)のディスプレイを入手したので、少し、GUIアプリケーションを作ろうかと思います。
2行しか表示できなかったLCDディスプレイに比べ、小さいながらも多くの情報を出力でき、しかもカラー。

表現力は段違いに広がると思います。

 

今回は、「定期的に表示内容を書き換える」ことが目的なので、見栄えは気にしません。

文字の大きさ、フォント、色などについては気にしません。

現在の日付、時刻を表示するのみです。

一応、書き換え処理の実施有無がわかるように、最後に"."を点滅させてみます。

 

Pythonプログラミング

  以前作成したものを、使用していない関数を削除、定期的に書き換えるために「after」メソッドを使用しています。

  多くのOSがそうですが、GUIアプリケーションはメインスレッドで動きます。

  定期的な処理(書き換え)を行うためには、別スレッドで行ったりするのですが、「after」メソッドを使えば、実施間隔をmS単位で指定、「勝手に」実行してくれるイメージです。

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import tkinter as Tk
import datetime

# 表示するウィンドウの幅と高さ
WINDOW_WIDTH = 500
WINDOW_HEIGHT = 220

class Frame(Tk.Frame):
    """
    フレームを生成する
    """
    def __init__(self, master = None):
        # ウィンドウを作成
        Tk.Frame.__init__(self, master)

    def setSize(self, width, height, isCenter = True):
        """
        サイズを指定、ディスプレイ中央に表示する
        """
        # サイズを指定した文字列
        geometry = "{0}x{1}".format(width, height)

        if isCenter:    # ディスプレイ中央に表示する            
            # ディスプレイの幅と高さを取得
            s_width = self.winfo_screenwidth()
            s_height = self.winfo_screenheight()
            # 表示する左上の座標を算出        
            win_left = int((s_width - width) / 2)
            win_top = int((s_height - height) / 2)
            # 表示位置を指定した文字列を追加
            geometry += "+{0}+{1}".format(win_left, win_top)

        # サイズと表示位置を中央に指定(幅 x 高さ + 左位置 + 上位置)
        self.master.geometry(geometry)
    
    def setTitle(self, title):
        """
        タイトルを指定する
        """
        self.master.title(title)
    
    def disableMaximum(self):
        """
        最大化を無効化
        """
        self.master.resizable(False, False)

class guiParts():
    """
    GUI部品を追加表示する
    すべてグリッド、左寄せで表示
    """

    def addLabel(self, row, column, text):
        """
        ラベルを追加表示する
        """
        lbl = Tk.Label(self, text = text)
        lbl.grid(row = row, column = column, pady = 5, padx = 20, sticky = Tk.W)
        
        return lbl

def disp_clock():
    """
    定期的に実行、現在時刻をラベルに表示
    """
    # 現在時刻の取得
    now = datetime.datetime.now()
    global isDot
    dot = '.' if isDot == True else ' '
    # 日時の書き換え
    lblClock['text'] = f'{now.strftime("%Y/%m/%d %H:%M:%S")}{dot}'

    isDot = not isDot
    # 500mS後に再帰呼出し
    w.after(500, disp_clock)

# 継承した場合など、実行されないようにする(現状、意味は特にない)
if __name__ == "__main__":
    global w
    # メインウィンドウを生成、各設定を行う
    w = Frame()
    w.setTitle('現在の日時と時刻')
    w.setSize(WINDOW_WIDTH, WINDOW_HEIGHT)
    w.disableMaximum()

    w.pack()

    # 現在日時
    guiParts.addLabel(w, 0, 0, '現在の日時 時刻:')
    lblClock =  guiParts.addLabel(w, 0, 1, 'yyyy:mm:dd hh:MM:ss')

    # 現在時刻を表示する
    isDot = False
    disp_clock()
    
    w.mainloop()