tkinterを使ってアプリを作成していると、文字入力を反映させる場面がよく出てきます
このとき、textvariableを使うことでコードを簡単にすることができます
今回はpythonのtkinterでtextvariableをどのように使うのかについて解説をしていきたいと思います
とてもシンプルですが、目標は以下のようなプログラムを作成することです
tkinterのtextvariableとは
textvariableはテキストボックスに入力された文字を受け取る変数を指定するオプションになります
.insert()や.get()を使ってうまくできないかな?
と試行錯誤してみた結果、2種類の方法が確立されました
しかし、textvariableを使った方が簡単に文字列を変更することができます
テキストボックスに入力された値を反映させる
テキストボックスに入力された文字列を反映させるためには、
StringVarと呼ばれる変数を用います
StringVarを使う場合には.set()も一緒に使う必要があります
実際のコードは以下のようになります
# tkinterのインポート
import tkinter as tk
# rootメインウィンドウの設定
root = tk.Tk()
root.title("Frame")
root.geometry("300x300")
frame = tk.Frame(root)
frame.grid(row=0,column=1)
entry = tk.Entry(frame)
#StringVar変数を使う
var=tk.StringVar()
#entryに入力された値をvar(StringVar)にセットする
def btnclick():
var.set(entry.get())
#ラベルに入力する文字列はvarに入力された値
label = tk.Label(frame, textvariable=var)
#ボタンがクリックされたら「def btnclickを実行する」
button = tk.Button(frame, text='ボタン',command=btnclick)
label.grid(row=0,column=2)
entry.grid(row=1,column=2)
button.grid(row=2,column=2)
root.mainloop()
widget変数について
StringVarはWidget変数とも呼ばれており、Widget変数はStringVarの他にもいくつかあります
-textvariableや-variableオプションに指定することができる変数とされています
今回のようにラベルの文字列を変更したり、入力した値を取得します
.get()で値を取得して、.set()で値を設定します
サンプルコードにもコメントアウトしているので、そちらも参考にしてみてください
- StringVar:文字列を保持する
- IntVar:整数を保持する
- DoubleVar:浮動小数点を保持する
- BooleanVar:真偽値を保持する
この4つの変数をまとめでWidget変数と呼びますが、これらを駆使することで動的な処理を行うことができます
(※動的な処理:今回のラベル名の更新のようなもの。)
widget変数と通常の変数の違い
そもそも変数とは「値が保管されている場所」を指しています
変数に関する詳しいことは以下の記事を参考にしてみてください
widget変数と通常の変数の違いは「widgetと連動しているか」どうかです
(widgetとはtkinterのパーツのことを指しています)
widget変数を設定しておくことでwidgetと連動して変数を更新させることができます
当然、通常の変数ではwidgetと連動して変数を更新させることができないので、widgetの更新をコードに記載する必要が出てきます
実際にwidget変数と通常の変数を使って同様のプログラムを作成してみましょう
以下にサンプルコードを記載するので、コピペで試してみてください
textvariableを使わずに動的にラベル名を変更する方法
# tkinterのインポート
import tkinter as tk
# rootメインウィンドウの設定
root = tk.Tk()
root.title("Frame")
root.geometry("300x300")
frame = tk.Frame(root)
frame.grid(row=0,column=1)
entry = tk.Entry(frame)
def btnclick():
word =entry.get()
label = tk.Label(frame, text=word)
label.grid(row=0,column=2)
button = tk.Button(frame, text='ボタン',command=btnclick)
entry.grid(row=1,column=2)
button.grid(row=2,column=2)
root.mainloop()
上記のコードはtextvariableを使用しないで、動的にlabel名を変更する方法です
ただし、これだと最初にラベルが表示されておらず、不自然な流れになってしまいます
textvariableを使って動的にラベル名を変更する方法
では、次にtextvariableを使ったコードをコピペで実行してみましょう
# tkinterのインポート
import tkinter as tk
# rootメインウィンドウの設定
root = tk.Tk()
root.title("Frame")
root.geometry("300x300")
frame = tk.Frame(root)
frame.grid(row=0,column=1)
entry = tk.Entry(frame)
#StringVar変数を使う
var=tk.StringVar()
#entryに入力された値をvar(StringVar)にセットする
def btnclick():
var.set(entry.get())
#ラベルに入力する文字列はvarに入力された値
label = tk.Label(frame, textvariable=var)
#ボタンがクリックされたら「def btnclickを実行する」
button = tk.Button(frame, text='ボタン',command=btnclick)
label.grid(row=0,column=2)
entry.grid(row=1,column=2)
button.grid(row=2,column=2)
root.mainloop()
先ほどとは異なり、初めから空のlabelが表示されています
空のlabelにtextvariableを使用し、文字列を入力させることができるので、
流れとしては、こちらの方が自然かと思います
どちらも実際に試してみて、何がどう異なっているのか確認してみてください!
Pythonの独学でつまづかない方法?
Pythonを独学で進めていく上で、
「ひとまず何かしらの書籍に目を通したい」
「webで調べても全くわからない」
という状況が何度も何度でも出てくるかと思います。
そういう時に便利なのが、kindleとテラテイルです。
Kindleはご存知の通り、電子書籍です。
Kindleには多くのpython学習本が用意されており、無料で読むことができます。(たまに有料もあります)
ひとまずどういった書籍があるのか?
もしものために、書籍に目を通しておこう
という場合には、kindleの利用がおすすめです。
また、webで調べて、試行錯誤しても全くわからない…
っていう状況を打破してくれる、手助けしてくれるのが、テラテイルです。
実現したいこと・エラーメッセージ・コードなどを記載すれば、プロのエンジニアの方々が手助けをしてくれます。
どちらも登録しておいて損はないサイトです。
Pythonを独学で進めている方はぜひ利用してみてください。
おすすめプログラミングスクール(無料体験あり)