GUI

Pythonでペイントアプリを作ってみる (2) Frameでレイアウトしてみる

タカ

先日に続いて、Frameでレイアウトを組んでみます。

Frameのオプション

オプション名説明
background(bg)背景色
bordwidth(bd)ボーダーの幅、デフォルトは0(reliefを設定する時は0にする)
relief周りの見た目、デフォルトはflat, raised(出っぱり), sunkenn(引っ込み), groove(溝), ridge(土手)
width幅(px)
height高さ(px)

Packのオプション

オプション名説明
anchorWidgetを配置する位置、デフォルトはcenter(中央),
w(左寄せ), n(上寄せ), e(右寄せ), s(下寄せ), nw(左上), sw(左下), ne(右上), se(右下)
expand親のwidgetに合わせて大きくなるか1で有効、0が無効(デフォルト)
fillwidgetで空いたスペースを埋める
none(維持), both(縦横に広がる), x(横に広がる), y(縦に広がる)
ipadx, ipadyウィジェットの各側面の内側の幅の長さ
padx, padyウィジェットの各側面の外側の幅を長さ
side詰める方向、left(左から), top (上から), right(右から), bottom(下から)

サンプルコード

import tkinter as tk


class PaintApp():

    root = None

    def __init__(self, root):
        self.root = root
        self.setup_menu()
        self.setup_tool_detail_bar()
        self.setup_tool_bar()
        self.setup_canvas_frame()
        self.bind_shortcut()

    def setup_menu(self):
        menubar = tk.Menu(self.root)
        self.setup_file_menu(menubar)
        self.root.config(menu=menubar)

    def setup_file_menu(self, menubar):
        file_menu = tk.Menu(menubar, tearoff=False)
        file_menu.add_command(label="新規", underline=None,
                              accelerator="Ctrl+N", command=self.new_file)
        file_menu.add_command(label="保存", underline=None,
                              accelerator="Ctrl+S", command=self.save_file)
        file_menu.add_separator()
        file_menu.add_command(label="終了", underline=None)
        menubar.add_cascade(label="ファイル", menu=file_menu, underline=0)

    def setup_tool_detail_bar(self):
        self.tool_detail_bar = tk.Frame(self.root, height=30, bg="yellow")
        self.tool_detail_bar.pack(fill="x", side="top")

    def setup_tool_bar(self):
        self.tool_bar = tk.Frame(self.root, width=30, bg="red")
        self.tool_bar.pack(fill="y", side="left")

    def setup_canvas_frame(self):
        self.canvas_frame = tk.Frame(
            self.root, width=800, height=800, bg="blue")
        self.canvas_frame.pack(expand="yes", fill="both", side="right")

    def bind_shortcut(self):
        self.root.bind('<Control-n>', self.new_file)
        self.root.bind('<Control-s>', self.save_file)

    def new_file(self, event=None):
        print("ファイルを作成")

    def save_file(self, event=None):
        print("ファイルを保存")


if __name__ == '__main__':
    root = tk.Tk()
    app = PaintApp(root)
    root.mainloop()