【Python】Tkinter memo

コーディング
  • Tkinterを使ったので、使ったものをmemoします
  • 順次追加予定です

はじめに

Tkinterとは?

  • GUIを作成するためのライブラリ
  • Pythonの標準ライブラリの一つのため、追加のインストールをせずに使用可能
    • ※一部インストールが必要な場合あり

この記事での前提

  • Tkinterを使用の際はimportが必要です:import tkinter
  • 使用時にtkinterと毎回入力するのは長いため、慣例的にimport tkinter as tkとimportし、記述の際はtk.〇〇とします
  • この記事中のサンプルコードでもimport tkinter as tkとimportした前提で記述します

ウィンドウの作成・表示:Tk()・mainloop()

  • ウィンドウの作成:tk.Tk()
    • ウィンドウ名の設定:【変数】.title("【ウィンドウ名】")
  • ウィンドウの表示:【変数】.mainloop()
    • 厳密には違う。最初はこの理解で良さそう

サンプルコード


import tkinter as tk

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")
# ウィンドウの表示
root.mainloop()

実行結果

  • 基本的にtk.Tk()でGUIのコードを始めて、tk.Tk()~mainloop()までの間に設定・定義した内容がmainloop()コマンドで表示される

ウィンドウ内の表示:Label()

  • ウィンドウ内の表示:tk.Label(【変数】, text=【表示テキスト】)
  • 表示内容の配置:pack()

サンプルコード


import tkinter as tk

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")

# ウィンドウ内表示の作成
label = tk.Label(root, text="Hello, Tkinter!")
# 表示内容の配置
label.pack(padx=20, pady=20)

# ウィンドウの表示
root.mainloop()

補足:pack()について

  • pack()は配置するためのオプションの一つ
    • pack()以外にはgrid()place()がある
  • サンプルコード中のpadx=20, pady=20は無くても表示される
    • ただし、何も設定のないlabel.pack()でも動くが、非常に見づらいウィンドウになる
    • padxは横方向、padyは縦方向の余白を定義している

ボタンの設置:Button()

  • ボタンの作成:tk.Button(【変数】, text=【ボタン表示テキスト】, command=【ボタン押下時の実行内容】)

サンプルコード


import tkinter as tk

# ボタンクリック時の動作
def button_clicked():
    # ウィンドウ内表示の更新
    label.config(text="Button Clicked!")

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")

# ウィンドウ内表示の作成(ボタンクリックで更新)
label = tk.Label(root, text="Hello Tkinter!")
# ウィンドウ内表示の配置
label.pack(padx=20, pady=10)

# ボタンの作成
button = tk.Button(root, text="Click Me", command=button_clicked)
# ボタンの配置
button.pack(padx=20, pady=10)

# ウィンドウの表示
root.mainloop()

実行結果

補足①:label.configについて

  • label.configlabelの情報を更新している
    • 今回はテキストを変更したかったため、text=を記述
  • サンプルコードではlabelがグローバル変数になっているため、引数なしで実行できている
  • もし引数が必要な場合は単純に渡すのではなく、ラムダ式などで遅延実行する必要があるので注意
    • 下記に引数で渡す場合を記載

補足②:commandに引数を渡す場合のサンプルコード

  • このコードのように、labelがローカル変数の場合は、button_clickedに引数を渡す必要がある
  • ただし、その場合はコードのようにラムダ式で変数を渡すなどの処理が必要
  • そのまま引数を渡すと、コード読み込み時に引数が渡されるため、mainloop実行時にはボタンクリック後の状態になってしまう

import tkinter as tk

# ボタンクリック時の動作
def button_clicked(label):
    # ウィンドウ内表示の更新
    label.config(text="Button Clicked!")

# ウィンドウ作成
def create_main_window():

    # ウィンドウの作成
    root = tk.Tk()
    # ウィンドウ名の設定
    root.title("title")

    # ウィンドウ内表示の作成(ボタンクリックで更新)
    label = tk.Label(root, text="Hello Tkinter!")
    # ウィンドウ内表示の配置
    label.pack(padx=20, pady=10)

    # ボタンの作成(ラムダ式で実行)
    button = tk.Button(root, text="Click Me", command=lambda: button_clicked(label))
    # ボタンの配置
    button.pack(padx=20, pady=10)

    return root

root = create_main_window()
root.mainloop()

入力:Entry()

  • 入力フォームを作成:tk.Entry(【変数(ウィンドウ)】)
  • 入力フォームから中身を取得:【変数(入力フォーム)】.get()

サンプルコード

  • Entryの例としては少し長めですが、入力情報を何かしらに使うところまでをサンプルとしました
    • 今回は中身を取得して、表示に反映します
import tkinter as tk

def submit_text():
    # 入力(entry)から中身を取得
    input_text = entry.get()
    # ウィンドウ内表示を更新
    label.config(text=input_text)

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")

# ウィンドウ内表示を作成
label = tk.Label(root, text="入力した内容が表示されます")
# ウィンドウ内表示を配置
label.pack(padx=10, pady=10)

# 入力フォームを作成
entry = tk.Entry(root)
# 入力フォームを配置
entry.pack(padx=10, pady=10)

# ボタンを作成(クリックで入力内容を表示)
button = tk.Button(root, text="登録", command = submit_text)
# ボタンを配置
button.pack(padx=10, pady=10)

# ウィンドウの表示
root.mainloop()

実行結果

入力画面を表示

入力して、「登録」をクリック

入力内容が表示される

ポップアップの表示:Toplevel()

  • ポップアップウィンドウの作成:tk.Toplevel()
    • titleLabel等、tk.Tk()同様に設定が可能
  • tk.Toplevel()を定義した関数を呼び出すと表示される
    • tk.Tk()のようにmainloop()で改めて呼び出す必要はない

サンプルコード

  • クリックすると、ポップアップウィンドウが表示されるコードを実装しました

import tkinter as tk

def button_click():
    # ポップアップウィンドウを呼び出し
    popup_window()

def popup_window():
    # ポップアップウィンドウを作成
    popup = tk.Toplevel()
    # ポップアップウィンドウ名の設定
    popup.title("ポップアップ ウィンドウ")

    # ポップアップウィンドウ内表示を作成
    label_popup = tk.Label(popup, text="ポップアップウィンドウを表示しました")
    # ポップアップウィンドウ内表示を配置
    label_popup.pack(padx=10, pady=10)

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")

# ウィンドウ内表示を作成
label = tk.Label(root, text="ボタンをクリックすると、ウィンドウがポップアップします")
# ウィンドウ内表示を配置
label.pack(padx=10, pady=10)

# ボタンを作成(クリックで入力内容を表示)
button = tk.Button(root, text="クリック", command = button_click)
# ボタンを配置
button.pack(padx=10, pady=10)

# ウィンドウの表示
root.mainloop()

実行結果

クリックすると、ポップアップウィンドウが表示される

位置を調整して配置:grid

注意(25.4.12)

  • Tkinterで配置に使用できるのは主にpack grid place の3種類

    • 本来であれば、↑の3つをまとめて記述するべき
  • まだplaceを使用していないので、現時点ではgridを独立して扱う

    • packは「ウィンドウの作成・表示で少しだけ触れている」
  • いずれ、pack grid placeをまとめた記事にしたいです

  • 位置を指定して配置:.grid(row=【数字(何行目)】, column=【数字(何列目)】)

    • row:縦方向の数字
    • column:横方向の数字
  • サンプルコードでは右上、左下の2ヶ所に配置する場合と10×10で表示する場合を作成

サンプルコード(2ヶ所に表示)


import tkinter as tk

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")

# ウィンドウ内表示を作成・配置(右上)
label_upper_right = tk.Label(root, text="右上に表示")
label_upper_right.grid(row=7, column=3)

# ウィンドウ内表示を作成・配置(左下)
label_lower_left = tk.Label(root, text="左下に表示")
label_lower_left.grid(row=3, column=7)

# ウィンドウの表示
root.mainloop()

実行結果

サンプルコード(10×10で表示)

  • 表のように配置する場合、下記のようにfor文を使用すると効率的

import tkinter as tk

# ウィンドウの作成
root = tk.Tk()
# ウィンドウ名の設定
root.title("title")

# 10×10のテキストを表示
for row in range(0, 10):
    for column in range(0, 10):
        label_text = "( " + str(column) + " , " + str(row) + " )"
        label = tk.Label(root, text=label_text)
        label.grid(row=row, column=column)

# ウィンドウの表示
root.mainloop()

実行結果

コメント

タイトルとURLをコピーしました