つきすけ の コーディング記

細かいところで嫌にならないように、小さいことでも解説していくブログ。たまに関係ないことも書く。

Python の Tkinterで入力文字列を受け取る

ユーザからの入力を受け取って反映させる。これができなければインターフェースはほぼほぼ意味がない。
今回は、ユーザの入力した文字列を取得し、適当に使用する例。
※この記事はPython3.6.1で書かれています。
※Python2系の場合、コード中のtkinterTkinterに変えてください。(動作未検証)

その前に、バージョン情報。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を渡すこととしている。

f:id:Tsukisuke:20200222090744p:plain
見た目


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()