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)`)
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn