python_ocr文字識別小工具學習筆記 1.4 (TKinter得學習使用之基礎學習——標籤、組件介紹與按鈕)
組件
- 如果⼤家有過 Windows GUI 編程經驗,那麼對於 控件 ⼀次 ⼀定不會陌⽣,其實組 件和控件是⼀回事,在這⾥我們不加以區分。
- 組件的英⽂表述是 widget ,我們常⻅的按鈕,⽂本 框等等都可以當做組件。
- 我們可以爲⼀個窗⼝增加若⼲組件來豐富該窗⼝的功能, 我們往往需要指定這個組 件的⼤⼩和位置,我們還需要通過編程的⽅式,來指定該組件能完成什麼功能。
Label 類
標籤
- 所謂 標籤 ,就是貼在物品前⾯的⼀個簡短的說明, 它⽤於說明⼀些⽂字信息。
- 標籤可以說是最簡單的窗⼝組件了,它不需要執⾏任何功能,只是⽤來顯示信息。
- 下⾯是代碼示例:
from tkinter import *
root = Tk()
root.wm_title("這是⼀個Tkinter程序窗⼝標題")
wl= Label(root, text = "歡迎")
wl.pack()
root.mainloop()
演示效果
代碼分析
1.這⾥的 Label 是⼀個類,可以在 init.py ⽂件⾥查看 相應的源代碼。
2. wl 是⼀個 Label 的實例,它有⼀個 text 屬性 ,⽤來指定 它的⽂本內容。
3. 3. 該類的源代碼也⾮常簡單,它的源代碼截圖:
4. ⼤家可以看到它的標準屬性,⽐如有 background , font , bitmap , padx , relief 等等, 還有 underline 等等。
5. 該類有個 pack ⽅法,沒錯,這個 pack ⽅法我們後⾯會 講,⼤家可以理解爲它的作 ⽤就是找個合適的位置進⾏放置即可,即 pack() 之後就選定位置放上去了。
6. 這⾥的初始化的時候,需要先指定 root,是說 wl 這個組 件是在 root 這個窗⼝的,不 是屬於別的窗⼝的,以後我們 有了多窗⼝的應⽤程序,不會混淆。
Widget 類
- 我們上⾯發現,Label 類是繼承⾃ Widget 類的,並且⾃ ⼰只有⼀個⽅法,就是⽤來 初始化⾃身的,那麼要想徹底 理解 Label,就必須徹底理解 Widget。
- 我們找到了 Widget 的代碼,發現它更加短⼩,甚⾄連個 ⽅法都沒有,下⾯是 Widget 的截圖:
3. 通過這個註釋,我們可以理解如下:它是⼀個可以指定 位置並且可以使⽤ pack , place 和 grid 來佈局管理的窗⼝ 組件。
4. 然後我們找到 BaseWidget ,發現它的代碼也很短⼩,代 碼截圖如下:
5. 該類繼承⾃ Misc ,包含了四個函數,函數的功能通過名 字就可以知道了。⾄於Misc 類,我們後⾯會講解的。
Misc其實是英⽂ Miscellaneous 的前四個字⺟,雜項、混合體、⼤雜燴的意思。在軟件⾥ 經常可以看到與misc相關的⽂件或函數名,使⽤misc來命名主要是表示該⽂件⽬前還沒 歸類好,不知道將它歸到哪個⽅⾯或者放置在哪個地⽅⽐較好,所以暫時⽤misc。
多標籤的應⽤程序
- 如果我們想要多個標籤,該怎麼辦呢?
- 很簡單,只需要聲明多個標籤的實例,然後分別 pack 到 窗⼝上即可。
- 下⾯是使⽤了三個標籤的代碼截圖:
from tkinter import *
root = Tk()
root.wm_title("這是⼀個Tkinter程序窗⼝標題")
w1 = Label(root, text = "歡迎", background = "white")
w2 = Label(root, text = "好好學習,天天向上!", background = "green")
w3 = Label(root, text = "輕鬆愉快,就選Python!", background = "red")
w1.pack()
w2.pack()
w3.pack()
root.mainloop()
組件講解以及按鈕
tkinter 的核⼼組件
- 在 Python 的 tkinter 中,有 21 個核⼼組件,它們提供 了最基本的功能,雖然簡單, 因爲使⽤頻率較⾼,因此特 別重要。
- 這 21 個核⼼組件是 : Toplevel、Label、Button、 Canvas、Checkbutton、Entry、 Frame、LabelFrame、 Listbox、Menu、Menubutton、Message、OptionMenu、 PaneWindow 、 Radiobutton 、 Scale 、Scrollbar 、Spinbox 、Text、Bitmap、 Image。
組件的使⽤
- 各個組件都有相應的類,我們可以通過⾯向對象的⽅式 去使⽤它們。
- 這些組件的使⽤也很相似,在實例化這些組件的時候, 第⼀個參數都是⽗窗⼝或者 ⽗組件,後⾯跟着的就是該組 件的⼀些屬性,⽐如上⾯我們學到的 Label 的 text 屬性和 background 屬性。
- 多個組件的位置控制⽅式也很相似,我們可以⽤ pack ⽅法來進⾏簡單的佈局,具體 的個例我們後⾯再說。
- 組件也會有些⽅法是共⽤的,⽐如 configure ⽅法來設置屬性等等。
按鈕
1.按鈕也是⾮常重要的組件, 按鈕的重要性在於它可以執⾏相應 的功能。 2. 按鈕的英⽂表述是 button ,它隨處可⻅,當我們單 擊的時候,它可以執⾏相應的功 能。
3. 按鈕在 tkinter 中有⼀個類專⻔負責它,叫做 Button ,該類也⾮常簡短。
按鈕與功能的綁定
- 上⽂說到,按鈕可以執⾏相應的功能,這⾥的功能我們 可以理解爲⼀個函數,或者 這些功能通過相應的函數去實 現。
- 綁定⽅式通常有如下⼏種:第⼀種,在按鈕組件被聲明 的時候⽤ command 屬性聲 明, command 屬性接受⼀個函數名, 注意函數名不要加雙引號。第⼆種,使⽤ bind ⽅法,該⽅ 法是 Misc 這個類的⼀個⽅法,下⾯我們仔細講解。
1. 第⼀種⽅法綁定事件
我們要完成的功能是我們按下這個按鈕的時候,就會在 窗⼝上增加⼀個 Label,它顯 示“我愛 python”。 代碼示例
from tkinter import *
def myLabel():
global py, i
s = Label(py, text = "輕鬆愉快,就選Python! 重要的事情說 %d 遍!" % i)
s.pack()
i+=1 # 每次點擊後,i的值會⾃增1
py = Tk()
i = 1 # 全局變量i 初始化爲 1
b = Button(py, text = "Python", command = myLabel)
b.pack()
py.mainloop()
運⾏結果:(⼀開始是隻有⼀個按鈕的,點擊⼀下,就會在這個窗⼝上多⼀個標籤,下⾯ 是我點擊了三次之後的截圖):
代碼解讀
- 其實很簡單,這⾥只需要注意 command 屬性後⾯不要加任何的標點符號。
- 這⾥的 myLabel 函數中,使⽤了全局的 py 和 i 變量,需要注意。
2. 第⼆種⽅式綁定事件
下⾯使⽤第⼆種⽅式來綁定事件,這個事件完成同樣的功能。
代碼示例:
from tkinter import *
def myLabel(event): # 這⾥多了⼀個event參數⽤來接收
global py, i
s = Label(py, text = "輕鬆愉快,就選Python! 重要的事情說 %d 遍!" % i)
s.pack()
i+=1
py = Tk()
i = 1
b = Button(py, text = "Python") # command = myLabel ⽊有了
b.bind("<Button-1>", myLabel) # 多了這⼀句
b.pack()
py.mainloop()
運⾏結果:(和第⼀種⽅法的結果⼀樣)
代碼解讀:
-
bind這個⽅法是在 Misc 類中的,可以接受三個參數,但是本例中我們只傳遞了兩個 參數。
-
第⼀個參數可能對剛使⽤它的⼈來說有點複雜,常⻅的⿏標左鍵單擊如下: <Button- 1> (也就是上⾯的代碼⽤到的),或者 等。
-
第⼆個參數可以是⼀個函數名,記住,不要加任何的標 點符號,否則運⾏時會報錯 的。
-
使⽤ bind 函數的時候,第⼆個參數是⼀個函數名,該函數必須接受⼀個參數,即表 示該事件。 這個參數通常⽤ event 來表示,如果我們調⽤的函數不接 受任何參數, 則會報錯如下 : TypeError: myLabel() takes no arguments (1 given)
bind的第⼀個參數是⽤字符串包含的事件類型,它採⽤的描述⽅式是:-
這⾥的 MODIFIER 即鍵盤或者⿏標修飾符,它的全部取值如下: Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4, Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,B3, Alt, Button4, B4, Double, Button5, B5 Triple , Mod1, M1
2.TYPE 表示類型,它的全部取值如下: Activate, Enter, Map, ButtonPress, Button, Expose, Motion, ButtonRelease, FocusIn, MouseWheel, Circulate, FocusOut, Property, Colormap, Gravity Reparent, Configure, 18
組件介紹與按鈕 KeyPress, Key, Unmap, Deactivate, KeyRelease Visibility, Destroy,Leave -
DETAIL 表示細節,其實也就是對第⼆個參數的⼀些輔助說明。
-
設置屬性
下⾯我們可以設置⼀些屬性,這些東⻄隨着⼤量的代碼示例,⼤家會接觸不少的。 ⽐如我們可以設置背景⾊,這⾥直接設置屬性,代碼截 圖:
from tkinter import *
py = Tk()
b1 = Button(py, text = "heloop")
b1["width"] = 20
b1["height"] = 4
b1.pack()
b2 = Button(py, text = "Python")
b2["width"] = 20
b2["background"] = "white"
b2.pack()
py.mainloop()
總結
- 關於按鈕,我們重點理解的就是它如何和事件進⾏綁定的。
- 當然,使⽤⼀些其他屬性來美化按鈕也很重要。
- 下⾯要講⼀講佈局⽅⾯的東⻄了。