Tkinter grid ジオメトリマネージャ
一般的にデータ量が一定ではない場合、ウィジェット内にデータを表示する内容によってはウィンドウを伸縮したい場合があります。
例えば Listbox と Scrollbar でみたプログラムは、 リストボックスのサイズによっては伸縮可能であるのが望ましいです。
ウィンドウの隅をドラッグすることで、ウィンドウがリサイズします。
それに伴い、内部のウィジェットも伸縮しています。
上記を実装するには次のようにします。
from tkinter import *
from tkinter import ttk
def show_selection():
for i in lb.curselection():
print(lb.get(i))
if __name__ == '__main__':
root = Tk()
root.title('Scrollbar 2')
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
# Frame
frame = ttk.Frame(root, padding=10)
frame.grid(sticky=(E, W, S, N))
frame.columnconfigure(0, weight=1);
frame.rowconfigure(0, weight=1);
# Listbox
currencies = ('JPY', 'USD', 'EUR', 'CNY', 'MXN', 'CAD')
v1 = StringVar(value=currencies)
lb = Listbox(frame, listvariable=v1, height=3)
lb.grid(row=0, column=0, sticky=(E, W, S, N))
# Scrollbar
scrollbar = ttk.Scrollbar(
frame,
orient=VERTICAL,
command=lb.yview)
lb['yscrollcommand'] = scrollbar.set
scrollbar.grid(row=0, column=1, sticky=(N, S))
# Button
button1 = ttk.Button(
frame, text='OK',
command=lambda: show_selection())
button1.grid(
row=1, column=0, columnspan=2,
pady=5, sticky=(S))
root.mainloop()
ポイントは grid ジオメトリマネージャを利用するときに、 rowconfigure と columnconfigure を使って weight を指定するところです。
weight によって、伸縮したときの行と列の割合を指定することができます。
それと、親要素のどこを基準に伸縮するかを指定するために sticky 属性を指定しています。東西南北を表す E, W, S, N で指定します。
ボタンは下側にくっつく形になるので、南を表す S を指定しています。