3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python Tkinter Entry()とStringVar()について

Last updated at Posted at 2021-06-13

#1. はじめに
今回はTkinterの Entry()StringVar() の基本的な使い方について記載する.

#2. 動作環境

  • Windows10
  • Python 3.8.5
  • Tkinter 8.6.9

#3. ソースコードと動作結果

##3.1 エントリの配置

エントリとはテキストボックスのことである.
下記のように定義,配置する.

test.py
import tkinter as tk

win = tk.Tk()

entry = tk.Entry(win)
entry.grid()

win.mainloop()

##3.2 StringVarを適用させる

エントリを使う場合文字列を操作をすることが多い.
その場合は一般的には StringVar を使う.(使わなくても可能ではある.)
StringVar を適用させれば,後からエントリの文字列が変わっても,StringVar の値も変わる(同期されている).

test.py
import tkinter as tk

win = tk.Tk()

sv = tk.StringVar()

entry = tk.Entry(win, textvariable=sv)
entry.grid()

win.mainloop()

上記のコードでは StringVarentry に適用させている.
これだけであれば動作的にはEntryを定義,配置した時と比べて変化はない.

ちなみにVariableのサブクラスには StringVar のほかに,IntVarDoubleVarBooleanVar などもある.

##3.3 Python側からエントリに文字列を入れる

###3.3.1. StringVarを使わない場合

エントリの insert メソッドを使う.
インサートとは,既に存在する文字列に対して挿入すること.つまり直前の文字列はクリアされない.
引数には,インデックス(インサートする位置)とインサートする文字列を指定する.

インデックスは1文字目は 0,2文字目は 1,・・・,n文字目は n+1 である.
インデックスには自然数を指定するが,自然数の文字列を使ってもエラーにならない.(エラーにならないがインデックスは通常自然数を指定する.)
インデックスに負数を指定した場合は,0 を指定した場合と同じ挙動となる.
インデックスに tk.END を指定した場合は,末尾を指定していることを意味する.
インデックスに n を指定したが,あらかじめエントリに n+1文字無かった場合は,末尾にインサートされる.

test.py
import tkinter as tk

def insert():
    entry.insert(5, "test")

win = tk.Tk()

entry = tk.Entry(win)
entry.grid()

button = tk.Button(win, text="Insert", width=10, command=insert)
button.grid()

win.mainloop()

上記のコードはボタンを押したら指定位置に文字列 "test" をインサートする.

insert.gif

###3.3.2. StringVarを使う場合

StringVarの set メソッドを使う.
引数には,セットしたい文字列を指定する.セットとは引数の文字列をセットすることであり,直前の文字列を引き継がない.直前の文字列と連結したい場合は,set() を使う前にあらかじめ文字列を連結する必要がある.(その際は後述のget()を使用する.)

test
import tkinter as tk

def insert():
    sv.set("test")

win = tk.Tk()

sv = tk.StringVar()

entry = tk.Entry(win, textvariable=sv)
entry.grid()

button = tk.Button(win, text="Insert", width=10, command=insert)
button.grid()

win.mainloop()

上記のコードはボタンを押したら文字列 "test" をセットする.

Animation2.gif

3.4. Python側からエントリの文字列を消す

###3.4.1. StringVarを使わない場合

エントリの delete メソッドを使う.
引数には,削除する範囲の開始位置と終了位置を指定する.

test.py
import tkinter as tk

def delete():
    entry.delete(3, 5)

win = tk.Tk()

entry = tk.Entry(win)
entry.grid()

button = tk.Button(win, text="Delete", width=10, command=delete)
button.grid()

win.mainloop()

上記のコードはボタンを押したら,4文字目から5文字目までを消す.

Animation2.gif

###3.4.2. StringVarを使う場合

StringVarの set メソッドを使う.

test.py
import tkinter as tk

def delete():
    sv.set("")

win = tk.Tk()

sv = tk.StringVar()

entry = tk.Entry(win, textvariable=sv)
entry.grid()

button = tk.Button(win, text="Delete", width=10, command=delete)
button.grid()

win.mainloop()

上記のコードはボタンを押したら,""をセットする.
そうすることで,入力されている文字列を消した扱いとする.

3.5 エントリに入力されている文字列を取得する

###3.5.1. StringVarを使わない場合

Entryの get メソッドを使う.

test.py
import tkinter as tk

def get():
    s = entry.get()
    print(s)

win = tk.Tk()

entry = tk.Entry(win)
entry.grid()

button = tk.Button(win, text="Get", width=10, command=get)
button.grid()

win.mainloop()

上記のコードはボタンを押したら,ターミナル画面にエントリの文字列を表示する.

###3.5.2. StringVarを使う場合

StringVarの get メソッドを使う.

test.py
import tkinter as tk

def get():
    s = sv.get()
    print(s)

win = tk.Tk()

sv = tk.StringVar()

entry = tk.Entry(win, textvariable=sv)
entry.grid()

button = tk.Button(win, text="Get", width=10, command=get)
button.grid()

win.mainloop()

上記のコードはボタンを押したら,ターミナル画面にエントリの文字列を表示する.

##3.6. stateによるエントリの編集可否

Entry には以下の state が存在する.

  • "normal"(デフォルト、キーボード等外部からの入力可能)
  • "readonly"(フォーカスは当たる、キーボード等外部からの入力不可)
  • "disabled"(フォーカスは当たらない、キーボード等外部からの入力不可)

これらは configureメソッドによって設定可能.
config メソッドというのも存在するが,使い方や効果は同じ.

test.py
import tkinter as tk

win = tk.Tk()

entry = tk.Entry(win, state="readonly")
entry.grid()

#entry.configure(state = "disabled")

win.mainloop()

上記の場合は,Entryの statedisabledにしている.
コメントを外せば,readonly を設定した後で disabled に変更する.

また、

entry["state"] = "disabled"

とした場合も同様.

StringVar を使うときと使わないときとで動作結果は異なる.

メソッド state 可否
tk.Entry().insert() "normal"
tk.Entry().insert() "readonly"
tk.Entry().insert() "disabled"
tk.Entry().delete() "normal"
tk.Entry().delete() "readonly"
tk.Entry().delete() "disabled"
tk.Entry().get() "normal"
tk.Entry().get() "readonly"
tk.Entry().get() "disabled"
tk.StringVar().set() "normal"
tk.StringVar().set() "readonly"
tk.StringVar().set() "disabled"
tk.StringVar().get() "normal"
tk.StringVar().get() "readonly"
tk.StringVar().get() "disabled"

"✕" はエラーにはならないが,エントリの編集ができない.
つまり,Entryのメソッドは state の値によっては編集できないが,StringVarのメソッドは state 関係なく編集が可能である.

##3.7. 各stateの色について

各stateと色のオプションは次の表の通り.

オプション名 説明
foreground normalreadonly 時の文字色.fg と省略可
background normal 時の背景色.bg と省略可
readonlybackground readonly 時の背景色
disabledforeground disabled 時の文字色
disabledbackground disabled 時の背景色

下記のソースコードで,state の値を変えてみるとわかる.

test.py
import tkinter as tk

win = tk.Tk()

entry = tk.Entry(win)
entry.grid()
entry.insert(0, "test")

entry.configure(foreground = "blue")
entry.configure(background = "orange")
entry.configure(readonlybackground = "yellow")
entry.configure(disabledforeground = "white")
entry.configure(disabledbackground = "red")

# 変えてみる
entry.configure(state = "") 

win.mainloop()

#4. おわりに

深くは記載しない.

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?