Raspberry Pi Python GUI アプリケーション 03:ラベル、テキストボックス、チェックボックス、ラジオボタン

今回は、GUI部品(ラベル、テキストボックス、チェックボックスラジオボタン)を表示してみます。

Python(tkinter)は少し自分の知っているものとしくみが異なるようで、ラベルなどを生成する関数にウィンドウ(フレーム)を渡すことで、その渡したウィンドウ(フレーム)に表示されます。

自分が知っている言語では、ラベルなどのオブジェクトを作成、ウィンドウ(ラベル)に追加する流れで部品が表示されました。

 

そんなライブラリですので、少し関数を組んで部品を追加表示するようにしてみました。

 

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

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

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

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

    def setSize(selfwidthheightisCenter = 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(selftitle):
        """
        タイトルを指定する
        """
        self.master.title(title)
    
    def disableMaximum(self):
        """
        最大化を無効化
        """
        self.master.resizable(FalseFalse)

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

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

        return lbl

    def addTextBox(selfrowcolumnwidthtext = None):
        """
        テキストボックスを追加表示する
        """
        textbox = Tk.Entry(selfwidth = width)
        textbox.grid(row = row, column = column, sticky = Tk.W)
        if text != None:
            textbox.insert(Tk.END, text)
        
        return textbox

    def addCheckBox(selfrowcolumntextvaliable = None):
        """
        チェックボックスを追加表示する
        """
        if valiable == None:
            valiable = Tk.BooleanVar()
        checkBox = Tk.Checkbutton(selftext = text, variable = valiable)
        checkBox.grid(row = row , column = column, sticky = Tk.W)

        return (checkBox, valiable)

    def addRadioButton(selfrowcolumntextonValuevaliable = None):
        """
        ラジオボタンを追加表示する
        """
        if valiable == None:
            valiable = Tk.IntVar()
        rbn = Tk.Radiobutton(selftext = text, value = onValue, variable = valiable)
        rbn.grid(row = row, column = column, sticky = Tk.W)

        return (rbn, valiable)

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

    # ラベル + テキストボックス
    guiParts.addLabel(w, 00'テキストボックス:')
    guiParts.addTextBox(w, 0120'ABC')

    # ラベル + チェックボックス
    guiParts.addLabel(w, 10'チェックボックス:')
    chk1 = guiParts.addCheckBox(w, 11'チェックボックス1')
    chk1[1].set(False)
    chk2 = guiParts.addCheckBox(w, 12'チェックボックス2')
    chk2[1].set(True)
   
    # ラベル + ラジオボタン
    guiParts.addLabel(w, 20'ラジオボタン:')
    ラジオボタン初期値オブジェクト(このオブジェクトを共有するラジオボタンがトグルとなる)
    valRadio = Tk.IntVar()
    guiParts.addRadioButton(w, 21'ラジオボタン1'1, valRadio)
    guiParts.addRadioButton(w, 22'ラジオボタン2'2, valRadio)
    valRadio.set(1)

    w.pack()
    w.mainloop()