Tkinter組件Entry的具體使用
Entry(輸入框)組件通常用于獲取用戶的輸入文本。
何時(shí)使用 Entry 組件?
Entry 組件僅允許用于輸入一行文本,如果用于輸入的字符串長(zhǎng)度比該組件可顯示空間更長(zhǎng),那內(nèi)容將被滾動(dòng)。這意味著該字符串將不能被全部看到(你可以用鼠標(biāo)或鍵盤(pán)的方向鍵調(diào)整文本的可見(jiàn)范圍)。
如果你希望接收多行文本的輸入,可以使用 Text 組件(后面介紹)。
用法
使用代碼為 Entry 組件添加文本,可以使用 insert() 方法。如果要替換當(dāng)前文本,可以先使用 delete() 方法,再使用 insert() 方法實(shí)現(xiàn):
import tkinter as tk master = tk.Tk() e = tk.Entry(master) e.pack(padx=20, pady=20) e.delete(0, "end") e.insert(0, "默認(rèn)文本...") master.mainloop()
獲取當(dāng)前輸入框的文本,可以使用 get() 方法:
s = e.get()
你也可以綁定 Entry 組件到 Tkinter 變量(StringVar),并通過(guò)該變量設(shè)置和獲取輸入框的文本:
v = tk.StringVar() e = tk.Entry(master, textvariable=v) e.pack() v.set("I love Python!") s = v.get()
下邊的例子演示將 Entry 組件和 Button 組件配合,點(diǎn)擊 “獲取信息” 按鈕時(shí)自動(dòng)清空輸入框并將內(nèi)容輸出:
import tkinter as tk master = tk.Tk() tk.Label(master, text="作品:").grid(row=0) tk.Label(master, text="作者:").grid(row=1) e1 = tk.Entry(master) e2 = tk.Entry(master) e1.grid(row=0, column=1, padx=10, pady=5) e2.grid(row=1, column=1, padx=10, pady=5) def show(): print("作品:《%s》" % e1.get()) print("作者:%s" % e2.get()) e1.delete(0, "end") e2.delete(0, "end") tk.Button(master, text="獲取信息", width=10, command=show).grid(row=3, column=0, sticky="w", padx=10, pady=5) tk.Button(master, text="退出", width=10, command=master.quit).grid(row=3, column=1, sticky="e", padx=10, pady=5) master.mainloop()
最后需要提到的是 Entry 組件允許通過(guò)以下幾種方式指定字符的位置:
數(shù)字索引號(hào)"anchoe""end""insert"鼠標(biāo)坐標(biāo)("@x")數(shù)字索引號(hào):常規(guī)的 Python 索引號(hào),從 0 開(kāi)始
"anchor":對(duì)應(yīng)第一個(gè)被選中的字符(如果有的話)
"end":對(duì)應(yīng)已存在文本的后一個(gè)位置
"insert":對(duì)應(yīng)插入光標(biāo)的當(dāng)前位置鼠標(biāo)坐標(biāo)("@x"):x 是鼠標(biāo)位置與 Entry 左側(cè)邊緣的水平距離,這樣就可以通過(guò)鼠標(biāo)相對(duì)地定位字符的位置
參數(shù)
Entry(master=None, **options) (class)
master -- 父組件
**options -- 組件選項(xiàng),下方表格詳細(xì)列舉了各個(gè)選項(xiàng)的具體含義和用法:
選項(xiàng) | 含義 |
background | 1. 設(shè)置 Entry 的背景顏色 2. 默認(rèn)值由系統(tǒng)指定 |
bg | 跟 background 一樣 |
borderwidth | 1. 設(shè)置 Entry 的邊框?qū)挾?br />2. 默認(rèn)值是 1 或 2 像素 |
bd | 跟 borderwidth 一樣 |
cursor | 1. 指定當(dāng)鼠標(biāo)在 Entry 上飄過(guò)的時(shí)候的鼠標(biāo)樣式 2. 默認(rèn)值由系統(tǒng)指定 |
exportselection | 1. 指定選中的文本是否可以被復(fù)制到剪貼板 2. 默認(rèn)值是 True 3. 可以修改為 False 表示不允許復(fù)制文本 |
font | 1. 指定 Entry 中文本的字體 2. 默認(rèn)值由系統(tǒng)指定 |
foreground | 1. 設(shè)置 Entry 的文本顏色 2. 默認(rèn)值由系統(tǒng)指定 |
fg | 跟 foreground 一樣 |
highlightbackground | 1. 指定當(dāng) Entry 沒(méi)有獲得焦點(diǎn)的時(shí)候高亮邊框的顏色 2. 默認(rèn)值由系統(tǒng)指定 |
highlightcolor | 1. 指定當(dāng) Entry 獲得焦點(diǎn)的時(shí)候高亮邊框的顏色 2. 默認(rèn)值由系統(tǒng)指定 |
highlightthickness | 1. 指定高亮邊框的寬度 2. 默認(rèn)值是 1 或 2 像素 |
insertbackground | 指定輸入光標(biāo)的顏色 |
insertborderwidth | 1. 指定輸入光標(biāo)的邊框?qū)挾?br />2. 如果被設(shè)置為非 0 值,光標(biāo)樣式會(huì)被設(shè)置為 RAISED 3. 小甲魚(yú)溫馨提示:將 insertwidth 設(shè)置大一點(diǎn)才能看到效果哦 |
insertofftime | 1. 該選項(xiàng)控制光標(biāo)的閃爍頻率(滅) 2. 單位是毫秒 |
insertontime | 1. 該選項(xiàng)控制光標(biāo)的閃爍頻率(亮) 2. 單位是毫秒 |
insertwidth | 1. 指定光標(biāo)的寬度 2. 默認(rèn)值是 1 或 2 像素 |
invalidcommand | 1. 指定當(dāng)輸入框輸入的內(nèi)容“非法”時(shí)調(diào)用的函數(shù) 2. 也就是指定當(dāng) validateCommand 選項(xiàng)指定的函數(shù)返回 False 時(shí)的函數(shù) 3. 詳見(jiàn)本內(nèi)容最下方小甲魚(yú)關(guān)于驗(yàn)證詳解 |
invcmd | 跟 invalidcommand 一樣 |
justify | 1. 定義如何對(duì)齊輸入框中的文本 2. 使用 "left","right" 或 "center" 3. 默認(rèn)值是 "left" |
relief | 1. 指定邊框樣式 2. 默認(rèn)值是 "sunken" 3. 其他可以選擇的值是 "flat","raised","groove" 和 "ridge" |
selectbackground | 1. 指定輸入框的文本被選中時(shí)的背景顏色 2. 默認(rèn)值由系統(tǒng)指定 |
selectborderwidth | 1. 指定輸入框的文本被選中時(shí)的邊框?qū)挾龋ㄟx中邊框) 2. 默認(rèn)值由系統(tǒng)指定 |
selectforeground | 1. 指定輸入框的文本被選中時(shí)的字體顏色 2. 默認(rèn)值由系統(tǒng)指定 |
show | 1. 設(shè)置輸入框如何顯示文本的內(nèi)容 2. 如果該值非空,則輸入框會(huì)顯示指定字符串代替真正的內(nèi)容 3. 將該選項(xiàng)設(shè)置為 "*",則是密碼輸入框 |
state | 1. Entry 組件可以設(shè)置的狀態(tài):"normal","disabled" 或 "readonly"(注意,它跟 "disabled" 相似,但它支持選中和拷貝,只是不能修改,而 "disabled" 是完全禁止) 2. 默認(rèn)值是 "normal" 3. 注意,如果此選項(xiàng)設(shè)置為 "disabled" 或 "readonly",那么調(diào)用 insert() 和 delete() 方法都會(huì)被忽略 |
takefocus | 1. 指定使用 Tab 鍵可以將焦點(diǎn)移動(dòng)到輸入框中 2. 默認(rèn)是開(kāi)啟的,可以將該選項(xiàng)設(shè)置為 False 避免焦點(diǎn)在此輸入框中 |
textvariable | 1. 指定一個(gè)與輸入框的內(nèi)容相關(guān)聯(lián)的 Tkinter 變量(通常是 StringVar) 2. 當(dāng)輸入框的內(nèi)容發(fā)生改變時(shí),該變量的值也會(huì)相應(yīng)發(fā)生改變 |
validate | 1. 該選項(xiàng)設(shè)置是否啟用內(nèi)容驗(yàn)證 2. 詳見(jiàn)本內(nèi)容最下方小甲魚(yú)關(guān)于驗(yàn)證詳解 |
validatecommand | 1. 該選項(xiàng)指定一個(gè)驗(yàn)證函數(shù),用于驗(yàn)證輸入框內(nèi)容是否合法 2. 驗(yàn)證函數(shù)需要返回 True 或 False 表示驗(yàn)證結(jié)果 3. 注意,該選項(xiàng)只有當(dāng) validate 的值非 "none" 時(shí)才有效 3. 詳見(jiàn)本內(nèi)容最下方小甲魚(yú)關(guān)于驗(yàn)證詳解 |
vcmd | 跟 validatecommand 一樣 |
width | 1. 設(shè)置輸入框的寬度,以字符為單位 2. 默認(rèn)值是 20 3. 對(duì)于變寬字體來(lái)說(shuō),組件的實(shí)際寬度等于字體的平均寬度乘以 width 選項(xiàng)的值 |
xscrollcommand | 1. 與 scrollbar(滾動(dòng)條)組件相關(guān)聯(lián) 2. 如果你覺(jué)得用戶輸入的內(nèi)容會(huì)超過(guò)該組件的輸入框?qū)挾龋敲纯梢钥紤]設(shè)置該選項(xiàng) 3. 使用方法可以參考:Scrollbar 組件 |
方法
delete(first, last=None)
-- 刪除參數(shù) first 到 last 范圍內(nèi)(包含 first 和 last)的所有內(nèi)容
-- 如果忽略 last 參數(shù),表示刪除 first 參數(shù)指定的選項(xiàng)
-- 使用 delete(0, END) 實(shí)現(xiàn)刪除輸入框的所有內(nèi)容
get()
-- 獲得當(dāng)前輸入框的內(nèi)容
icursor(index)
-- 將光標(biāo)移動(dòng)到 index 參數(shù)指定的位置
-- 這同時(shí)也會(huì)設(shè)置 INSERT 的值
index(index)
-- 返回與 index 參數(shù)相應(yīng)的選項(xiàng)的序號(hào)(例如 e.index(END))
insert(index, text)
-- 將 text 參數(shù)的內(nèi)容插入到 index 參數(shù)指定的位置
-- 使用 insert(INSERT, text) 將 text 參數(shù)指定的字符串插入到光標(biāo)的位置
-- 使用 insert(END, text) 將 text 參數(shù)指定的字符串插入到輸入框的末尾
scan_dragto(x)
-- 見(jiàn)下方 scan_mark(x)
scan_mark(x)
-- 使用這種方式來(lái)實(shí)現(xiàn)輸入框內(nèi)容的滾動(dòng)
-- 需要將鼠標(biāo)按下事件綁定到 scan_mark(x) 方法(x 是鼠標(biāo)當(dāng)前的水平位置),然后再將 <motion> 事件綁定到 scan_dragto(x) 方法(x 是鼠標(biāo)當(dāng)前的水平位置),就可以實(shí)現(xiàn)輸入框在當(dāng)前位置和 sacn_mack(x) 指定位置之間的水平滾動(dòng)
select_adjust(index)
-- 與 selection_adjust(index) 相同,見(jiàn)下方解釋
select_clear()
-- 與 selection_clear() 相同,見(jiàn)下方解釋
select_from(index)
-- 與 selection_from(index) 相同,見(jiàn)下方解釋
select_present()
-- 與 selection_present() 相同,見(jiàn)下方解釋
select_range(start, end)
-- 與 selection_range(start, end) 相同,見(jiàn)下方解釋
select_to(index)
-- 與 selection_to(index) 相同,見(jiàn)下方解釋
selection_adjust(index)
-- 該方法是為了確保輸入框中選中的范圍包含 index 參數(shù)所指定的字符
-- 如果選中的范圍已經(jīng)包含了該字符,那么什么事情也不會(huì)發(fā)生
-- 如果選中的范圍不包含該字符,那么會(huì)從光標(biāo)的位置將選中的范圍擴(kuò)展至該字符
selection_clear()
-- 取消選中狀態(tài)
selection_from(index)
-- 開(kāi)始一個(gè)新的選中范圍
-- 會(huì)設(shè)置 ANCHOR 的值
selection_present()
-- 返回輸入框是否有處于選中狀態(tài)的文本
-- 如果有則返回 True,否則返回 False
selection_range(start, end)
-- 設(shè)置選中范圍
-- start 參數(shù)必須必 end 參數(shù)小
-- 使用 selection_range(0, END) 選中整個(gè)輸入框的所有內(nèi)容
selection_to(index)
-- 選中 ANCHOR 到 index 參數(shù)的間的所有內(nèi)容
xview(index)
-- 該方法用于確保給定的 index 參數(shù)所指定的字符可見(jiàn)
-- 如有必要,會(huì)滾動(dòng)輸入框的內(nèi)容
xview_moveto(fraction)
-- 根據(jù) fraction 參數(shù)給定的比率調(diào)整輸入框內(nèi)容的可見(jiàn)范圍
-- fraction 參數(shù)的范圍是 0.0 ~ 1.0,0.0 表示輸入框的開(kāi)始位置,1.0 表示輸入框的結(jié)束位置
xview_scroll(number, what)
-- 根據(jù)給定的參數(shù)水平滾動(dòng)輸入框的可見(jiàn)范圍
-- number 參數(shù)指定滾動(dòng)的數(shù)量,如果是負(fù)數(shù)則表示反向滾動(dòng)
-- what 參數(shù)指定滾動(dòng)的單位,可以是 UNITS 或 PAGES(UNITS 表示一個(gè)字符單元,PAGES 表示一頁(yè))
關(guān)于驗(yàn)證詳解
由于查看了不少資料,很多在這里都沒(méi)有解釋清楚,所以這里單獨(dú)列出來(lái)詳細(xì)講解下。
Entry 組件是支持驗(yàn)證輸入內(nèi)容的合法性的,比如要求輸入數(shù)字,你輸入了字母那就是非法。實(shí)現(xiàn)該功能,需要通過(guò)設(shè)置 validate、validatecommand 和 invalidcommand 選項(xiàng)。
首先啟用驗(yàn)證的“開(kāi)關(guān)”是 validate 選項(xiàng),該選項(xiàng)可以設(shè)置的值有:
值 | 含義 |
'focus' | 當(dāng) Entry 組件獲得或失去焦點(diǎn)的時(shí)候驗(yàn)證 |
'focusin' | 當(dāng) Entry 組件獲得焦點(diǎn)的時(shí)候驗(yàn)證 |
'focusout' | 當(dāng) Entry 組件失去焦點(diǎn)的時(shí)候驗(yàn)證 |
'key' | 當(dāng)輸入框被編輯的時(shí)候驗(yàn)證 |
'all' | 當(dāng)出現(xiàn)上邊任何一種情況的時(shí)候驗(yàn)證 |
'none' | 1. 關(guān)閉驗(yàn)證功能 2. 默認(rèn)設(shè)置該選項(xiàng)(即不啟用驗(yàn)證) 3. 注意,是字符串的 'none',而非 None |
其次是為 validatecommand 選項(xiàng)指定一個(gè)驗(yàn)證函數(shù),該函數(shù)只能返回 True 或 False 表示驗(yàn)證的結(jié)果。一般情況下驗(yàn)證函數(shù)只需要知道輸入框的內(nèi)容即可,可以通過(guò) Entry 組件的 get() 方法獲得該字符串。
下邊的例子中,在第一個(gè)輸入框輸入“CSDN” 并通過(guò) Tab 鍵或者鼠標(biāo)將焦點(diǎn)轉(zhuǎn)移到第二個(gè)輸入框的時(shí)候,驗(yàn)證功能被成功觸發(fā):
import tkinter as tk master = tk.Tk() def test(): if e1.get() == "CSDN": print("正確!") return True else: print("錯(cuò)誤!") e1.delete(0, "end") return False v = tk.StringVar() e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=test) e2 = tk.Entry(master) e1.pack(padx=10, pady=10) e2.pack(padx=10, pady=10) master.mainloop()
然后,invalidcommand 選項(xiàng)指定的函數(shù)只有在 validatecommand 的返回值為 False 的時(shí)候才被調(diào)用。
下邊的例子中,在第一個(gè)輸入框輸入“csdn”,并通過(guò) Tab 鍵將焦點(diǎn)轉(zhuǎn)移到第二個(gè)輸入框,validatecommand 指定的驗(yàn)證函數(shù)被觸發(fā)并返回 False,接著 invalidcommand 被觸發(fā):
import tkinter as tk master = tk.Tk() def test(): if e1.get() == "CSDN": print("正確!") return True else: print("錯(cuò)誤!") e1.delete(0, "end") return False def test2(): print("我被調(diào)用了......") return True v = tk.StringVar() e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=test, invalidcommand=test2) e2 = tk.Entry(master) e1.pack(padx=10, pady=10) e2.pack(padx=10, pady=10) master.mainloop()
最后,其實(shí) Tkinter 還有隱藏技能,不過(guò)需要冷卻才能觸發(fā),請(qǐng)聽(tīng)我一一道來(lái)......
Tkinter 為驗(yàn)證函數(shù)提供一些額外的選項(xiàng):
額外選項(xiàng) | 含義 |
'%d' | 操作代碼:0 表示刪除操作;1 表示插入操作;2 表示獲得、失去焦點(diǎn)或 textvariable 變量的值被修改 |
'%i' | 1. 當(dāng)用戶嘗試插入或刪除操作的時(shí)候,該選線表示插入或刪除的位置(索引號(hào)) 2. 如果是由于獲得、失去焦點(diǎn)或 textvariable 變量的值被修改而調(diào)用驗(yàn)證函數(shù),那么該值是 -1 |
'%P' | 1. 當(dāng)輸入框的值允許改變的時(shí)候,該值有效 2. 該值為輸入框的最新文本內(nèi)容 |
'%s' | 該值為調(diào)用驗(yàn)證函數(shù)前輸入框的文本內(nèi)容 |
'%S' | 1. 當(dāng)插入或刪除操作觸發(fā)驗(yàn)證函數(shù)的時(shí)候,該值有效 2. 該選項(xiàng)表示文本被插入和刪除的內(nèi)容 |
'%v' | 該組件當(dāng)前的 validate 選項(xiàng)的值 |
'%V' | 1. 調(diào)用驗(yàn)證函數(shù)的原因 2. 該值是 'focusin','focusout','key' 或 'forced'(textvariable 選項(xiàng)指定的變量值被修改)中的一個(gè) |
'%W' | 該組件的名字 |
為了使用這些選項(xiàng),你可以這樣寫(xiě):validatecommand=(f, s1, s2, ...)
其中,f 就是你“冷卻后”的驗(yàn)證函數(shù)名,s1、s2、s3 這些是額外的選項(xiàng),這些選項(xiàng)會(huì)作為參數(shù)依次傳給 f 函數(shù)。我們剛剛說(shuō)了,使用隱藏技能前需要冷卻,其實(shí)就是調(diào)用 register() 方法將驗(yàn)證函數(shù)包裝起來(lái):
import tkinter as tk master = tk.Tk() v = tk.StringVar() def test(content, reason, name): if content == "CSDN": print("正確!") print(content, reason, name) return True else: print("錯(cuò)誤!") print(content, reason, name) return False testCMD = master.register(test) e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=(testCMD, '%P', '%v', '%W')) e2 = tk.Entry(master) e1.pack(padx=10, pady=10) e2.pack(padx=10, pady=10) master.mainloop()
當(dāng)我故意輸入“CSDN我愛(ài)你”的時(shí)候,DUANG的一下,是錯(cuò)誤的,后來(lái)我果斷刪除了“我愛(ài)你”,嘿,又正確了:
到此這篇關(guān)于Tkinter組件Entry的具體使用的文章就介紹到這了,更多相關(guān)Tkinter Entry內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
matplotlib實(shí)現(xiàn)矩陣和圖像的可視化表示
這篇文章主要為大家詳細(xì)介紹了如何利用matplotlib實(shí)現(xiàn)矩陣和圖像的可視化表示,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-03-03Python基于Opencv來(lái)快速實(shí)現(xiàn)人臉識(shí)別過(guò)程詳解(完整版)
這篇文章主要介紹了Python基于Opencv來(lái)快速實(shí)現(xiàn)人臉識(shí)別過(guò)程詳解(完整版)隨著人工智能的日益火熱,計(jì)算機(jī)視覺(jué)領(lǐng)域發(fā)展迅速,今天就為大家?guī)?lái)最基礎(chǔ)的人臉識(shí)別基礎(chǔ),從一個(gè)個(gè)函數(shù)開(kāi)始走進(jìn)這個(gè)奧妙的世界,需要的朋友可以參考下2019-07-07python3實(shí)現(xiàn)域名查詢和whois查詢功能
本篇文章給大家分享了python3實(shí)現(xiàn)域名查詢和whois查詢功能的詳細(xì)代碼,有需要的朋友參考學(xué)習(xí)下。2018-06-06VSCODE配置Markdown及Markdown基礎(chǔ)語(yǔ)法詳解
這篇文章主要介紹了VSCODE配置Markdown及Markdown基礎(chǔ)語(yǔ)法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01