Python の Tkinterで入力文字列を受け取る
ユーザからの入力を受け取って反映させる。これができなければインターフェースはほぼほぼ意味がない。
今回は、ユーザの入力した文字列を取得し、適当に使用する例。
※この記事はPython3.6.1で書かれています。
※Python2系の場合、コード中のtkinterをTkinterに変えてください。(動作未検証)
その前に、バージョン情報。tkinterはずっと8.5.1だ。この8.5系にはバグが多いらしく、macでは入力欄に日本語を打つことができない。他の環境の方は大丈夫かと思うが、同様の症状が出ている方はご注意を。
大枠
とりあえず大枠を作っていく。入力欄にはEntryというウィジェットを使う。今回はcanvas上に設置したEntryに文字列を入力してもらい、ボタンを押すとcanvas上のラベルにその文字列が表示される。という動作を想定する。
import tkinter def disp_strings(entry_v, label): # ボタンを押した際にentryから文字列を取得しlabelに表示する関数 # ここに処理を書く print("clicked button") window = tkinter.Tk() window.geometry("400x300") window.title("get 入力文字列") canvas = tkinter.Canvas(background="#dfa", width=400, height=300) canvas.place(x=200, y=150, anchor=tkinter.CENTER) v = tkinter.StringVar() # Entryの入力を受け取るのに必要 entry = tkinter.Entry(canvas, width=30, textvariable=v) entry.place(x=200, y=70, anchor=tkinter.CENTER) label = tkinter.Label(canvas, text="ここに入力結果を表示") label.place(x=200, y=220, anchor=tkinter.CENTER) button = tkinter.Button(canvas, text="入力文字列を表示", command=lambda:disp_strings(v, label)) button.place(x=200, y=150, anchor=tkinter.CENTER) window.mainloop()
コード中のコメントアウトにもあるが、v = tkinter.StringVar() や、Entryウィジェットの引数内のtextvariable=v は、テキストを取得する際に必要となる。このためボタンを押した時に動作する関数にはこのvを渡すこととしている。
Entryの中身を受け取って表示
Entryの中身を受け取るのは簡単。先ほど v = tkinter.StringVar()としたが、このvを用いて v.get() で取得が可能である。このvは関数に私entry_vという名前に変えているため、関数内にこれを付け足す。
加えてlabelのtext情報を変更する行を加え、関数を以下のように変える。
def disp_strings(entry_v, label): string = entry_v.get() label["text"] = string
プログラム全文
import tkinter def disp_strings(entry_v, label): # ボタンを押した際にentryから文字列を取得しlabelに表示する関数 string = entry_v.get() label["text"] = string window = tkinter.Tk() window.geometry("400x300") window.title("get 入力文字列") canvas = tkinter.Canvas(background="#dfa", width=400, height=300) canvas.place(x=200, y=150, anchor=tkinter.CENTER) v = tkinter.StringVar() # Entryの入力を受け取るのに必要 entry = tkinter.Entry(canvas, width=30, textvariable=v) entry.place(x=200, y=70, anchor=tkinter.CENTER) label = tkinter.Label(canvas, text="ここに入力結果を表示") label.place(x=200, y=220, anchor=tkinter.CENTER) button = tkinter.Button(canvas, text="入力文字列を表示", command=lambda:disp_strings(v, label)) button.place(x=200, y=150, anchor=tkinter.CENTER) window.mainloop()