【Python Tkinter】Button(ボタン)の使い方:オプション引数一覧(サイズ・配置・外観)
2020.12.13 /
PythonでGUIアプリケーションを作成するためにTkinterはよく使われます。
Tkinterの基本的な使用方法は以下記事をご参照下さい。
【Python】tkinterを使ったGUIアプリケーションの作成方法
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()
上記サンプルプログラムを実行すると以下の画面が表示されます。
ボタンウィジェットをクリックすると、オプション引数のcommandで指定したsearch()関数が走り、テキストを変化させます。
文字フォント・サイズ: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()
上記では、フォント種類を「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)
ボタンの外観(サイズ・色)の設定
ボタンのサイズ設定: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 | 枠が実線 |
ボタンの画像:image
ボタンに画像を表示するにはimageオプションを使用します。
詳しいimageオプションを用いた画像表示については以下記事をご参照ください。
【Python tkinter】クリックされたボタンを関数内で判別しテキスト情報などを取得する(bind,event)
ボタンの特殊設定
ボタンクリック時の処理:command
ボタンがクリックされた時に実行する処理は、オプション引数のcommandで指定します。
commandには定義済みの関数を指定します。
- button = tk.Button(frame, text=テキスト,command=関数名)
commandではクリック時に呼び出される関数を紐づけられますが、キーボード操作やマウスカーソルホバー時に関数を実行したい場合はbind()メソッドを使用します。
bind()メソッドの詳しい使用方法は以下記事をご参照ください。
【Python tkinter】クリックされたボタンを関数内で判別しテキスト情報などを取得する(bind,event)
ボタンの状態設定: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()
ボタンウィジェットを「クリック不可」にしてボタンを押せなくした場合、なにかしらのイベント後に「クリック可」にしたいですよね。
そんな場面ではボタンウィジェットのボタンウィジェット情報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()
ボタン上のカーソル設定:cursor
ボタンウィジェット上に乗ったカーソルの形は、オプション引数のcursorで指定することができます。
cursorに指定できるカーソル種類はたくさんあります。
私はarrowやwait、circleなどをよく使用しています。
カーソルの一覧は以下サイトをご参照ください。