Python 入門

ホーム > Tkinter による GUI プログラミング > grid ジオメトリマネージャ

grid ジオメトリマネージャ

一般的にデータ量が一定ではない場合、ウィジェット内にデータを表示する内容によってはウィンドウを伸縮したい場合があります。

例えば Listbox と Scrollbar でみたプログラムは、 リストボックスのサイズによっては伸縮可能であるのが望ましいです。

ウィンドウの隅をドラッグすることで、ウィンドウがリサイズします。

それに伴い、内部のウィジェットも伸縮しています。

上記を実装するには次のようにします。

from tkinter import *
from tkinter import ttk

def button_click():
    show_selection()
    
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
    frame1 = ttk.Frame(root, padding=10)
    frame1.grid(sticky=(E,W,S,N))
    frame1.columnconfigure(0, weight=1);
    frame1.rowconfigure(0, weight=1);
    
    # Listbox
    currencies = ('JPY', 'USD', 'EUR', 'CNY', 'MXN', 'CAD')
    v1 = StringVar(value=currencies)
    lb = Listbox(frame1, listvariable=v1,height=3)
    lb.grid(row=0, column=0, sticky=(E,W,S,N))
    
    # Scrollbar
    scrollbar = ttk.Scrollbar(
        frame1, 
        orient=VERTICAL, 
        command=lb.yview)
    lb['yscrollcommand'] = scrollbar.set
    scrollbar.grid(row=0,column=1,sticky=(N,S))
    
    #Button
    button1 = ttk.Button(frame1, text='OK', command=button_click)
    button1.grid(row=1, column=0, columnspan=2, sticky=(S))
    
    root.mainloop()

ポイントは grid ジオメトリマネージャを利用するときに、 rowconfigurecolumnconfigure を使って weight を指定するところです。

weight によって、伸縮したときの行と列の割合を指定することができます。

それと、親要素のどこを基準に伸縮するかを指定するために sticky 属性を指定しています。東西南北を表す E, W, S, N で指定します。

ボタンは下側にくっつく形になるので、南を表す S を指定しています。

ホーム > Tkinter による GUI プログラミング > grid ジオメトリマネージャ