tkinter の覚え書き

初版作成  2022.4.16
最終更新  2024.04.01


◆◆ チュートリアルサイト ◆◆

https://qiita.com/nnahito/items/ad1428a30738b3d93762

◆◆ 定型パターン ◆◆


import tkinter as tk

root = tk.Tk()  # 最初に記述  メインウィンドウを作成
root.title("app name")
root.geometry("1000x700")     # サイズを指定するとき
root.geometry()               # 中身に応じてサイズは自動

root もフレームの一種

この場所に widget の生成と配置を記述

root.mainloop()      # 最後に記述


label1 = tk.Label(  .... ) のように記述すると、
label1 はグローバル変数のオブジェクトとなる。


◆◆ 配置の方法 ◆◆


参考サイト:https://www.shido.info/py/tkinter2.html

・grid を使う

widget1.grid(column=0, row=0, sticky="EWNS")

frame1.rowconfigure(0, weight=1)      # 引き延ばされたとき 1:1 で伸びる
frame1.columnconfigure(0, weight=1)   # 引き延ばされたとき 1:1 で伸びる
frame1.columnconfigure(1, weight=1)

・pack を使う

widget1.pack(side=tk.LEFT)

・layout を使う(未確認)

widget1.place(x=10, y=100)

◆◆ pad, ipad の使い方 ◆◆


label1 = tk.Label(  A  )
label1.grid(  B  )

padx=20, pady=30 のように指定する

A で pad を指定すると Label の内側
B で pad を指定すると Label の外側
B で ipad を指定すると Label の内側 (A と同じ)

◆◆ Frame ◆◆


複数のウィジェットを乗せる土台

frame1 = tk.Frame(parent_frame, padx=5, pady=5, bg="#ffd0d0")

◆◆ Label ◆◆


label1 = tk.Label(parent_frame, font=('',fontsize), padx=5, pady=5, text="文字列", fg="#ff0000", bg="#000000")

◆◆ Entry (1行入力) ◆◆


text1 = tk.Entry(parent_frame, font=('', fontsize), width=10)
text1.configure(state='normal', width = 50)   # 入力可 state='readonly'
text1.insert(0, '文字列')         # 1文字目に挿入
text1.insert(tk.END, '文字列')    # 末尾に挿入

中身の取得
moji = text1.get()

内容削除
text1.delete(0, tk.END)     # 開始位置, 終了位置

◆◆ Text (複数行入力) ◆◆


memo1 = tk.Text(parent_frame, width=35, height=5, font=('',fontsize), blockcursor = True)

内容の取得
moji = memo1.get('1.0', 'end -1c')

◆◆ Button ◆◆


コールバック関数は引数なし ( start() )

button1 = tk.Button(parent_frame, font=('', fontsize), text='文字', command=start)    # 押されたとき呼び出す関数は def start():

コールバック関数は引数付き ( start2(0))

button2 = tk.Button(parent_frame, font=('', fontsize), text='文字', command=lambda:start2(0))

◆◆ Scrolledtext (スクロールするテキストボックス) ◆◆


scroll_text1 = tk.scrolledtext.ScrolledText(parent_frame, state='disabled', font=('', fontsize), width=40, height=10, bg="#d0d0d0")

◆◆ Combobox ◆◆


from tkinter import ttk

combobox1 = ttk.Combobox(parent_frame, font=('', fontsize))

値のセット
cb_list = [1, 2, 3, 4, 5]
cb_tuple = tuple(cb_list)  # combobox の要素はタプルで指定
                           # list から tuple を作れる
combobox1['values'] = cb_tuple
combobox1.set("ウィンドウに表示する文字列")

値の取得
moji = combobox1.get()

◆◆ コールバック関数の記述 ◆◆


ウィジェットにイベントを結びつける

text1.bind(sequence=<Return>, func=func1)
button1.bind(sequence=<Button-1>, func=func2)

def func1(event):


◆◆ 画像の表示 ◆◆


img1 = tkinter.PhotoImage(file = "img1.png")
canvas.create_image(x, y, image = img1, tag = "image1")

更新

img2 = tkinter.PhotoImage(file = "img2.png")
canvas.delete("image1")
canvas.create_image(x, y, image = img2, tag = "image1")

(注意!)
img1, img2 はグローバル変数でなくてはならない。
def の中でローカル変数として img2 = .... を実行すると
def から抜けた瞬間に消えてしまうため、
画像が表示されない。

画像を切り替えるときは、以下のように配列に入れておくとよい。