■tkinterの勉強(GUI griderで配置)■
●1.ウィジェットをgriderで配置する(チェックボタン、ラベル、エントリー)
●2.ウィジェットの伸び縮みの調整
●2.ウィジェットの伸び縮みの調整
●1.ウィジェットをgriderで配置する(チェックボタン、ラベル、エントリー)
サクラエディターを使った開発環境もなじんできたので、再びtkinterでのGUIアプリケーションの作成を勉強します。目標とするアプリは、pandasを使ったデータ処理プリケーションです。
データ処理のためには、ファイルの読み書きをできるようにしなければなりません。ということで、エントリーというテキストを書き込んだりできるボックスを使います。読み込み用のフォルダー、ファイル名、書き込み用のファイル名という3つのエントリーを作ります。
①読み込みフォルダ(current folder)
②読み込みファイル(read file)
③書き込みファイル(write file)
これらにラベルとつけます。そして、チェックボタンをつけて、有効か無効かを制御できるようにしておくと、ファイルを固定して使えると考えました。(うっかり上書きしないように)
これらのウィジェットを配置するフレーム(今回はラベルフレーム)をクラスで準備することにします。
以下はラベルフレームに各ウィジェットを配置したクラスです。↓
コード
class FileLabelFrame(tk.LabelFrame): #ファイル情報用 クラス
def __init__(self, master = None):
tk.LabelFrame.__init__(self, master)
self.configure(text = 'File Infomation')
self.opts1 = BooleanVar()
self.opts1.set(False)
self.opts2 = BooleanVar()
self.opts2.set(False)
self.opts3 = BooleanVar()
self.opts3.set(False)
# No1を入力させるテキストボックス
self.c_01=tk.Checkbutton(self,text = '', variable = self.opts1)
self.c_01.grid(row = 0,column=0, sticky=NSEW)
self.l_01 = tk.Label(self, text = 'current folder:')
self.l_01.grid(row = 0, column = 1, padx = 5, pady = 5, sticky=NSEW)
self.hensu01 = tk.StringVar()
e_hensu01 = tk.Entry(self, textvariable = self.hensu01)
e_hensu01.grid(row = 0, column = 2, padx = 5, pady = 5, sticky=NSEW)
#e_hensu01.focus_set() #フォーカスのセット
# No2を入力させるテキストボックス
self.c_02=tk.Checkbutton(self,text = '', variable = self.opts2)
self.c_02.grid(row = 1,column=0, sticky=NSEW)
self.l_02 = tk.Label(self, text = 'read file:')
self.l_02.grid(row = 1, column = 1, padx = 5, pady = 5, sticky=tk.NSEW)
self.hensu02 = tk.StringVar()
e_hensu02 = tk.Entry(self, textvariable = self.hensu02)
e_hensu02.grid(row = 1, column = 2, padx = 5, pady = 5, sticky=tk.NSEW)
# No3を入力させるテキストボックス
self.c_03=tk.Checkbutton(self,text = '', variable = self.opts3)
self.c_03.grid(row = 2,column=0)
self.l_03 = tk.Label(self, text = 'write file:')
self.l_03.grid(row = 2, column = 1, padx = 5, pady = 5, sticky=tk.NSEW)
self.hensu03 = tk.StringVar()
e_hensu03 = tk.Entry(self, textvariable = self.hensu03)
e_hensu03.grid(row = 2, column = 2, padx = 5, pady = 5, sticky=tk.NSEW)
self.grid_rowconfigure(0, weight = 1)
self.grid_rowconfigure(1, weight = 1)
self.grid_rowconfigure(2, weight = 1)
self.grid_columnconfigure(0, weight = 1)
self.grid_columnconfigure(1, weight = 1)
self.grid_columnconfigure(2, weight = 1)
# テキストボックスに値を設定する
def set_all_entry(self,foldername,rfilename,wfilename):
try:
self.hensu01.set(foldername)
self.hensu02.set(rfilename)
self.hensu03.set(wfilename)
except:
dummy = 0
# テキストボックスの値を取得する
def get_all_entry(self):
try:
return self.hensu01.get(), self.hensu02.get(),self.hensu03.get()
except:
return 0, 0, 0
ここに用意したのはラベルフレームというラベルを付けられるフレームでウィジェットを配置できる箱の役割をします。
ラベルフレームのラベルは self.configure(text = 'File Infomation') で設定できます。
最初に出きたのが、チェックボックス用の変数の設定です。
コード
self.opts1 = BooleanVar()
self.opts1.set(False)
self.opts2 = BooleanVar()
self.opts2.set(False)
self.opts3 = BooleanVar()
self.opts3.set(False)
self.opts1 = BooleanVar()
self.opts1.set(False)
self.opts2 = BooleanVar()
self.opts2.set(False)
self.opts3 = BooleanVar()
self.opts3.set(False)
この3つは、すべてBoolean型で設定してあり、変数を変更するにはsetメソッドを使い、値を取得するにはgetメソッドを使います。ここでは、すべてFalseに設定しています。
次にチェックボタンの配置です。
コード
self.c_01=tk.Checkbutton(self,text = '', variable = self.opts1)
self.c_01.grid(row = 0,column=0, sticky=NSEW)
self.c_01=tk.Checkbutton(self,text = '', variable = self.opts1)
self.c_01.grid(row = 0,column=0, sticky=NSEW)
チェックボタンの状態を変更したり、読み出したりするための変数opts1をvariableに設定しておきます。設定するにはopts1.set(True)のようにセットメソッドを使います。selfはこのラベルフレームで共有するために必要です。
そしてgridメソッドで配置を決めます。今回のウィジェットは3行×3列に配置します。チェックボタンは一番左に配置しますので、column=0とします。(ゼロ始まりに注意)row=0は一行目という意味です。
sticky=NSEW は、伸び縮みする方向を設定しています。Nは北、Sは南、Eは東、Wは西となっており、上下左右を示します。NSEWはすべての方向に対して伸び縮みすることを示します。ただし、これだけでは実際には伸縮せず、別に設定する必要があります。
スクリプトの下の方をみてください。
コード
self.grid_rowconfigure(0, weight = 1)
self.grid_rowconfigure(1, weight = 1)
self.grid_rowconfigure(2, weight = 1)
self.grid_columnconfigure(0, weight = 1)
self.grid_columnconfigure(1, weight = 1)
self.grid_columnconfigure(2, weight = 1)
self.grid_rowconfigure(0, weight = 1)
self.grid_rowconfigure(1, weight = 1)
self.grid_rowconfigure(2, weight = 1)
self.grid_columnconfigure(0, weight = 1)
self.grid_columnconfigure(1, weight = 1)
self.grid_columnconfigure(2, weight = 1)
grid_rowconfigureとgrid_columnconfigureです。それぞれ行と列を設定します。
はじめの引き数は行か列の番号です。weightは重み付けという意味で、伸縮する度合いを決めます。
0だと伸び縮みしない設定、1は普通、2は倍の量伸縮するという具合です。
今回の設定では、9つのウィジェットはすべて均等に伸縮するようにweightが1に設定してあります。
このラベルフォームクラスをさらに呼び出すアプリケーションクラスを作成します。
class Application01(tk.Frame): #★アプリケーションクラス
def __init__(self, master=None,No=1):
tk.Frame.__init__(self, master)
master.title(ver_name)
self.pack(expand=True,fill=BOTH)
self.configure(width=640,height=480,bg='lightgrey')
self.createWidgets_Test1() #ファイル情報 フレームのみ
def createWidgets_Test1(self): #各クラスのウィンドウを生成 test ファイル情報のみ
self.lf_1 = FileLabelFrame(self) #ファイル情報ラベルフレーム lf_1
self.lf_1.pack()
self.pack(expand=True,fill=BOTH)は前にやりましたpack()メソッドで、伸縮を許可するexpandや伸縮方向のfillを設定します。この文では、アプリケーションすなわちメインウィンドウの配置を決めています。配置といっても伸縮についての指定となります。ここでは、XY方向両方に伸縮できるように設定しています。
次にこのアプリケーションクラスを呼び出すメインルーチンを作成します。
#--------------- main program ---------------
if __name__ == '__main__':
root = tk.Tk()
app = Application01(master=root,No=1)
app.mainloop()
#--------------------------------------------
masterには生成したインスタンスrootオブジェクトを渡しています。各クラスではselfやmasterというオブジェクトが自分や親クラスを示すことになり、後々、変数にアクセスするときに重要となります。
●2.ウィジェットの伸び縮みの調整
Application01クラスからFileLabelFrameクラスを呼び出すところを説明していませんでした。
self.createWidgets_Test1()によって配置します。具体的な呼び出しコードは以下のとおりです。↓
def createWidgets_Test1(self): #各クラスのウィンドウを生成 test ファイル情報のみ
self.lf_1 = FileLabelFrame(self) #ファイル情報ラベルフレーム lf_1
self.lf_1.grid(row = 0,column=0,sticky=NSEW)
self.grid_columnconfigure(0, weight = 1)
self.grid_rowconfigure(0, weight = 1)
さきほどと同様にgridメソッドを使って、全方向に伸縮できるようにしています。
初期の起動画面がこちら↓
そしてウィンドウをドラッグしてサイズを変えると↓
伸びました。伸びましたが、ちょっと違和感がありますね。チェックボタンやラベルは伸縮しなくてもよさそうです。またエントリーも実用上Y方向には伸びなくてもよいですね。調整しましょう。
class FileLabelFrameの伸縮を設定している部分のうち、エントリーの横方向だけ伸縮するように指定します。(その他の設定をコメント文にしています)↓
コード
#self.grid_rowconfigure(0, weight = 1)
#self.grid_rowconfigure(1, weight = 1)
#self.grid_rowconfigure(2, weight = 1)
#self.grid_columnconfigure(0, weight = 1)
#self.grid_columnconfigure(1, weight = 1)
self.grid_columnconfigure(2, weight = 1)
#self.grid_rowconfigure(0, weight = 1)
#self.grid_rowconfigure(1, weight = 1)
#self.grid_rowconfigure(2, weight = 1)
#self.grid_columnconfigure(0, weight = 1)
#self.grid_columnconfigure(1, weight = 1)
self.grid_columnconfigure(2, weight = 1)
すると、エントリーの横方向だけが伸びました。これで長いフォルダ名も表示できると思います。
●gridメソッドによる伸縮調整●
フレームを使ってクラス化しておくと最終的なアプリケーションの多数のウィジェットの配置が楽になります。そのウィジェットの配置もpack()を使った方が簡単そうですが、grid()を使うとより細かな配置ができるようになるので、使い分けになると思います。
フレームを使ってクラス化しておくと最終的なアプリケーションの多数のウィジェットの配置が楽になります。そのウィジェットの配置もpack()を使った方が簡単そうですが、grid()を使うとより細かな配置ができるようになるので、使い分けになると思います。
ウィジェットの配置はまずフレームを使う
次にフレームをメインウィンドウに配置する
pack()とgrid()によるウィジェットの配置は場合に応じて使い分ける
伸び縮みは方向と重み付けで決める
行と列で個別に伸縮を設定できる
次にフレームをメインウィンドウに配置する
pack()とgrid()によるウィジェットの配置は場合に応じて使い分ける
伸び縮みは方向と重み付けで決める
行と列で個別に伸縮を設定できる
Python ブログランキングへ
クリックしてね
新しいブログをはじめました。pythonの初級者から中級者まで、役に立つ記事を掲載していますので、ご覧ください。
特にカスタム関数(ユーザー定義関数)は、便利に使えると思います。
ぜひぜひこのリンクをクリックしてください
→
Pythonを勉強して株で儲けるブログ
特にカスタム関数(ユーザー定義関数)は、便利に使えると思います。
ぜひぜひこのリンクをクリックしてください
→
Pythonを勉強して株で儲けるブログ