Python §49 : tkinterの勉強(GUI griderで配置) | hitochan007のブログ(Pythonの勉強ブログ)

hitochan007のブログ(Pythonの勉強ブログ)

★Pythonの勉強記録を中心に●pomera DM200、●パソコン、●グルメ、●愛犬(トイプードル) などについてのブログです

【過去の記事 Python:目次】

■tkinterの勉強(GUI griderで配置)■
●1.ウィジェットをgriderで配置する(チェックボタン、ラベル、エントリー)
●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)


この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)

チェックボタンの状態を変更したり、読み出したりするための変数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)

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)


すると、エントリーの横方向だけが伸びました。これで長いフォルダ名も表示できると思います。

伸縮調整後





●gridメソッドによる伸縮調整●
フレームを使ってクラス化しておくと最終的なアプリケーションの多数のウィジェットの配置が楽になります。そのウィジェットの配置もpack()を使った方が簡単そうですが、grid()を使うとより細かな配置ができるようになるので、使い分けになると思います。


チェック ウィジェットの配置はまずフレームを使う
チェック 次にフレームをメインウィンドウに配置する
チェック pack()とgrid()によるウィジェットの配置は場合に応じて使い分ける
チェック 伸び縮みは方向と重み付けで決める
チェック 行と列で個別に伸縮を設定できる










Python ブログランキングへ 
クリックしてね


新しいブログをはじめました。pythonの初級者から中級者まで、役に立つ記事を掲載していますので、ご覧ください。

特にカスタム関数(ユーザー定義関数)は、便利に使えると思います。

ぜひぜひこのリンクをクリックしてください 

 Pythonを勉強して株で儲けるブログ