#1. はじめに
今回はTkinterの Entry()
と StringVar()
の基本的な使い方について記載する.
#2. 動作環境
- Windows10
- Python 3.8.5
- Tkinter 8.6.9
#3. ソースコードと動作結果
##3.1 エントリの配置
エントリとはテキストボックスのことである.
下記のように定義,配置する.
import tkinter as tk
win = tk.Tk()
entry = tk.Entry(win)
entry.grid()
win.mainloop()
##3.2 StringVarを適用させる
エントリを使う場合文字列を操作をすることが多い.
その場合は一般的には StringVar
を使う.(使わなくても可能ではある.)
StringVar
を適用させれば,後からエントリの文字列が変わっても,StringVar
の値も変わる(同期されている).
import tkinter as tk
win = tk.Tk()
sv = tk.StringVar()
entry = tk.Entry(win, textvariable=sv)
entry.grid()
win.mainloop()
上記のコードでは StringVar
を entry
に適用させている.
これだけであれば動作的にはEntryを定義,配置した時と比べて変化はない.
ちなみにVariableのサブクラスには StringVar
のほかに,IntVar
,DoubleVar
,BooleanVar
などもある.
##3.3 Python側からエントリに文字列を入れる
###3.3.1. StringVarを使わない場合
エントリの insert
メソッドを使う.
インサートとは,既に存在する文字列に対して挿入すること.つまり直前の文字列はクリアされない.
引数には,インデックス(インサートする位置)とインサートする文字列を指定する.
インデックスは1文字目は 0
,2文字目は 1
,・・・,n文字目は n+1
である.
インデックスには自然数を指定するが,自然数の文字列を使ってもエラーにならない.(エラーにならないがインデックスは通常自然数を指定する.)
インデックスに負数を指定した場合は,0
を指定した場合と同じ挙動となる.
インデックスに tk.END
を指定した場合は,末尾を指定していることを意味する.
インデックスに n
を指定したが,あらかじめエントリに n+1
文字無かった場合は,末尾にインサートされる.
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"
をインサートする.
###3.3.2. StringVarを使う場合
StringVarの set
メソッドを使う.
引数には,セットしたい文字列を指定する.セットとは引数の文字列をセットすることであり,直前の文字列を引き継がない.直前の文字列と連結したい場合は,set()
を使う前にあらかじめ文字列を連結する必要がある.(その際は後述のget()を使用する.)
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"
をセットする.
3.4. Python側からエントリの文字列を消す
###3.4.1. StringVarを使わない場合
エントリの delete
メソッドを使う.
引数には,削除する範囲の開始位置と終了位置を指定する.
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文字目までを消す.
###3.4.2. StringVarを使う場合
StringVarの set
メソッドを使う.
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
メソッドを使う.
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
メソッドを使う.
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
メソッドというのも存在するが,使い方や効果は同じ.
import tkinter as tk
win = tk.Tk()
entry = tk.Entry(win, state="readonly")
entry.grid()
#entry.configure(state = "disabled")
win.mainloop()
上記の場合は,Entryの state
を disabled
にしている.
コメントを外せば,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 |
normal ,readonly 時の文字色.fg と省略可 |
background |
normal 時の背景色.bg と省略可 |
readonlybackground |
readonly 時の背景色 |
disabledforeground |
disabled 時の文字色 |
disabledbackground |
disabled 時の背景色 |
下記のソースコードで,state
の値を変えてみるとわかる.
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. おわりに
深くは記載しない.