今日も見に来てくださって、ありがとうございます。石川さんです。
今日は、tkinterで用意されているVariableの挙動が気になったのでちょっと調べてみました。4種類の型を扱えるようにVariableを継承した以下のクラスが定義されていました。日付型はありませんでしたね。
- StringVar 文字列(str)を扱います
- IntVar 整数(int)を扱います
- DoubleVar 浮動小数点数(float)を扱います
- BooleanVar 真理値(bool)を扱います
これまでのスクリプトでもこっそり使っていたかも知れませんが、ざっくり言うと、このVariableは、ウィジェットに割り当てることのできる変数です。これまでの例で行くと、メニューのラジオボタンでオプション値を保持するために使いました。あのときは、チェックが一か所つくだけだったので、あんまり気にしていなかったのですけど、一つの値を複数の場所で表示できるのか、という点が気になりましてちょっと動きを確認することにしました。
出来上がりイメージ
こんな感じです。
ラベル、エントリー、ボタン、エントリーを作ってあります。ボタンを押すと現在の値に”test “を追加します。
ソースコード
import tkinter as tk class App(tk.Tk): def __init__(self): super().__init__() self.title("Variable Test") self.geometry("250x100") self.str_val = tk.StringVar() self.label1 = tk.Label(self, textvariable=self.str_val) self.entry1 = tk.Entry(self, textvariable=self.str_val) self.btn = tk.Button(self, text="Push me!", command=self.pushed) self.entry2 = tk.Entry(self, textvariable=self.str_val) self.label1.pack() self.entry1.pack() self.btn.pack() self.entry2.pack() def pushed(self): self.str_val.set(self.str_val.get()+"test ") if __name__ == "__main__": app = App() app.mainloop()
解説
ウィンドウを作るところはいつも通り、Tk
を継承したクラスを作成しています。タイトルをセットして、ウィンドウのサイズを決めるところまではだいたいいつも通りです。
9行目、StringVar
で変数を定義しています。
11~14行目で、ラベル、エントリー、ボタン、エントリーの順番に作成しています。ラベルとエントリーはtextvariable
パラメータで変数を割り当てています。この割り当てにより、エントリーで変更した値が即座にself.str_val
に反映されます。self.str_val
に反映された値は、他のラベルとエントリーに反映されます。ボタンは、self.str_val
に"test "
を追加するコマンド、self.pushed
を作成して、これをcommand
に割り当てました。
まとめ
期待はしていましたが、期待通りに値は即座に反映されました。ウィジェットと変数のやり取りの部分は、何にも気にしなくても自動的に表示が更新されるようになりました!簡単ですね♪