Entry 組件的基本用法
Entry 的 show, width 屬性
Entry 的驗證功能
Label 組件的 row, column 屬性
Button 組件的 sticky 屬性
Entry組件:輸入框
輸入框是和程序打交道的一個途徑。比如說程序要求輸入賬號和密碼,就需要提供兩個輸入框,接受密碼的輸入框還會用*星號將實際內容隱藏起來。
學了好幾個 Tkinter 的組件,不難發現,很多方法和選項之間是通用的,意思是名字一樣,內容也一樣。比如說,在輸入框中用代碼增加和刪除內容,就是使用 insert() 和 delete() 方法。
from tkinter import *
root = Tk()
e = Entry(root)
e.pack(padx=20, pady=20)
e.delete(0, END) #將輸入框裏面的內容清空
e.insert(0, '默認文本在此!')
mainloop()
獲取數據框裏的內容,可以使用 Entry 組件裏的 get 方法。也可以將 Tkinter 的變量,通常是字符串類型的變量掛鉤到 textvariable 選項上,再通過變量的 get 方法獲取也是可以的。
from tkinter import *
#tkinter提供了三種佈局組件的方式,第一種是pack()
# 第二種是Grid()網格,第三種是prase()
root = Tk()
e1 = Entry(root,width =25)
e1.grid(row = 0,column = 1,padx = 10,pady = 5)
e2 = Entry(root,width =25)
e2.grid(row = 1,column = 1,padx = 10,pady = 5)
l1 = Label(root,text = '作品:')
l1.grid(row = 0,column = 0)
l2 = Label(root,text = '作者:')
l2.grid(row = 1,column = 0)
def getmessage():
print( '作品:《%s》' % (e1.get()) )
print( '作者:%s' % e2.get() )
b1 = Button(root,text = '獲取信息',width = 10,command = getmessage)
b1.grid(row = 2,column = 0,padx = 10,pady = 5)
b1 = Button(root,text = '退出',width = 10,command = root.quit)
b1.grid(row = 2,column = 1,padx = 10,pady = 5)
mainloop()
實現密碼框的用星號代替實際內容,可以通過 Entry 的 show 參數來實現:
l1 = Label(root,text = '賬號:')
l1.grid(row = 0,column = 0)
l2 = Label(root,text = '密碼:')
l2.grid(row = 1,column = 0)
v1 = StringVar()
v2 = StringVar()
e1 = Entry(root,width =25,textvariable = v1)
e1.grid(row = 0,column = 1,padx = 10,pady = 5)
e2 = Entry(root,width =25,textvariable = v2,show = '*')
e2.grid(row = 1,column = 1,padx = 10,pady = 5)
如果想要設計一個計算器,除了數字以外不允許其他字符出現,該怎麼設計呢?
Entry 組件本身就自帶了驗證功能,就是可以驗證輸入框裏面內容的合法性。實現該功能,就要設置選項 validate, validatecommand 和 invalidcommand
首先啓用驗證的” 開關” 是 validate 選項,該選項可以設置的值有:
focus
當Entry組件獲得或失去焦點的時候驗證(當Entry組件獲得或失去焦點的時候調用validate-command指定的驗證函數)
focusin
當Entry組件獲得焦點的時候驗證
focusout
當Entry組件失去焦點的時候驗證
key
當輸入框被編輯的時候驗證
all
當出現上面任何一種情況的時候驗證
none
①關閉驗證功能
②默認設置該選項(即不用啓用驗證)
③注意:是字符串的'none',而非None
其次是爲 validatecommand 選項指定一個驗證函數,該函數只能返回 True 或 False 表示驗證的結果,一般情況下驗證函數只需要知道輸入框的內容即可,可以通過 Entry 組件的 get() 方法獲得該字符串。
from tkinter import *
master = Tk()
def test():
if e1.get() == '我愛學習':
print('繼續努力!')
return True
else:
print('你在說什麼鬼話')
e1.delete(0, END)
return False
v = StringVar()
e1 = Entry(master, textvariable=v, validate='focusout', validatecommand=test) #當焦點移出的時候調用validatecommand設置的函數test
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)
mainloop()
invalidcommand 選項指定的函數只有在 validatecommand 的返回值爲 False 的時候纔會被調用。
下邊的例子中,在第一個輸入框輸入不是 " 我愛學習 " 以外的字符串,並通過 Tab 鍵將焦點轉移到第二個輸入框,validatecommand 指定的驗證函數被觸發並返回 False,接着 invalidcommand 被觸發:
其實 Tkinter 還有隱藏功能,不過需要冷卻纔能實現:
Tkinter 爲驗證函數提供一些額外的選項:
%d
操作代碼:0表示刪除操作;1表示插入操作;2表示獲得、失去焦點或textvariable變量的值被修改
%i
當用戶嘗試插入或刪除操作的時候,該選項表示插入或刪除的位置(索引號)
如果是由於獲得、失去焦點或textvariable變量的值被修改而調用驗證函數,那麼該值是-1
%P
當輸入框的值允許被改變的時候,該值有效
該值爲輸入框的最新文本內容
%s
該值爲調用驗證函數前輸入框的文本內容
%S
當插入或刪除操作觸發驗證功能的時候,該值有效
該選項表示文本被插入和刪除的內容
%v
該組件當前的validate選項的值
%V
調用驗證函數的原因
該值是'focusin'、'focusout'、'key'或'focused'(textvariable選項指定的變量值被修改)中的一個
%W
該組件的名字(在Tkinter內部會註冊一個名字,顯示的是註冊的名字,類似於句柄)
爲了使用這些選項,我們可以這樣寫:validatecommand=(f, s1, s2, ...)---把它變成了一個元組
其中,f 就是我們 ‘冷卻後’ 的驗證函數名,s1, s2, s3 這些都是額外的選項,這些選項會作爲參數依次傳遞給 f 函數。我們剛剛說了,使用額外功能前需要冷卻,其實就是調用 register() 方法將驗證函數包裝起來:
from tkinter import *
master = Tk()
def test(content, reason, name): #test不再是沒有參數的方法了,參數是在validatecommand裏出現的
if content == '我愛學習':
print('繼續努力!')
print(content, reason, name)
return True
else:
print('你在說什麼鬼話')
print(content, reason, name)
e1.delete(0, END)
return False
v = StringVar()
testCMD = master.register(test)
e1 = Entry(master, textvariable=v, validate='focusout', \
validatecommand=(testCMD, '%P', '%v', '%W'))
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)
mainloop()
下面是設計一個簡單的加法計算器:
from tkinter import *
root = Tk()
frame = Frame(root)
frame.pack(padx = 10,pady = 10)
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
def test(content):
print(content.isdigit())
return content.isdigit()
testCMD = root.register(test)
e1 = Entry(frame,width = 10,textvariable = v1,validate = "key",\
validatecommand = (testCMD,'%P') )
e1.grid(row = 0,column = 0)
e2 = Entry(frame,width = 10,textvariable = v2,validate = "key",\
validatecommand = (testCMD,'%P') )
e2.grid(row = 0,column = 2)
e3 = Entry(frame,width = 10,textvariable = v3,state = 'readonly')
e3.grid(row = 0,column = 4)
Label(frame,text = '+').grid(row = 0,column = 1)
Label(frame,text = '=').grid(row = 0,column = 3)
def calc():
res = int(v1.get())+int(v2.get())
v3.set(str(res))
b1 = Button(frame ,text = '計算結果',command = calc)
b1.grid(row = 1,column = 2,pady = 5)
mainloop()