前回と前々回の内容をまとめて、一度書き直しました。
特に新しいものはありません。
# -*- 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()