天天看點

python-Tkinter輸入框+驗證輸入内容(六)

一、普通輸入框

from tkinter import *
'''
1、這個程式實作文本框輸入。
2、使用grid方法按照Excel表格方式對元件位置進行安排
3、通過Button送出按鈕實作擷取使用者的輸入資訊。
'''
root = Tk()
 
Label1 = Label(root,text='會員名稱:').grid(row=0,column=0)
Label2 = Label(root,text='會員代号:').grid(row=1,column=0)
 
v1 = StringVar()
p1 = StringVar()
e1 = Entry(root,textvariable=v1)    # Entry 是 Tkinter 用來接收字元串等輸入的控件.
e2 = Entry(root,textvariable=p1,show='#')
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())
Button(root,text='驗證資訊',width=10,command=show)\
    .grid(row=2,column=0,sticky=W,padx=10,pady=5)
 
Button(root,text='退出',width=10,command=root.quit)\
    .grid(row=2,column=1,sticky=E,padx=10,pady=5)
 
mainloop()      

二、開啟輸入框驗證

from tkinter import *
'''
開啟Entry對輸入文本驗證功能。
1、實作該功能,需要通過設定validate、validatecommand和invalidcommand三個選項。 
2、啟用驗證的開關是validate選項,該選項可以設定以下的值:
    focus:當entry元件獲得或者失去焦點的時候驗證 
    focusin:當entry元件獲得焦點的時候驗證 
    focusout:當entry元件失去焦點的時候驗證 
    key:當輸入框被編輯的時候驗證 
    all:當出現上面任何一種情況時候驗證 
    none:關閉驗證功能。預設設定為該選項
3、validatecommand選項指定一個驗證函數,該函數隻能傳回True或者False表示驗證結果,一般情況下驗證函數隻需要知道輸入框中的内容即可,
可以通過Entry元件的get()方法來獲得該字元串。
4、invalidcommand選項指定的函數隻有在validatecommand的傳回值為False的時候才被調用。
'''
'''
validatecommand選項指定一個驗證函數,該函數隻能傳回True或者False表示驗證結果
invalidcommand選項指定的函數隻有在validatecommand的傳回值為False的時候才被調用。
'''
root = Tk()
def text():
    if e1.get() == '芝麻開門':
        print('正确')
        return True
    else:
        print('錯誤')
        return False
def text2():
    print('validatecommand的傳回值為False的時候調用了我')
    return False
 
v = StringVar()
e1 = Entry(root,textvariable=v,validate='focusout',validatecommand=text,\
           invalidcommand=text2)
e2 = Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()      
from tkinter import *
'''
Tkinter 為驗證函數提供了一些隐藏的功能選項。
%d:操作代碼-0表示删除操作,1表示插入操作,2表示獲得、失去焦點或textvariable變量值被修改
%i:1、當使用者嘗試插入或删除操作時候,該選項表示插入或删除的位置(索引号)
    2、如果是獲得、失去焦點或textvariable變量值被修改該而地啊喲用驗證函數,那麼該值是-1
%P: 1、當輸入框的值允許改變的時候,該值有效
    2、該值為輸入框的最新文本内容    
%s: 1、該值為調用驗證函數前輸入框的文本内容
%S:1、當插入或删除操作出發驗證函數的時候,該值有效
    2、該選項表示文本被插入和删除的内容
%v: 1、該元件的validate選項的值
%V: 1、調用驗證函數的原因
    2、該值是focusin,focusout,ke,或forced(textvariable選項指定的變量值被修改)中的一個
%W: 該元件的名稱   
'''
'''
為了使用這些選項,我們可以這樣修改我們的validatecommand選項:
validatecommand=(f,s1,s2,……)
其中,f是驗證函數名,s1,s2等是額外的選項,這些選項會作為參數依次傳給f函數,
我們在使用隐藏的功能選項前需要冷卻,這就是register()方法将驗證函數包裝起來。
'''
root = Tk()
def text(content,reason,name):
    if e1.get() == '芝麻開門':
        print('正确')
        print(content, reason, name)
        return True
    else:
        print('錯誤')
        print(content,reason,name)
        return False
def text2():
    print('validatecommand的傳回值為False的時候調用了我')
    return False
 
v = StringVar()
testCMD = root.register(text)   #register()方法将驗證函數包裝起來
e1 = Entry(root,textvariable=v,validate='focusout',\
           validatecommand=(testCMD,'%P','%v','%W'),\
           invalidcommand=text2)
e2 = Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()      
from tkinter import *
 
master = Tk()
 
frame = Frame(master)
frame.pack(padx=10,pady=10)
 
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
 
'''
注意在這裡我們不能使用entry控件的get()方法來擷取輸入的内容
因為當validate選項指定為key的時候,有任何的輸入操作都會被攔截
到這個函數當中,也就是說先攔截,隻有這個函數傳回True,那麼輸入的内容
才會到變量裡面去,也就是說我們使用get函數并無法get到資料,get函數在這個
函數之後才會有效,get函數得到的是變量的值。
是以隻有使用%P來獲得最新的輸入框的内容
'''
def test(content):
     if content.isdigit():
          return True
     else:
          return False
#使用了特殊技能的函數需要使用register将其封裝起來才可以
testCMD = master.register(test)
e1 = Entry(frame,width=10,textvariable=v1,validate='key',\
           validatecommand=(testCMD,'%P')).grid(row=0,column=0)
Label(frame,text='+').grid(row=0,column=1)
 
e2 = Entry(frame,width=10,textvariable=v2,validate='key',\
           validatecommand=(testCMD,'%P')).grid(row=0,column=2)
Label(frame,text='=').grid(row=0,column=3)
#e3輸入框是顯示結果文本框,是以不允許修改裡面的值。将state屬性設定為state='readonly'隻讀
e3 = Entry(frame,width=10,textvariable=v3,state='readonly').grid(row=0,column=4)
 
def calc():
     result=int(v1.get())+int(v2.get())
     v3.set(str(result))
Button(frame,text='計算結果',command=calc).grid(row=1,column=2,padx=5)
 
mainloop()