16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Tkinter】Python tkinterはこう考えればイメージしやすい!

Last updated at Posted at 2023-04-17

はじめに

この記事には続きがあります

tkinterってとっつきづらいきがする。でもPySimpleGUIはなんとなくカッコ悪い気がする、、、
tkinterをマスターしないまでも、「こう考えればOK!」と頭の中で整理しやすくするために覚書を残したいと思います。

とりあえずウィジェットの作成、配置、関数の実行ができればOK

基本の考え方

個人的にええ感じやんと思うtkinterの書き方の基本方針は
「ヒエラルキーの高いウィジェットから定義していき、ヒエラルキーの低いウィジェットから配置していく」

tkinterでGUI作成する際は次のような考え方をする。

親ウィジェットの定義
子ウィジェットの定義
孫ウィジェットの定義
...
孫ウィジェットの配置
子ウィジェットの配置
親ウィジェットの配置

ウィジェットの配置方法はpack,grid,placeがある。個人的にはgridが好み。

配置方法 イメージ
pack 詰め込み
grid マトリクス的に配置
place 任意の場所に置く

例:定義と配置

次のようなGUIを作成する
image.png

ベタ打ち

画面そのもの(親)を作成
その中にフレームを2つ(子)作成
その中にエントリーボックスとボタン(孫)を作成

import tkinter as tk
# =============================================================================
# 定義セクション
# =============================================================================
# 画面そのもの(親)の定義
root = tk.Tk()
root.title("タイトル")

# フレーム(子)の定義
frame1 = tk.Frame(root)
frame2 = tk.Frame(root)

# エントリーとボタン(孫)の定義
entry = tk.Entry(frame1, width=50)
button = tk.Button(frame2, width=10, text="ボタン")

# =============================================================================
# 配置セクション
# =============================================================================
# エントリーとボタン(孫)の配置
entry.grid(row=0, column=0)
button.grid(row=0, column=0)

# フレーム(子)の配置
frame1.grid(row=0, column=0)
frame2.grid(row=1, column=0)

# 画面そのもの(親)の配置
root.mainloop()

関数の設定

ウィジェットに操作がされたとき、関数を動かすことができる。
ウィジェットを定義する際、commandに関数を仕込む。引数を指定したい場合はlambda関数を使用する。

button = tk.Button(frame, width=10, text="ボタン", command=関数名)
# or
button = tk.Button(frame, width=10, text="ボタン", command=lambda:関数(引数))

値の取得

値を取得したいときはget()メソッドを使用する

entry.get()

例:ボタンを押すと値を取得する

ボタンを押すと関数が動き、入力された値を取得するアプリ

import tkinter as tk
# =============================================================================
# 関数の定義
# =============================================================================
def gettext(entry):
    text = entry.get()
    print(f"{text}")

# =============================================================================
# 定義セクション
# =============================================================================
# 画面そのもの(親)の定義
root = tk.Tk()
root.title("タイトル")

# フレーム(子)の定義
frame = tk.Frame(root)

# エントリーとボタン(孫)の定義
entry = tk.Entry(frame, width=50)
button = tk.Button(frame, width=10, text="ボタン", command=lambda:gettext(entry))
checkbutton = tk.Checkbutton(frame)

# =============================================================================
# 配置セクション
# =============================================================================
# エントリーとボタン(孫)の配置
entry.grid(row=0, column=0)
button.grid(row=1, column=0)
checkbutton.grid(row=2, column=0)

# フレーム(子)の配置
frame.grid(row=0, column=0)

# 画面そのもの(親)の配置
root.mainloop()

メニューバーの定義

メニューバーは画面そのものの子として振る舞うものの、メニューバーのみでヒエラルキーを形成する。
画面そのもの(親)に対する子として作成する。ただし、他のFrameやButtonとの兄弟として作成。
image.png

import tkinter as tk
# =============================================================================
# 定義セクション
# =============================================================================
# 画面そのもの(親)の定義
root = tk.Tk()
root.title("タイトル")

# メニューバー(子)の定義
menubar = tk.Menu(root)

# メニュー(孫)の定義
menu = tk.Menu(root, tearoff=0)
menu.add_command(label="A")#command=lambda:関数(引数)を追加すれば処理をさせられる
menu.add_separator()
menu.add_command(label="B")

# メニュー(孫)の定義
helpmenu = tk.Menu(root, tearoff=0)
helpmenu.add_command(label="About us")
helpmenu.add_separator()
helpmenu.add_command(label="Help")

# =============================================================================
# 配置セクション
# =============================================================================
# メニュー(孫)の配置
menubar.add_cascade(label="menu", menu=menu)
menubar.add_cascade(label="help", menu=helpmenu)

# メニューバー(子)配置
root.config(menu=menubar)

# 画面そのもの(親)の配置
root.mainloop()

バインド

ユーザーの動作をきっかけに関数を呼び出す。
引数を入れる方法が案外乗っていないので載せておく。

.bind()メソッドを使用しroot.bind("<キー>", lambda event:関数(引数))のように記述する
キーはsequenceという引数に渡されている。

バインドしたいキー sequence 備考
Ctrl + A "<Control-a>"
Shift + A "<Shift-A>" Aが大文字になることに注意
Enter "<Return>" EnterではなくReturnであることに注意
任意キー "<Key>"

キーの名前に困ったときは
event.keysymを使うと何のキーが押されたかをstrで返してくれる

import tkinter as tk
# =============================================================================
# 関数の定義
# =============================================================================
def function(text):
    print(text)

# =============================================================================
# 定義セクション
# =============================================================================
# 画面そのもの(親)の定義
root = tk.Tk()
root.title("タイトル")

# =============================================================================
# バインド
# =============================================================================
root.bind("<Key>", lambda event:function(event.keysym))

# =============================================================================
# 配置セクション
# =============================================================================
# 画面そのもの(親)の配置
root.mainloop()
16
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?