Python3 - Tkinter ウィジェットを配置する (pack)

目次

ウィジェットを垂直方向に配置する

ウィジェットを垂直方向かつ上から下に向かって配置したい場合は、 pack メソッドの side オプションに "top" を指定します (side のデフォルト値は "top" なので、 この場合の side オプションは省略しても問題ありません)。

もし、垂直方向でも下から上に向かって配置したい場合は、"bottom" を指定してください。

Example

source code

from tkinter import Tk
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()
        self.make_style()
        self.create_widgets()

    def make_style(self):
        s = ttk.Style()
        s.configure("TLabel", padding=8,
                              font=("", 10, "bold"),
                              background="#ffff00",
                              borderwidth=2,
                              relief="ridge")

    def create_widgets(self):
        label1 = ttk.Label(self, text="Armadillo")
        label1.pack(side="top")

        label2 = ttk.Label(self, text="Bear")
        label2.pack(side="top")

        label3 = ttk.Label(self, text="Cat")
        label3.pack(side="top")

root = Tk()
root.title("Tkinter win")
frame = MainFrame(root)
frame.mainloop()

result

実行結果

ウィジェットを水平方向に配置する

ウィジェットを水平方向かつ左から右に向かって配置したい場合は、 pack メソッドの side オプションに "left" を指定します。

もし、水平方向でも右から左に向かって配置したい場合は、"right" を指定してください。

Example

source code

from tkinter import Tk
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()
        self.make_style()
        self.create_widgets()

    def make_style(self):
        s = ttk.Style()
        s.configure("TLabel", padding=8,
                              font=("", 10, "bold"),
                              background="#ffff00",
                              borderwidth=2,
                              relief="ridge")

    def create_widgets(self):
        label1 = ttk.Label(self, text="Armadillo")
        label1.pack(side="left")

        label2 = ttk.Label(self, text="Bear")
        label2.pack(side="left")

        label3 = ttk.Label(self, text="Cat")
        label3.pack(side="left")

root = Tk()
root.title("Tkinter win")
frame = MainFrame(root)
frame.mainloop()

result

実行結果

padx, pady オプション

ウィジェットの外側の余白を変更したい場合は、 padx 及び pady を設定します。
左右については padx を、 上下については pady に数値を指定します。

padx, pady を省略すると、それぞれの余白は 0 (余白無し) となります。

Example

source code

from tkinter import Tk
from tkinter import ttk

print("padx (0, 1, 2, ...) > ", end="")
padx = int(input())

print("pady (0, 1, 2, ...) > ", end="")
pady = int(input())

root = Tk()
root.title("Tkinter win")

s = ttk.Style()
s.configure("TLabel", padding=8,
                      font=("", 10, "bold"),
                      background="#ffff00",
                      borderwidth=2,
                      relief="ridge")

fmt = "padx = {:d}\npady = {:d}"
label1 = ttk.Label(root,
                   text=fmt.format(padx, pady))
label1.pack(padx=padx, pady=pady)

root.mainloop()

result

padx, pady のそれぞれに「任意の値」を指定したときの実行例:

実行結果

fill オプション

fill オプションを設定すると、 メインウィンドウのサイズを変更したときに、 配置したウィジェットのサイズの振る舞いを変更することができます。

"none" の場合は、メインウィンドウのサイズを変更しても、 初期のウィジェットのサイズを保持します。

fill を省略すると、"none" のときと同様な振る舞いをします。

"x", "y", "both" の場合は、メインウィンドウのサイズを変更すると、 ウィジェットのサイズも変更されます。
ただし、サイズが変更される振る舞いは side, expand オプションの値に依存するので、詳しくは次の example を参照ください (補足で、垂直方向と水平方向の両方のサイズを変更するようにしたい場合は、expand=1 とする必要があります)。

Example

source code

from tkinter import Tk
from tkinter import ttk

print("side (top, bottom, left, right) > ", end="")
side = input()

print("expand (0, 1) > ", end="")
expand = int(input())

root = Tk()
root.title("Tkinter win")

s = ttk.Style()
s.configure("TLabel", padding=8,
                      font=("", 10, "bold"),
                      background="#ffff00",
                      borderwidth=2,
                      relief="ridge")

fmt = "side = '{:s}'\nexpand = {:d}\nfill = '{:s}'"
fill = "none"
label1 = ttk.Label(root,
                   text=fmt.format(side, expand, fill))
label1.pack(side=side, expand=expand, fill=fill)

fill = "both"
label2 = ttk.Label(root,
                   text=fmt.format(side, expand, fill))
label2.pack(side=side, expand=expand, fill=fill)

fill = "x"
label3 = ttk.Label(root,
                   text=fmt.format(side, expand, fill))
label3.pack(side=side, expand=expand, fill=fill)

fill = "y"
label4 = ttk.Label(root,
                   text=fmt.format(side, expand, fill))
label4.pack(side=side, expand=expand, fill=fill)

root.mainloop()

result

side="top", expand=0 を指定したときの実行例:

実行結果

side="top", expand=1 を指定したときの実行例:

実行結果

side="left", expand=0 を指定したときの実行例:

実行結果

side="left", expand=1 を指定したときの実行例:

実行結果

anchor オプション

anchor オプションを設定すると、 メインウィンドウのサイズを変更した時に、 区画内でウィジェットの配置する位置を変更することができます。

オプションの値は "nw", "n", "ne", "w", "center", "e", "sw", "s", "se" のいずれかを指定します。 それぞれ、区画内で「左上」、「上」、「右上」、「左」、「中央」、「右」、「左下」、「下」、「右下」に配置されます。
ただし、配置される振る舞いは side, expand オプションの値に依存するので、詳しくは次の example を参照ください。

また、anchor を省略すると、"center" のときと同様な振る舞いをします。

Example

source code

from tkinter import Tk
from tkinter import ttk

print("side (top, bottom, left, right) > ", end="")
side = input()

print("expand (0, 1) > ", end="")
expand = int(input())

print("anchor (nw, n, ne, w, center, e, sw, s, se) > ", end="")
anchor = input()

root = Tk()
root.title("Tkinter win")
root.geometry("160x120")

s = ttk.Style()
s.configure("TLabel", padding=8,
                      font=("", 8, "bold"),
                      background="#ffff00",
                      borderwidth=2,
                      relief="ridge")

fmt = "side = '{:s}'\nexpand = {:d}\nanchor = '{:s}'"
label1 = ttk.Label(root,
                   text=fmt.format(side, expand, anchor))
label1.pack(side=side, expand=expand, anchor=anchor)

root.mainloop()

result

side="top", expand=0, anchor に「任意の値」を指定したときの実行例:

実行結果

side="top", expand=1, anchor に「任意の値」を指定したときの実行例:

実行結果

参考リンク