今回は、GUI部品(ラベル、テキストボックス、チェックボックス、ラジオボタン)を表示してみます。
メニューを追加する都合上、ウィンドウとフレームの使用方法が前回と異なります。
おそらくは、今回のほうが正しいのかな、と思います。
大まかな流れとしては、以下となります。
・ウィンドウを生成(コンストラクタでタイトルを指定)
・ウィンドウのサイズ、最大化を抑制
・ウィンドウに対してメニューを設定(選択イベントも設定してみる)
・ウィンドウを引数に、フレームを生成
・フレームにGUI部品(メニュー以外)を設定
# -*- 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 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, 0, 0, 'ボタン:') guiParts.addButton(f, 0, 1, 'ボタン', 30) guiParts.addLabel(f, 1, 0, 'リストボックス:') lbc = guiParts.addListBox(f, 1, 1, ['ABC', 'DEF', 'GHI']) lbc.select_set(1, 2) # index = 1 ~ 2 のアイテムを選択状態に print(lbc.curselection()) # 選択されているアイテムを取得 f.pack() w.mainloop()