魚c筆記——Python 的 GUI 編程(四):Tkinter 組件 Entry

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()

原文入口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章