第6章輸入控件(Entry)
輸入控件(Entry. 是用來輸入或者顯示單行字符串的控件。該控件允許用戶輸入或顯示一行文字。 如果用戶輸入的文字長度大於Entry 控件的可顯示范圍時, 文字會向後滾動。 這種情況下所輸入的字符串無法全部顯示。可以通過移動光標,將不可見的文字部分移入可見區域。如果你想要輸入多行文本, 就需要使用Text 控件。
6.1 屬性
6.1.1 屬性列表
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,bg='yellow',width=20)
b1.pack()
root.mainloop()
結果:
6.1.3 borderwidth(bd)
設置輸入控件的邊框寬度。bd和borderwidth的作用一樣,只不過是縮寫。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,bg='yellow',width=20,bd=10)
b1.pack()
root.mainloop()
結果:
此圖與6.1.2中的圖對比,就可以發現,有一個明顯的邊框出現在輸入區域的周圍。這就是邊框的效果。
6.1.4 cursor
鼠標位於輸入控件區域時,光標的形狀。一般是”I-Beam”。也可以選擇其他形狀的。在3.3.6中,有詳細的內置鼠標形狀的名稱。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,bg='blue',width=20,cursor='mouse')
b1.pack()
root.mainloop()
結果:
這段代碼就是實現把光標的形狀變為鼠標(mouse)形狀,當然只有光標經過輸入控件區域才會改變。
6.1.5 disabledbackground
輸入控件被禁止使用時候的背景顏色。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,bg='yellow',width=20,
state=tk.DISABLED,disabledbackground='blue')
b1.pack()
root.mainloop()
結果:
盡管代碼中設定的背景顏色是黃色,但是由於輸入控件的狀態是DISABLED,那麼生效的背景顏色就是我們指定的藍色。如果沒有指定輸入控件失效時背景顏色,會是什麼結果?會使用系統默認的失效時的背景顏色,就是灰色。
6.1.6 disabledforeground
設置當輸入控件失效時,輸入框裡面的前景(文字)顏色。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
txt = tk.StringVar()
b1=tk.Entry(root,textvariable=txt,width=20,
state=tk.DISABLED,disabledforeground='red')
txt.set('無法輸入')
b1.pack()
root.mainloop()
結果:
6.1.7 exportselection
是一個布爾類型的值,但是對輸入控件沒有作用。
6.1.8 foreground(fg)
設置輸入控件的文字的顏色。默認是黑色。fg和foreground的意思是一樣的,是縮寫。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,fg='red')
b1.pack()
root.mainloop()
結果:
6.1.9 font
設置輸入文字的字體。具體的字體設置方法,請參見3.3.3中的有關說明,這裡不再贅述。
6.1.10 highlightbackground,highlightcolor和highlightthickness
這三個參數是設置輸入控件的外邊框的。highlightbackground是輸入控件沒有獲得輸入焦點時邊框的背景顏色。highlightcolor是輸入控件獲得輸入焦點時邊框的背景顏色。highlightthickness是定義邊框的寬度。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,highlightbackground='red',
highlightcolor='yellow',highlightthickness=20)
b1.pack()
b2=tk.Button(root,text='Quit')
b2.pack()
root.mainloop()
結果:
注意:邊框的顏色改變是根據輸入控件是否有輸入焦點來決定的。如果輸入焦點依然在輸入框內,邊框的顏色依然是高亮的。比如,在上面的例子中,單純的點擊按鈕是不會讓輸入框失去輸入焦點,此時邊框的顏色不會改變。如果使用Tab鍵,讓輸入焦點到按鈕上,這個時候輸入控件的邊框就轉為設定的highlightbackground值。
6.1.11 insertbackground
設置輸入框內光標的顏色。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,insertbackground='red')
b1.pack()
root.mainloop()
結果:
6.1.12 insertborderwidth
設定輸入框內光標的邊框寬度。0是沒有邊框,1到其他正整數是只有一個像素的邊框,負數會按照設定的數值,正確顯示光標的邊框。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,
insertbackground='red',
insertborderwidth=-50)
b1.pack()
root.mainloop()
結果:
6.1.13 insertofftime 和 insertontime
這兩個參數設置光標閃爍的時間。insertofftime 是光標不顯示的時間,insertontime是光標顯示的時間。這樣就可以實現光標閃爍的效果。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,insertofftime=2000,insertontime=5000,
insertbackground='red',insertborderwidth=-50)
b1.pack()
root.mainloop()
6.1.14 insertwidth
設置插入光標的寬度。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,insertwidth=50)
b1.pack()
root.mainloop()
結果:
6.1.15 invalidcommand(invcmd)
見6.1.26的說明
6.1.16 justify
設定輸入框內文本的對齊方式。取值有LEFT, CENTER, RIGHT三種。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,justify=tk.CENTER)
b1.pack()
root.mainloop()
結果:
這是居中顯示的例子。其他的LEFT和RIGHT,可以修改代碼自行運行驗證。
6.1.17 readonlybackground
當輸入控件為只讀模式時,可以通過readonlybackground設置背景值。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
txt = tk.StringVar()
b1=tk.Entry(root,width=20,textvariable=txt,
readonlybackground='yellow',state="readonly")
txt.set('只讀模式')
b1.pack()
root.mainloop()
結果:
6.1.18 relief
設置輸入控件的邊框3D效果,取值范圍是:flat、groove、raised、ridge、solid和sunken。詳細描述見3.3.5節。
6.1.19 selectbackground
選中文本之後的背景顏色。默認是黑色的。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=20,selectbackground='red')
b1.pack()
root.mainloop()
結果:
6.1.20 selectborderwidth
選中區域的邊框寬度。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=30,selectborderwidth=10)
b1.pack()
root.mainloop()
結果:
6.1.21 selectforeground
選中區域的前景(文本)的顏色。一般是用默認值,也可以指定。最好與selectbackground是相反的顏色。兩個參數最好同時修改。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=30,selectforeground='red')
b1.pack()
root.mainloop()
結果:
6.1.22 show
設定輸入內容的替代值。最典型的用法是輸入密碼的時候,用’*’來替代實際輸入的字符從而達到保密的效果。其實,也可以設置其他的字符,比如’x’來代替輸入的字符。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Entry(root,width=30,show='x')
b1.pack()
root.mainloop()
結果:
6.1.23 state
輸入控件的狀態有三種:normal,disabled和readonly。normal狀態下,可以正常使用輸入控件的所有功能。在disabled狀態下,只能現實的文本,而其他的功能都不能使用。而在readonly的狀態下,只是不能輸入或者修改輸入控件的內容,但是可以使用選擇功能。
不過如果設置了textvariable屬性,在任何狀態下,都可以通過改變textvariable對應的變量,來修改輸入控件的內容。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
txt=tk.StringVar()
b1=tk.Entry(root,textvariable=txt,width=30,state='disabled')
b1.pack()
def set_entry():
txt.set('change')
b2=tk.Button(root,text='Entry',command=set_entry)
b2.pack()
root.mainloop()
結果:
設置state=’readonly’是可以選擇輸入框內的內容的。但是disabled狀態下,就不可以。這是readonly與disabled的區別。
6.1.24 takefocus
設置輸入控件是否可以通過Tab獲得輸入焦點。是個布爾類型的屬性。更多的說明見前面章節的說明。
6.1.25 textvariable
設置關聯tkinter的變量,用來修改或者獲得輸入控件的數據。一般使用StringVar()。也可以使用IntVar, DoubleVar, BooleanVar等。前面介紹的都是用set()來設置關聯變量的值,這個例子使用get()來獲取關聯變量的值。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
txt=tk.StringVar()
txt2=tk.StringVar()
b1=tk.Entry(root,textvariable=txt,width=20)
b1.pack()
b2=tk.Entry(root,textvariable=txt2,width=20)
b2.pack()
def set_entry():
txt2.set(txt.get())
b3=tk.Button(root,text='Entry',command=set_entry)
b3.pack()
root.mainloop()
結果:
6.1.26 validate,invalidcommand和validatecommand
vaidate是定義在何種條件下觸發輸入驗證:
focus:獲得或者失去輸入焦點時候
focuin:僅在獲得輸入焦點的時候
focusout: 失去輸入焦點的時候
key: 輸入框種內容改變的時候
ALL:以上全部情況
validatecommand是輸入內容驗證函數。當輸入的內容符合條件,比如要求輸入的都是0-9的數字,就會返回True,否則返回False。而invalidatecommand正好與validatecommand相反,不符合要求返回False,符合要求返回True。
validatecommand和invalidatecommand都可以定義回調函數的。此回調函數是可以傳入參數的。在設定validatecommand和invalidatecommand的時候顯式的說明。具體的參數傳遞含義如下:
如果同時設定了validatecommand和invalidatecommand,先執行那個選項?首先執行的是validatecommand。如果返回值是True,不會執行invalidatecommand定義的回調函數。如果是False,會調用invalidatecommand定義的回調函數。不過需要注意的是,如果驗證觸發條件是key或者all,不能同時使用validatecommand和invalidatecommand,否則會無法輸入任何內容。
invalidatecommand是不能單獨使用的。必須有validatecommand,invalidatecommand才會起作用。只有invalidatecommand是不能完成輸入驗證的,因為根本不會給觸發。
下面的例子是檢查輸入的都要是數字,否則不允許輸入。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
def check_digit(content):
if content.isdigit() or content == "":
return True
else:
return False
entry_validate=root.register(check_digit)
b1 = tk.Entry(root,width=20,validate='key',vcmd=(entry_validate,'%P'))
b1.pack()
root.mainloop()
其實上面的例子要求輸入必須是整數,如果要輸入浮點數怎麼辦?替換掉isdigit()函數,用自定義的檢查函數即可。比如:
def int_float(value):
try:
x=int(value)
except ValueError:
try:
y = float(value)
except ValueError:
return False
else:
return True
else:
return True
這個函數可以檢測輸入的字符串是否是整形數或者是浮點數。不過只能檢測正數字,不能檢測負數。我們還可以在修改完善一下,就是首先判斷輸入的第一個字符是不是“-”,如果是,就使用拷貝後面的字符來檢測。只需在int_float 函數開始的地方增加檢測輸入的字符串是不是等於’-’即可:
if value=='-':
return True
另外可能還有一個問題就是不能清空輸入框,必須保留至少一個數字。這是因為回調函數沒有處理輸入框種的內容為空的情況。如果刪除了所有的字符,傳入回調函數的值是’’,這種情況下判斷函數返回的是False,因為不滿足任何一個條件。所以需要增加處理輸入框為空的情況:
if value=='':
return True
至於更復雜的檢測,就需要編寫相應的檢測函數了。
6.1.27 width
這個屬性是設置輸入控件的寬度。單位是字符。前面的例子已經有使用到這個屬性的了,這裡不再贅述。
6.1.28 xscrollcommand
如果輸入的字符很多很長,超出了輸入控件定義的寬度,除了使用箭頭去移動光標來浏覽之外,還可以使用滾動條來滾動輸入框裡面的內容。滾動條要在後面介紹,這裡就不詳細的介紹了。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
f=tk.Frame(root)
s1 = tk.Scrollbar(f,orient=tk.HORIZONTAL)
b1 = tk.Entry(f,width=20,xscrollcommand=s1.set)
b1.pack()
s1.pack(side=tk.BOTTOM,fill=tk.X)
s1.config(command=b1.xview)
f.pack()
root.mainloop()
結果:
說明:
使用Frame作為容器,把輸入控件和滾動條放入其中,這樣滾動條可以設置在Frame的底部,就是輸入控件的下方。注意要使用fill=tk.X,表示在X方向上,滾動條和Frame同寬。因為最寬的就是輸入控件,這樣就做到了滾動條和輸入控件同寬。