ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Python - Tkinter(GUI構築ライブラリ)の基本

初め

 Tkinter とは PythonGUI を組むことのできるツールキットのことです。本記事では、Tkinter の特徴や使い方を簡単にまとめます。

Tkinter とは

 Tkinter とは PythonGUI を組むことのできるツールキットのことです。

 ウィンドウを作成し、その上にボタンやスライダーなどを表示させることができます。

 本記事では、上の画像のように Tkinter で配置できるウィジェット(ボタンやスライダーなど)の一覧を表示するウィンドウを作成していく中で、Tkinter の使い方を学びます。

Tkinter の構造

 Tkinter は Window > Frame > Widget の3層構造になっています。

 GUI 画面の作成手順は基本的には、次の手順で作成していきます。

  1. Window の作成
  2. Frame設定・配置
  3. Widget設定・配置

Tkinter の使い方

インポート

(方法1)

import tkinter as tk   #tkinterのインポート

 tkinter を tk としてインポートしています。tkinter のメソッドを使用する場合は、オブジェクト(インスタンス)名 tk が必要になります。

import tkinter as tk   #tkinterのインポート

root = tk.Tk()
root.mainloop()

(方法2)

from tkinter import *   #tkinterのインポート

root = Tk()
root.mainloop()

 import * とすることで、オブジェクト名を省略できます。

Window の作成

 WIndow を作成します。

from tkinter import *   #tkinterのインポート

root = Tk()   #Tkinterのメインウィンドウ(ルートウィンドウ)の作成
root.mainloop()   #メインループの開始
root = Tk()

 Tk() メソッドでは、Tkinter のメインウィンドウ(ルートウィンドウ)を作成します。変数 root にウィンドウのインスタンスを代入しています。

root.mainloop()

 mainloop() メソッドにより、Tkinter アプリケーションのメインループを開始します。このメソッドによりウィンドウを表示し続け、ボタンのクリックなどのイベントを処理することができます。mainloop() メソッドがない場合、インスタンスを作成しただけなので、ウィンドウが表示されません。

 今後、Window の設定や Frame の設定などをしていきますが、それらは root = Tk() と root.mainloop() の間に記述していきます。

Window の設定
root = Tk() #メインウィンドウのインスタンス化

#------ Windowの設定 -------#
root.title("Tkinterの練習") #画面タイトル変更
root.geometry("640x360")    #初期画面サイズ(widthxheight)
root.maxsize(1024, 576) #最大画面サイズ(width, height)
root.minsize(640, 360)  #最小画面サイズ(width, height)

root.mainloop()

 上のコードのように Title() メソッドや geometry() メソッドなどのメソッドを使って設定できます。

 使用できるメソッド一覧の載せてくださっているリンク先を参考に貼っております。


Frame

 Frame は複数のウィジェットを配置できるコンテナのようなウィジェットです。メインウィンドウの上に直接、ウィジェットを置くこともできますが、複数のウィジェットを Frame でまとめることでレイアウトが簡単になります。

 今回は、見出しを表示するフレームとウィジェット一覧を表示するフレームを作成します。

(完成図のイメージ)

#見出し用フレーム
head_frame = Frame(root)
head_frame.pack()

#メインフレーム
main_frame = Frame(root)
main_frame.pack()

 root フレームに head_frame と main_frame を作成し、pack() で配置しています。pack() に引数を記述しない場合は、中央配置・パディング(隙間)無しで配置されます。

head_frame.pack(side="bottom", padx=10, pady=10)

 上のコードのように引数で配置場所やパディングを指定することもできます。

ウィジェットの配置

 ラベルやボタン、スライダーなどウィジェットを各フレームに配置していきます。

 例えば、ラベルであれば次のように記述することでインスタンスを作成することができます。引数は省略可能です。

Label(Frameオブジェクト, text=’ラベル文字列’, font=(‘フォント名’, サイズ), bg=’背景色’, fg=’文字色’)

 head_frame の場合、次のようにします。

#見出し用フレーム
head_frame = Frame(root)
Label(head_frame, text="ウィジェット一覧", font=("", 18, "")).pack()
head_frame.pack()

 head_frame に配置するために Frame オブジェクトを指定しています。また、表示したいテキストやフォントサイズを指定して、pack() で配置しています。

 フォントの設定については、フォント名、文字サイズ、太さを指定できます。

font=(フォント名, 文字サイズ, 太さ)
font=("MSゴシック", "20", "bold")

 main_frame に他のウィジェットを配置していきます。その際、ウィジェット名と説明については、リストで初めに定義しておきます。また、ttk をインポートし、使用しています。ttk の説明は後述

(コード全文)

from tkinter import *
from tkinter import ttk

# ウィジェットと説明の情報をリストで定義
widgets_info = [
    ("Button", "クリック可能なボタンです。"),
    ("Label", "テキストや画像を表示するためのウィジェットです。"),
    ("Entry", "1行のテキスト入力フィールドです。"),
    ("Checkbutton", "チェックボックスです。"),
    ("Menubutton", "ボタンを押すと選択肢が表示されます。"),
    ("Radiobutton", "ラジオボタンです。"),
    ("Scale", "スライダーバーです。"),
    ("Scrollbar", "スクロールバーです。"),
    ("Spinbox", "スピンボックスです。数値を入力するためのボックスです。")
]

root = Tk()
root.title("Tkinter ウィジェット一覧")

#見出し用フレーム
head_frame = Frame(root)
Label(head_frame, text="ウィジェット一覧", font=("", 18, "")).pack()
head_frame.pack()

#メインフレーム
main_frame = Frame(root)
main_frame.pack()

# ウィジェット名を配置
for i, (widget_name, _) in enumerate(widgets_info):
    Label(main_frame, text=widget_name).grid(row=i, column=0, padx=5, pady=5, sticky="w")

# ウィジェットを配置
Button(main_frame, text="Button").grid(row=0, column=1, padx=5, pady=5, sticky="w")
Label(main_frame, text="Label").grid(row=1, column=1, padx=5, pady=5, sticky="w")
Entry(main_frame).grid(row=2, column=1, padx=5, pady=5, sticky="w")
Checkbutton(main_frame).grid(row=3, column=1, padx=5, pady=5, sticky="w")
ttk.Menubutton(main_frame, text="Menubutton").grid(row=4, column=1, padx=5, pady=5, sticky="w")
ttk.Radiobutton(main_frame).grid(row=5, column=1, padx=5, pady=5, sticky="w")
ttk.Scale(main_frame).grid(row=6, column=1, padx=5, pady=5, sticky="w")
ttk.Scrollbar(main_frame).grid(row=7, column=1, padx=5, pady=5, sticky="w")
ttk.Spinbox(main_frame).grid(row=8, column=1, padx=5, pady=5, sticky="w")

# 説明を配置
for i, (_, description) in enumerate(widgets_info):
    Label(main_frame, text=description, wraplength=300, justify="left").grid(row=i, column=2, padx=5, pady=5, sticky="w")

root.mainloop()

 main_frame では、各ウィジェットを pack() ではなく grid で表の中に配置しています。

grid(row=行位置, column=列位置)
ttk について

 ttk とはTk 8.5 で導入された Tkinter の拡張モジュールで、より現代的な外観を持ったウィジェットを提供します。combobox や Notebook など ttk にしかないウィジェットもあります。

from tkinter import ttk

Button(root, text="通常のButton").pack()
ttk.Button(root, text = "ttkのButton").pack()


実行結果

 実行することで Tkinter で使用できるウィジェットとその説明をウィンドウに表示させることができました。

 さらに、作り込むのであればボタンを押したらメソッドを呼び出すようにしたり、Entry で打ち込んだ文字列をちゃんと取得するようにしたり各機能の試行ができるようにすることが考えられます。