程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python tkinter - 第六章 輸入控件(Entry)&屬性

編輯:Python

第6章輸入控件(Entry)
輸入控件(Entry. 是用來輸入或者顯示單行字符串的控件。該控件允許用戶輸入或顯示一行文字。 如果用戶輸入的文字長度大於Entry 控件的可顯示范圍時, 文字會向後滾動。 這種情況下所輸入的字符串無法全部顯示。可以通過移動光標,將不可見的文字部分移入可見區域。如果你想要輸入多行文本, 就需要使用Text 控件。
6.1 屬性
6.1.1 屬性列表

屬性參數描述background
bg設置背景顏色,如bg=‘red’borderwidth
bd輸入控件的邊框寬度。默認是1-2個像素。cursor輸入控件的光標。默認是字符插入光標(一般是一個“I-beam”類型的光標)disabledbackground定義輸入控件被禁止使用時的背景顏色。disabledforeground定義輸入控件被禁止時的前景(文本)顏色。exportselection定義是否把選中的文本,自動拷貝到剪貼板。這個參數對輸入控件不起作用fg
foreground設置前景(文本)顏色font設置字體類型與大小highlightbackground定義輸入控件沒有獲得輸入焦點狀態下的高亮背景顏色。就是輸入框的亮邊。highlightcolor與highlightbackground屬性類似。不過是輸入控件獲得輸入焦點時的邊框顏色。highlightthickness輸入控件獲得或者失去輸入焦點時的邊框寬度。一般1-2個像素。insertbackground輸入控件中,插入光標的顏色insertborderwidth插入光標的邊框顯示寬度。如果是一個非0的數值,光標會使用RAISED效果的邊框。insertofftime
insertontime這兩個屬性控制插入光標閃爍效果。就是插入光標的出現和消失的時間。單位是毫秒。insertwidth插入光標的寬度。invalidcommand
invcmd驗證輸入合法性的回調函數,但不能獨立使用。只有設置了validatecommand回調函數且該函數返回False的情況下,才會激活invalidcommand定義的回調函數。justify定義輸入控件中文本的對齊方式。可以設置的數值為:LEFT, CENTER, RIGHT. 默認數值是LEFT.readonlybackground設置輸入控件為“只讀”模式的背景顏色relief設定輸入控件的3D效果,默認是flat,可以設置的參數;flat、groove、raised、ridge、solid、sunken,如relief=‘groove’selectbackground設置選中區域的背景顏色selectborderwidth設置選中區域邊框寬度。selectforeground設置選中區域的前景(文本)顏色show定義如何顯示輸入控件中的內容。如果是非空的,控件會用定義的字符取代真實的內容。比如輸入密碼時,一般使用”*”替代真實的輸入內容。state定義輸入控件的狀態。狀態有三種:NORMAL, DISABLED, READONLY。(READONLY與DISABLED類似, 只是顯示的內容可以選擇與拷貝。takefocus定義是否可以使用Tab鍵移動輸入焦點到輸入控件。textvariable關聯的tkinter變量,一般是StringVar類型。如果該變量改變,則輸入控件中的內容也會更新。validate定義在什麼條件下觸發驗證輸入內容:
focus:獲得或者失去輸入焦點時候
focuin:僅在獲得輸入焦點的時候
focusout: 失去輸入焦點的時候
key: 改變內容的時候
ALL:以上全部情況
該屬性定義的是何時啟動輸入驗證,而驗證輸入內容的回調函數由validatecommand或者invalidcommand定義validatecommand
vcmd定義一個函數去驗證與檢查輸入內容。如果輸入的內容符合要求,該函數返回True,否則返回False。此屬性在validate不空的時候有效。width定義輸入控件的寬度,單位是字符。xscrollcommand將滾動條與輸入控件關聯起來,處理滾動條動作。滾動條只能是水平滾動條。6.1.2 background(bg)設置輸入控件的背景顏色。bg是縮寫,與background是一樣的。
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的時候顯式的說明。具體的參數傳遞含義如下:

參數含義‘%d’插入還是刪除字符。
1:插入字符
0:刪除字符‘%i’操作字符的位置,0表示第一個‘%P’當前輸入框中的文本‘%s’修改之前的輸入框內容‘%S’插入或者刪除的字符‘%v’validate中設定的參數‘%V’激發驗證的具體條件。比如focusout等。‘%W’輸入控件標識

如果同時設定了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同寬。因為最寬的就是輸入控件,這樣就做到了滾動條和輸入控件同寬。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved