naritoブログ

このブログはDjangoとBootstrap4で作成されました
ソースコード

Tkinter、gridレイアウトでウィジェットを等分に配置する

プログラミング関連 Python Tkinter 約32日前
2017年10月21日7:20
Tkinterのグリッドレイアウトで、左と右にウィジェットを等分配置したいと思います。
それぞれ幅の50%を使うとしましょう。

普通にgridを使うと、以下のように書けます。
import tkinter as tk
import tkinter.ttk as ttk


class MainFrame(ttk.Frame):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, **kwargs)
        self.create_widgets()

    def create_widgets(self):
        """ウィジェットの作成と配置"""
        # 左側、言語リストの作成
        self.languages = tk.StringVar(value=('Python', 'C', 'Tcl/Tk'))
        self.left = tk.Listbox(self, listvariable=self.languages)

        # 右側、テキストエリアの作成
        self.right = tk.Text(self)

        # ウィジェットの配置
        self.left.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
        self.right.grid(column=1, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))

        # ウィジェットの引き伸ばし設定
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.rowconfigure(0, weight=1)


root = tk.Tk()
app = MainFrame(root)
app.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
root.mainloop()




これは以下のようになります。残念ながら、画面の半分ずつにはなっていません。



この原因は、それぞれのウィジェットにデフォルトの大きさがあるためです。
つまり、今回だとtk.Textの元々の大きさが少し大きいのです。
解決方法はいくつかありますが、最も簡単な方法はuniform引数を指定することです。
        self.columnconfigure(0, weight=1, uniform='group1')
        self.columnconfigure(1, weight=1, uniform='group1')



うまく等分されています!