HOWTO · Tkinter

Tkinter ボタンコマンドに引数を渡す方法

この記事では、Tkinter ボタンコマンドに関数を伝える方法を紹介します。

このページの内容

Tkinter Button ウィジェットの command オプションは、ユーザーがボタンを押すとトリガーされます。いくつかのシナリオでは、添付のコマンド関数に引数を渡す必要がありますが、以下のような引数を単に渡すことはできません。

button = tk.Button(app, text="Press Me", command=action(args))

コマンド関数に引数を渡す 2つの方法を紹介します。

引数を partials 付きの Tkinter ボタンの command に渡す

functools モジュールの partial オブジェクトを使用してパラメータを渡すことができます。

from sys import version_info

if version_info.major == 2:
    import Tkinter as tk
elif version_info.major == 3:
    import tkinter as tk

from functools import partial


app = tk.Tk()
labelExample = tk.Button(app, text="0")


def change_label_number(num):
    counter = int(str(labelExample["text"]))
    counter += num
    labelExample.config(text=str(counter))


buttonExample = tk.Button(
    app, text="Increase", width=30, command=partial(change_label_number, 2)
)

buttonExample.pack()
labelExample.pack()
app.mainloop()
buttonExample = tk.Button(
    app, text="Increase", width=30, command=partial(change_label_number, 2)
)

partial(change_label_numer, 2) は呼び出し可能なオブジェクトを返し、参照時に関数 func に似ています。

lambda 関数を使用して Tkinter ボタンコマンドにパラメータを渡する

Python の lambda キーワードを使って、ボタンが押されたときに呼び出す一時的で使い捨ての簡単な関数を作成することもできます

from sys import version_info

if version_info.major == 2:
    import Tkinter as tk
elif version_info.major == 3:
    import tkinter as tk


app = tk.Tk()
labelExample = tk.Button(app, text="0")


def change_label_number(num):
    counter = int(str(labelExample["text"]))
    counter += num
    labelExample.config(text=str(counter))


buttonExample = tk.Button(
    app, text="Increase", width=30, command=lambda: change_label_number(2)
)

buttonExample.pack()
labelExample.pack()
app.mainloop()

lambda 関数の構文は

lambda: argument_list: expression

この例では引数は不要です。したがって、引数リストを空のままにして、式のみを記述できます。

buttonExample = tk.Button(
    app, text="Increase", width=30, command=lambda: change_label_number(2)
)

具体的には、lamda 関数でパラメータを伝達する文は

buttonExample = tk.Button(
    app, text="Increase", width=30, command=lambda: ` change_label_number(2) `
)