【Python Tkinter】Button(ボタン)の使い方:オプション引数一覧(サイズ・配置・外観)

2020.12.13 /

【Python Tkinter】Button(ボタン)の使い方:オプション引数一覧(サイズ・配置・外観)

PythonでGUIアプリケーションを作成するためにTkinterはよく使われます。
Tkinterの基本的な使用方法は以下記事をご参照下さい。

Tkinterでボタンを生成するためにButton(ボタン)ウィジェットを使います。

GUIアプリケーションをTkinterで作成する上で、ボタンを使いこなすことが非常に重要になります。
ボタンクリック時の動作の指定や、ボタンの装飾など様々なことをオプション引数で指定することができるからです。

本記事では、PythonのTkinterにおける、ボタンウィジェットの作成・設定について詳しく解説していきます。

ボタンウィジェットの作成(生成)

Tkinterのボタンウィジェットは文字や画像をボタン上に表示し、クリックされると紐づけられている関数(イベント)が走ります。

ボタンウィジェットの生成には以下のように記述します。

  • button = tkinter.Button(frame, text="ボタン")

第一引数にはボタンウィジェットを設置するフレームを指定し、第二引数にはtextでボタン上に表示する文字(ラベル)を指定しています。

作成するだけではフレーム上に表示はされませんので、この作成したボタンウィジェットをpack()やgrid()を使用して、フレーム上に配置します。

Button()に用意されているオプション引数を用いることで、ボタンウィジェットの文字・外観・クリック時の動作などを変更することができます。

オプション引数一覧

以下にTkinterにおけるボタンウィジェットのオプション引数一覧を記します。

オプション引数 説明
text ボタンに表示するテキスト
textvariable 表示するテキスト(tk.StringVar()のインスタンス)
font テキストのフォント・サイズ・太さ
foreground(fg) 通常時の文字色
activeforeground ボタン押下時の文字色
anchor 文字列の配置位置
justify 複数行にわたった場合の文字揃え
width ボタンの横幅
height ボタンの縦幅
background(bg) ボタンの背景色
activebackground ボタン押下時の背景色
padx x方向のボタンの内部間隔(パディング)
pady y方向のボタンの内部間隔(パディング)
relief ボタンのボーダースタイル
command ボタン押下時のイベント処理
state ボタンの状態
repeatdelay ボタン押下時のクリック判定秒数
repeatinterval ボタン長押し時のクリック判定秒数

ボタンの文字(ラベル)設定

表示する文字(ラベル):text、textvariable

ボタンに表示する文字(ラベル)はオプション引数であるtextを使用します。

  • button = tkinter.Button(frame, text="ボタン")

何かしらの操作後にボタンウィジェット上に表示している文字を変えたい場合は、オプション引数にtextを使うのではなく、textvariableを使用します。

textvariableにはtkinter.StringVarクラスのインスタンスを代入した変数を指定します。
またその変数にはset()メソッドで表示する文字列をセットします。

StringVarでのテキスト変化はなかなかイメージが付きにくいので、以下サンプルプログラムを起動して、実際にどのようにボタンウィジェットの文字が変化するのか見てみましょう。

# sample.py
import tkinter as tk
import tkinter.ttk as ttk

def search():
    text.set("Finish")

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter application")
root.geometry("200x100")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(fill = tk.BOTH, padx=20,pady=10)

# StringVarのインスタンスを格納する変数textの設定
text = tk.StringVar(frame)
text.set("Search")

# 各種ウィジェットの作成
button = tk.Button(frame, textvariable=text, command=search)

# 各種ウィジェットの設置
button.pack()

root.mainloop()

上記サンプルプログラムを実行すると以下の画面が表示されます。

Tkinter:textvariableを使用したアプリ

ボタンウィジェットをクリックすると、オプション引数のcommandで指定したsearch()関数が走り、テキストを変化させます。

Tkinter:textvariableを使用したアプリ(ボタン押下後)

文字フォント・サイズ:font

ボタンに表示される文字のフォント設定はオプション引数のfontを使用します。
文字のフォント種類や大きさ、太さを指定できます。

fontにはタプル型で格納したフォント情報、またはtkinter.font.Fontクラスのインスタンスを指定します。

  • button = tkinter.Button(frame, text=テキスト, font=(フォント種類, 文字サイズ, 太さ))

以下サンプルプログラムを起動して、ボタンウィジェットの文字の変化を見てみましょう。

# sample.py
import tkinter as tk
import tkinter.ttk as ttk

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter application")
root.geometry("400x100")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(fill = tk.BOTH, padx=20,pady=10)

# 各種ウィジェットの作成
button = tk.Button(frame, text="Search", font=("MSゴシック", "20", "bold"))

# 各種ウィジェットの設置
button.pack()

root.mainloop()
Tkinter:オプション引数fontで文字サイズ・フォント・太さを変更

上記では、フォント種類を「MSゴシック」、文字の大きさを「20」、太さを「太文字」にしています。

文字の色:foreground(fg)、activeforeground

ボタンウィジェットの文字色を変更するにはオプション引数のforeground(fg)とactiveforegroundを使用します。
それぞれカラーコードまたは色名(redやblue)を指定します。

foreground(fg)は、通常時(ボタンが押されていない状態)の文字色を設定できます。

  • button = tk.Button(frame, text="Search", fg="red")

activeforegroundは、ボタンウィジェットが「クリックされている状態」時での文字色を設定できます。

  • button = tk.Button(frame, text="Search", fg="red" , activeforeground="blue")

ボタンウィジェットが「クリック不可」状態の文字色は、disabledforegroundで設定できます。

  • button = tk.Button(frame, text="Search", state=tk.DISABLED, disabledforeground="blue")

文字の配置位置:anchor

ボタンウィジェットの文字列の配置位置は、オプション引数のanchorで設定できます。

anchorには東西南北(ewsn)を使った8方向(nw, n, ne, w, e, sw, s, se)と中央(center)で配置位置を指定します。

  • button = tk.Button(frame, text="Search", width=100, anchor="w")

複数行の文字揃え(中央揃えなど):justify

ボタンウィジェットの文字列が複数行にわたる場合に、文字列の配置(中央揃え、左揃え、右揃え)を指定できます。

状態
中央揃え tkinter.CENTER
左揃え tkinter.LEFT
右揃え tkinter.RIGHT
  • button = tk.Button(frame, text="OFFICE\rAND\rFive Four", font=("MSゴシック", "20", "bold"), width=100, justify=tk.LEFT)
Tkinter:オプション引数justifyで文字を左揃えに変更

ボタンの外観(サイズ・色)の設定

ボタンのサイズ設定:width、height

ボタンウィジェットの横幅はwidthで指定でき、縦幅はheightで指定します。

  • button = tkinter.Button(frame, text="ボタン", width=20, height=20)

ボタンの背景色:background(bg)、activebackground

ボタンウィジェットの背景色を変更するにはオプション引数のbackground(bg)とactivebackgroundを使用します。
それぞれカラーコードまたは色名(redやblue)を指定します。

background(bg)は、通常時(ボタンが押されていない状態)の背景色を設定できます。

  • button = tk.Button(frame, text="Search", bg="red")

activebackgroundは、ボタンウィジェットが「クリックされている状態」時での背景色を設定できます。

  • button = tk.Button(frame, text="Search", bg="red", activebackground="blue")

ボタンのパディング(内部間隔)設定:padx、pady

ボタンウィジェット内部の間隔(パディング)の設定には、オプション引数のpadxとpadyを使用します。

x方向の内部間隔(パディング)はpadx、y方向の内部間隔(パディング)はpadyで指定します。

それぞれピクセル単位で内部間隔を指定できます。

ボタンのボーダースタイル:relief

ボタンウィジェットのボーダースタイルの変更には、オプション引数のreliefを使用します。

ボーダースタイル 説明
FLAT 平面
RAISED ボタンが隆起
SUNKEN ボタンが凹む
GROOVE 枠が凹む
RIDGE 枠が隆起
SOLID 枠が実線
Tkinter:オプション引数reliefで表示されるButton一覧

ボタンの画像:image

ボタンに画像を表示するにはimageオプションを使用します。

詳しいimageオプションを用いた画像表示については以下記事をご参照ください。

ボタンの特殊設定

ボタンクリック時の処理:command

ボタンがクリックされた時に実行する処理は、オプション引数のcommandで指定します。

commandには定義済みの関数を指定します。

  • button = tk.Button(frame, text=テキスト,command=関数名)

commandではクリック時に呼び出される関数を紐づけられますが、キーボード操作やマウスカーソルホバー時に関数を実行したい場合はbind()メソッドを使用します。

bind()メソッドの詳しい使用方法は以下記事をご参照ください。

ボタンの状態設定:state

オプション引数であるstateでボタンの状態(クリック可能、クリック不可)を指定できます。

デフォルトは、tkinter.NORMALが指定されています。

状態
クリック可能 tkinter.NORMAL
クリック不可 tkinter.DISABLED

デフォルトは、tkinter.NORMALが指定されています。

# sample.py
import tkinter as tk
import tkinter.ttk as ttk

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter application")
root.geometry("400x150")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(fill = tk.BOTH, padx=20,pady=10)

# 各種ウィジェットの作成
button_normal = tk.Button(frame, text="クリック可能", font=("MSゴシック", "20"))
button_disable = tk.Button(frame, text="クリック不可 ", font=("MSゴシック", "20"), state=tk.DISABLED)

# 各種ウィジェットの設置
button_normal.pack()
button_disable.pack()

root.mainloop()
Tkinter:オプション引数state

ボタンウィジェットを「クリック不可」にしてボタンを押せなくした場合、なにかしらのイベント後に「クリック可」にしたいですよね。

そんな場面ではボタンウィジェットのボタンウィジェット情報stateを変更することでstate値を変えることができます。

  • button["state"] =tk.NORMAL

またはボタンウィジェットのコンフィグを変更することでstateを変えることもできます。

  • button.config(state=tk.NORMAL)

以下サンプルプログラムでは、ボタン押下で2つのボタンウィジェットのstate情報を交互に変化させています。

# sample.py
import tkinter as tk
import tkinter.ttk as ttk

def state_change():
    if button_normal["state"] == tk.NORMAL:
        button_normal["state"] = tk.DISABLED
        button_disable["state"] = tk.NORMAL
    else:
        button_normal["state"] = tk.NORMAL
        button_disable["state"] = tk.DISABLED

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter application")
root.geometry("400x150")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(fill = tk.BOTH, padx=20,pady=10)

# 各種ウィジェットの作成
button_normal = tk.Button(frame, text="クリック可能", font=("MSゴシック", "20"), command=state_change)
button_disable = tk.Button(frame, text="クリック不可", font=("MSゴシック", "20"), state=tk.DISABLED, command=state_change)

# 各種ウィジェットの設置
button_normal.pack()
button_disable.pack()

root.mainloop()

ボタン長押し時の連続処理:repeatdelay、repeatinterval

ボタンウィジェットを長押しした場合に、command引数で設定されているイベント処理を連続で実行させることができます。

つまりボタン長押しで、何度もボタンをクリックしたことにできます。

ボタン長押し時の連続処理の設定にはオプション引数のrepeatdelayとrepeatintervalを使用します。

これらが設定なしの場合、ボタンを長押ししても1度のクリックとして判定されます。

オブション引数のrepeatdelayは、ボタン押下時にクリックしたと判定させる時間(ミリ秒)を設定できます。

オブション引数のrepeatintervalは、ボタン押下しrepeatdelay秒経過してから何秒間隔で再度クリックしたとする時間(ミリ秒)を設定できます。

  • button = tk.Button(frame, text=テキスト, repeatdelay=100, repeatinterval=500)

上記はボタン押下後100ミリ秒後に1回目のクリック判定をして、その後500ミリ秒ごとにクリック判定を行います。

以下サンプルプログラム(カウントアッププログラム)では、ボタンをクリックまたは長押しでカウントが増えていくプログラムです。

# sample.py
import tkinter as tk
import tkinter.ttk as ttk

def count_up():
    global count
    count = count + 1
    text.set(count)

count = 0

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter application")
root.geometry("200x100")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(fill = tk.BOTH, padx=20,pady=10)

# StringVarのインスタンスを格納する変数textの設定
text = tk.StringVar(frame)
text.set(count)

# 各種ウィジェットの作成
button = tk.Button(frame, text="count up", command=count_up, repeatdelay=100, repeatinterval=500)
label = tk.Label(frame, textvariable=text)
# 各種ウィジェットの設置
button.pack()
label.pack()

root.mainloop()
Tkinter:カウントアップアプリ

ボタン上のカーソル設定:cursor

ボタンウィジェット上に乗ったカーソルの形は、オプション引数のcursorで指定することができます。

cursorに指定できるカーソル種類はたくさんあります。
私はarrowやwait、circleなどをよく使用しています。

カーソルの一覧は以下サイトをご参照ください。

Tkinter cursors