Tkinterのtraceメソッドでコールバックに渡される引数とは?意味と使い方を解説
Tkinterでは、ウィジェットに対してtextvariable=varの形で変数(var)を関連付けることで、ウィジェットの最新の値を保存できます。しかし、変数の値が更新されるタイミングで、読み取りや書き込みといった追加処理を実行したいケースが出てきます。
そんなときに役立つのが、コールバック関数を登録できるtraceメソッド(self, mode, callback)です。第1引数のモードには、処理の種類として「r(read:読み取り時)」「w(write:書き込み時)」「u(undefined:未定義時)」のいずれかを指定します。このモードの値に基づいて、コールバック関数内で実行すべき処理を判断できます。
コールバック関数に渡される3つの引数
トレースによって呼び出されるコールバック関数は、以下の3つの引数を受け取ります。
- var(変数名):トレース対象となっている変数の情報を持つTk変数の内部名。
- index:配列型変数の場合の要素インデックス。通常のスカラー変数では空文字列になります。
- mode:トリガーとなった操作の種類。「w」「r」「u」のいずれかの文字列。
なお、Python 3.6以降ではtrace_variableは非推奨となっており、代わりにtrace_add("write", コールバック)を使用することが推奨されています。
サンプルコード
次の例では、Entryウィジェットに入力された値が更新されるたびに、その値をトレースしてコンソールに出力します。
# 必要なライブラリをインポート
from tkinter import *
# Tkinterフレームのインスタンスを作成
win = Tk()
win.geometry("750x250")
# ユーザー入力を保存するための変数を作成
my_variable = StringVar()
def trace_when_Entry_widget_is_updated(var, index, mode):
print("{}".format(my_variable.get()))
my_variable.trace_variable("w", trace_when_Entry_widget_is_updated)
Label(win, textvariable=my_variable).pack(padx=5, pady=5)
Entry(win, textvariable=my_variable, width=20).pack(ipadx=20, padx=5, pady=5)
win.mainloop()実行結果
上記のコードを実行すると、入力内容を変数に保存するEntryウィジェットが表示されます。コールバック関数が変数の更新を常時監視し、その値をLabelウィジェットに反映させます。
Entryウィジェットに何か文字を入力してみてください。ラベルウィジェットが入力値をそのまま模倣して表示するとともに、コンソールにも同じ内容が出力されます。

コンソールには以下のように表示されます。
H He Hel Hell Hello Hello W Hello Wo Hello Wor Hello Worl Hello World
-
TkinterのEntryウィジェットから値を取得する方法【.get()メソッドの使い方】
Tkinterでアプリケーションを開発していると、作成したEntryウィジェット(テキスト入力欄)に入力された値を取得したい場面が出てきます。そんなときに活用できるのが.get()メソッドです。このメソッドを使うと、ユーザーが入力した内容を変数として受け取ることができ、その値を画面に表示したり、他の処理に利用したりできます。 実装例:入力したテキストをラベルに表示する ここでは、Entryウィジェットに入力されたテキストを取得し、Labelウィジェットを使って画面に表示する簡単なアプリケーションを作成してみましょう。 # tkinterライブラリをインポート from tkinter impo
-
Tkinterでボタンウィジェットのテキストを取得する方法 – cget()関数の使い方
Tkinterアプリケーションを開発していると、ボタンに設定されたテキストや名前といった値を、後からプログラム内で取得したいケースがあります。そんなときに便利なのが .cget() 関数です。 .cget() はすべてのTkinterウィジェットがサポートしているメソッドで、引数にオプション名を指定することで、そのウィジェットの構成情報(テキスト、色、フォントなど)を取得できます。 サンプルコード 以下の例では、まずボタンを作成し、そのボタンのテキストを変数「mytext」に格納します。続いて、この変数の値をLabelウィジェットを使って画面に表示します。 # tkinterライブラリをイン