Raspberry Pi Python GUI アプリケーション 05:まとめ

前回と前々回の内容をまとめて、一度書き直しました。

特に新しいものはありません。

 

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

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

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

class Window(Tk.Tk):
    """
    TKクラスを継承、Windowクラスとする
    """
    
    def __init__(self, text):
        """
        ウィンドウを生成する(タイトルを指定)
        """
        Tk.Tk.__init__(self)
        self.title(text)

    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.geometry(geometry)
    
    def disableMaximum(self):
        """
        最大化を制限する
        """
        self.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 addTextBox(self, row, column, width, text = None):
        """
        テキストボックスを追加表示する
        """
        textbox = Tk.Entry(self, width = width)
        textbox.grid(row = row, column = column, sticky = Tk.W)
        if text != None:
            textbox.insert(Tk.END, text)
        
        return textbox

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

        return (checkBox, valiable)

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

        return (rbn, valiable)

    def addButton(self, row, column, text, width = None):
        """
        ボタンを追加表示する
        """
        btn = Tk.Button(self, text = text, width = width)
        btn.grid(row = row, column = column, sticky = Tk.W)

        return btn

    def addListBox(self, row, column, items):
        """
        リストボックスを追加表示する
        """
        lbx = Tk.Listbox(self, height = len(items))
        lbx.grid(row = row, column = column, sticky = Tk.W + Tk.N)
        lbx.insert(Tk.END, *items)

        return lbx

    def addMenu(self, text, items, commands, mbar = None):
        """
        メニューを追加する
        """
        if mbar == None:
            mbar = Tk.Menu(self)
        mnu = Tk.Menu(mbar)
        for index, item in enumerate(items):
            label = item
            command = commands[index]
            if label == '':
                mnu.add_separator()
            else:
                mnu.add_command(label = label, command = command)
        mbar.add_cascade(label = text, menu = mnu)
        w.config(menu = mbar)
        return mbar
 
def printSelectMenu1():
    print('メニューが選択されました1')
def printSelectMenu2():
    print('メニューが選択されました2')

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

    # メニューを設定
    mbar = guiParts.addMenu(w, 'Menu1', ['ABC', '', 'DEF', 'GHI'], [None, None, printSelectMenu1, None])
    mbar = guiParts.addMenu(w, 'Menu2', ['AAA', 'BBB', '', 'DDD'], [printSelectMenu2, None, None, None], mbar)

    # フレームを生成
    f = Tk.Frame(w)

    # 部品を追加、表示
    # ラベル + テキストボックス
    guiParts.addLabel(f, 1, 0, 'テキストボックス:')
    guiParts.addTextBox(f, 1, 1, 20, 'ABC')

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

    guiParts.addLabel(f, 5, 0, 'リストボックス:')
    lbc = guiParts.addListBox(f, 5, 1, ['ABC', 'DEF', 'GHI'])
    lbc.select_set(1, 2)        # index = 1 ~ 2 のアイテムを選択状態に
    print(lbc.curselection())   # 選択されているアイテムを取得

    f.pack()
    w.mainloop()