はなたの日記

プログラミングとギターのコードについて書きます

tkinterでGUIアプリ作成~①レイアウト作成

以前からGUIアプリの作成に興味があったのですが、特に作りたいものもなくて手が出せていませんでした。
前回の記事で書いた、TSUTAYAの在庫検索結果から在庫がある店だけを抽出するプログラムを書いた時、これをGUIアプリにしたらめっちゃ便利なんじゃないかな~と思いました。というわけで、このプログラムをGUIアプリにすることを目標にして進めていきます。
hanatasdiary.hatenablog.com

# ライブラリ
from tkinter import *
from tkinter import ttk


class ZaikoApp(ttk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.make_menu()
        self.create_widgets()

    def make_menu(self):
        self.the_menu = Menu(self, tearoff=0)
        self.the_menu.add_command(label="貼り付け")

    def show_menu(self,event):
        widget = event.widget
        self.the_menu.entryconfigure("貼り付け", command=lambda: widget.event_generate("<<Paste>>"))
        self.the_menu.tk.call("tk_popup", self.the_menu, event.x_root, event.y_root)

    def create_widgets(self):
        # 商品ID
        lbl_item_id = Label(text='商品ID').grid(column=0, row=0, padx=10, pady=20) # ラベル
        txt_item_id = Entry(width=15)
        txt_item_id.bind("<Button-3><ButtonRelease-3>", self.show_menu) # 右クリックで貼り付けできるようにする
        txt_item_id.grid(column=1, row=0, pady=20,sticky=W)

        # 販売形式
        lbl_type = Label(text='販売形式').grid(column=0, row=1, padx=10,pady=20)
        combo_type = ttk.Combobox(width=15)
        combo_type['values'] = ('レンタルCD', 'レンタルDVD')
        combo_type['state'] = 'readonly'
        combo_type.grid(column=1, row=1,pady=20)

        # 都道府県
        lbl_prefec = Label(text='都道府県').grid(column=0, row=2, padx=10, pady=20)
        combo_prefec = ttk.Combobox(width=15)
        combo_prefec['values'] = ('東京都','神奈川県','千葉県','埼玉県')
        combo_prefec['state'] = 'readonly'
        combo_prefec.grid(column=1, row=2, pady=20)

        # 処理開始ボタン
        start_btn = Button(text='START', width=23, height=5)
        start_btn.grid(column=0, row=3, padx=10, columnspan=2)

        # 進行メッセージ表示
        msg_textbox = Text(width=43,height=1)
        msg_textbox['state'] = 'disabled' # 最初は書き込み不可にする
        msg_textbox.grid(row=0,column=2,padx=20,pady=20,sticky=W)

        # スクロールバーつきリストボックスを作成、表示
        printFrame = Frame(height=20, width=50)
        # リストボックス
        self.textField = Listbox(printFrame, width=50, height=20)
        self.textField.pack(side=LEFT)
        # スクロールバー
        scrollbar = Scrollbar(printFrame, orient=VERTICAL, command=self.textField.yview)
        scrollbar.pack(side=RIGHT, fill=Y)
        self.textField["yscrollcommand"] = scrollbar.set
        # 表示
        printFrame.grid(column=2, row=1, padx=20, pady=20, rowspan=3,sticky=W)

        self.grid()


def main():
    # ウィンドウ作成
    root = Tk()
    root.title("在庫検索")
    root.geometry("540x420")
    root.resizable(0,0)

    # アプリケーション部分作成
    app = ZaikoApp(root)
    app.mainloop()


if __name__ == '__main__':
    main()

実行結果がコチラです。

f:id:hanatasdiary:20190209210308p:plain
完成したレイアウト

とにかくtkinterで書かれたコードを見よう見真似で書いたので、イマイチ理解しきれていません。
クラスが出てきてすごい辛いですが、頑張ろうと思います。