Tkinter grid ジオメトリマネージャ

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

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

Tkinter Geometry Manager

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

Tkinter Window Resize

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

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

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 ジオメトリマネージャを利用するときに、 rowconfigurecolumnconfigure を使って weight を指定するところです。

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

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

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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門