以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://mp.weixin.qq.com/s/2G...
本文大概 4158 個字,閲讀需花 10 分鐘
內容不多,但也花了一些精力
如要交流,歡迎關注我然後評論區留言
謝謝你的點贊收藏分享
農曆新的一年開始了,打工的煩心事兒可以稍停,但是學習不能停止!
關於 Tkinter
上期講過,python 其實有三大流行 GUI 開發框架,包括 PyQt、wxPython 和 Tkinter。wxPython 也在上期文章介紹過,今天給大夥帶來 Tkinter 的入門介紹!
Tkinter 是 python 標準庫內嵌自帶的界面開發框架,算得上是皇親國戚了。如此火熱的 python ,又怎能不瞭解一下它自帶的界面開發框架呢?
Tkinter 有很多強大的地方,比如跨平台特性。同一套代碼可以輕鬆運行在 Windows, macOS 和 Linux 系統環境下。它的可視化元素都是基於本地系統元素渲染而得,所以和原生開發相比看不出來有什麼區別。
另外,Tkinter 和其它 GUI 框架相比非常輕量和簡潔。這就帶來了很明顯的缺點,界面風格有些過時。如果你需要開發光鮮亮麗的應用,可以參考一下我的其它博文,其中可找到其它的解決方案,總有適合你的那一款!而輕量級的優點也是很突出的,如果華麗花哨的可視化於你是無關緊要的話,Tkinter 真的可以拿來即用,也沒有繁雜的開發流程,方便專注於功能的快速實現。對於急用的工具型軟件,有必要活捉一番 Tkinter。
關於往期相關的文章,有興趣可前往關注我的微信公眾號 「englyf」 查看,倍感榮幸能得到你的關注!
這將是一個系列文章,你可以瞭解到這些信息:
Tkinter 應用的基本框架是什麼樣子?
常用的基本控件有哪些?
除了基本控件,還有主題控件?
怎樣佈局界面?
如何與界面元素交互?
手把手寫一個簡單的記事本應用
本文所有測試代碼運行環境基於 win10 x64。
基本框架
好了,八戒為了見 Tkinter 一面,就像娶媳婦一樣,匆忙揭開蓋頭,一睹為快。
新建文件 main.py,先寫一個 hello world 吧!
import tkinter as tk
window = tk.Tk()
window.title("hello world !")
window.mainloop()
可以看到,需要先導入庫 tkinter,名字有點長,所以命名為 tk 方便下面的引用。
絕大部分的界面應用都需要一個頂層窗口,這裏通過實例化類 Tk 獲得。然後在這個頂層窗口的標題欄設置標題,調用方法 title(),傳入 “hello world”。最後,為了響應用户的交互和輸入,必須調用主窗口的 mainloop() 以啓動事件環。
雖然 tkinter 是 python 標準庫的自帶 GUI 框架,但是在使用前也得先安裝 tk 庫。
pip install tk
安裝完,使用 pip list 確認一下
Package Version
---------- -------
pip 22.3.1
setuptools 56.0.0
tk 0.1.0
寫作時,當前安裝的最新版本是 0.1.0。
上面的環境配置指令建議在預先準備好的虛擬環境下執行,至於怎麼配置虛擬環境,可以看看我的另一篇文章《Python:靈活的開發環境》
然後在環境下,輸入腳本啓動指令
python main.py
看看跑起來的界面程序什麼樣子
從上面代碼來看,沒有冗餘的部分,的確是拿來即用。
基本控件
下面是一些基本又常用的控件
| 控件類 | 説明 |
|---|---|
| Label | 文本標籤,顯示靜態文本 |
| Button | 按鍵,可點擊的按鍵 |
| Frame | 矩形區域,組合相關控件 |
| Entry | 單行輸入框,輸入單行文本 |
| Text | 多行輸入框,輸入多行文本 |
| Spinbox | 範圍輸入框,選擇指定範圍內的值 |
| Scale | 刻度條,拖動按鈕選取數值 |
| Progressbar | 進度條,顯示進度 |
| Listbox | 列表,顯示瀏覽和選擇單行文本項的列表 |
當然 tkinter 的基本控件還有不少沒列出來,由於篇幅有限,本文着重於入門級別,如果你有需要查找更全面的信息可以繼續關注本公眾號的後續更新。所以接下來就從上面的表格中挑幾個基本的控件來細講,繼續看。
Label 文本標籤
做界面的時候,如果你需要顯示一些靜態的文本,比如在某些元素前面顯示一個名稱,那麼就可以用到控件 Label。這裏要注意,控件 Label 被設計用於向用户顯示文本,而不是獲取文本。
比如,要顯示一行文本 display text with framework tkinter
import tkinter as tk
window = tk.Tk()
lbl = tk.Label(
master=window,
text="display text with tkinter framework",
fg="white",
bg="black",
width=40,
height=10
)
lbl.pack()
window.mainloop()
實例化類 Label 的時候,演示了傳入參數 master,text,fg,bg,width 和 height。
參數 master 用於指定被實例化的控件被放置在哪個父控件中,這裏指定將實例化的控件 Label 放置在頂層窗口 window 中。
注意:如果 master 參數被忽略,那麼被實例化的控件就默認被放置在頂層窗口中。
參數 text 傳入的內容就是要顯示的文本字符串。
參數 fg 和 bg 分別是 fontground 和 background 的縮寫,分別表示字體顏色和背景顏色。可以輸入有效的顏色名字,比如 "white","black","red","orange","yellow","green","blue","purple"等 ,或者輸入 # 開頭的 RGB 值,比如 "#34A2FE"。
參數 width 和參數 height 分別用於設置控件的寬高。
要注意的是,上面用到的參數 width 和參數 height 的單位不是像素而是文本單位,1個單位 width 表示文本字符 0 的寬度,1個單位 height 表示文本字符 0 的高度。所以,如果 width 和 height 數值相等,那麼實際顯示效果也不會是正方形。
像上面説的那樣子,單純創建完控件是無法顯示出來的。為了顯示控件,還需要調用幾何圖形管理器(geometry manager),如代碼所示,這裏使用的幾何圖形管理器是 pack。當然也可以選用其它的管理器,在下面的界面佈局主題章節中會專門介紹,繼續看。
看看顯示效果
另外,tkinter 對提供的帶有文本的部分控件,比如 Label 等,在實例化時,還有個非常有用的參數 textvariable。這個參數需要傳入 tkinter 提供的特定字符串類型的變量。然後,在需要讀取和修改控件文本時,可以直接操作傳入參數 textvariable 的變量。舉個栗子
import tkinter as tk
window = tk.Tk()
var_lbl = tk.StringVar()
var_lbl.set("display text with tkinter framework")
lbl = tk.Label(
master=window,
fg="white",
bg="black",
width=40,
height=10,
textvariable=var_lbl
)
lbl.pack()
print(f"{var_lbl.get()}")
window.mainloop()
通過 tkinter 提供的 StringVar() 生成特殊字符串類型的量賦給變量 var_lbl,然後傳給控件實例化的參數 textvariable。在讀取控件 Label 的文本時,可通過 var_lbl.get() 獲取。如果需要修改控件的文本,可通過 var_lbl.set() 傳入字符串即可。
執行的程序界面和上面的無異,但是命令終端會有輸出
(.venv) D:\englyf\python>python main.py
display text with tkinter framework
Button 按鍵
在界面中,為了觸發某些動作,一般通過點擊按鍵來啓動。那麼,tkinter 是怎麼添加按鍵控件?
下面舉個栗子,添加一個帶有文本顯示 Click me! 的按鍵。
import tkinter as tk
window = tk.Tk()
btn = tk.Button(
text="Click me!",
width=25,
height=5,
bg="blue",
fg="yellow"
)
btn.pack()
window.mainloop()
參數 text 輸入顯示的文本字符串,參數 width 輸入控件寬度,參數 height 輸入控件高度,參數 bg 輸入代表背景顏色的名字,參數 fg 輸入代表字體顏色的名字。
要注意的是,上面用到的參數 width 和參數 height 的單位同樣是文本單位。
控件 Button 同樣支持參數 textvariable。
看看顯示效果
然後,你可能有疑問,代碼中為什麼沒看到觸發動作的內容?莫慌!這個其實屬於交互的範疇,在下面的交互章節有專門介紹,繼續看。
Frame 矩形區域
一般界面中,為了顯示豐富的功能,經常需要把各種各樣的控件組合在一起,那麼就需要有控件充當組合粘貼板功能,而控件 Frame 剛好可以擔起這個責任。
控件 Frame 用於組合相關控件,或者在控件之間提供填充的矩形區域,所以 Frame 是控件容器,也屬於佈局的內容,這裏提前説説看,方便後邊引用控件 Frame 對其它控件的演示。下面舉個栗子,在控件 Frame 上添加靜態標籤 Label 和按鍵 Button 各一個。
import tkinter as tk
window = tk.Tk()
frame = tk.Frame()
label = tk.Label(
master=frame,
text="I'm a label in Frame"
)
label.pack()
button = tk.Button(
master=frame,
text="I'm a button in Frame"
)
button.pack()
frame.pack()
window.mainloop()
為了把控件 Label 和 Button 粘貼到控件容器 Frame 中,只需要把控件容器 Frame 的實例引用賦值給各個控件的實例化參數 master 即可。相當於為各個控件指定父控件,那麼這裏的控件 Label 和 Button 也被稱之為子控件。
道理類似於:一個孩子只能有一個父親,一個父親卻可以有多個孩子。
看看顯示效果
可以看到,控件 Label 排在控件 Button 的上面,那麼怎麼反過來呢?
import tkinter as tk
window = tk.Tk()
frame = tk.Frame()
label = tk.Label(
master=frame,
text="I'm a label in Frame"
)
button = tk.Button(
master=frame,
text="I'm a button in Frame"
)
button.pack()
label.pack()
frame.pack()
window.mainloop()
看看顯示效果
Entry 單行輸入框
界面中一般會有一些輸入框,比如現在要介紹的單行文本輸入框控件 Entry。如果輸入的內容比較少,那麼就適合使用這個控件 Entry。
下面舉個栗子,添加一個單行文本輸入框。
import tkinter as tk
window = tk.Tk()
entry = tk.Entry(
fg="yellow",
bg="blue",
width=50
)
entry.pack()
window.mainloop()
實例化單行輸入框控件,參數 fg 表示字體顏色,參數 bg 表示背景色,參數 width 也是文本單元的寬度。與其關注輸入控件的樣色,不如關心一下怎麼從輸入控件讀取內容。
獲取全部內容,使用 get()。
清空控件的內容,使用 delete()。輸入參數 first 和 last 設置刪除的字符索引範圍,從 first 開始到 last 結束,不包括 last。last 可以忽略,也可以填 tk.END,表示刪除內容到最後位置。
插入內容,使用 insert()。輸入參數 index 和 string 設置在索引 index 處,插入內容 string。
控件 Entry 同樣支持參數 textvariable。
看看顯示效果
Text 多行輸入框
再來看看多行輸入框控件 Text。如果輸入的內容比較多,需要換行才能比較好地顯示,那麼就適合使用這個控件 Text。
下面舉個栗子,添加一個多行文本輸入框。
import tkinter as tk
window = tk.Tk()
text = tk.Text(
fg="yellow",
bg="blue",
width=50
)
text.pack()
window.mainloop()
實例化多行輸入框控件,輸入的參數和控件 Entry 類似,這裏略過了。重點説一下對這個控件的內容讀寫操作。
獲取內容,使用 get()。如果沒有輸入參數,會引起程序執行異常。因為這個方法至少需要輸入一個參數 index,用於表示獲取的開始位置。還可以輸入多一個參數 index,用於表示獲取的結束位置,此參數可忽略,若忽略則表示獲取內容到最後結束位置。
清空控件的內容,使用 delete()。
插入內容,使用 insert()。輸入參數 index 和 chars 設置在索引 index 處,插入內容 chars。index 可以使用類似 <line>.<column> 的格式,比如
text.insert("1.2", "Hello")
上面的代碼,表示在第1行2列處,插入字符串 Hello
看看顯示效果
Spinbox 範圍輸入框
在有些界面中,也時常會看到有些輸入框,只能從指定範圍內選取值,並且右側有向上或向下的箭頭按鈕,點擊向上或向下的箭頭可按照步進值對輸入框中的值加或減,但不能超過設定的範圍值。
下面舉個栗子,添加一個這樣子的輸入框,並且輸入範圍限定在[0, 100]之間,步進為1。
import tkinter as tk
window = tk.Tk()
spinbox = tk.Spinbox(
master=window,
from_=0,
to=100,
increment=1
)
spinbox.pack()
window.mainloop()
實例化控件 Spinbox,參數 from_ 輸入範圍的最小值,參數 to 輸入範圍的最大值,參數 increment 設定步進值。
獲取內容,使用 get(),返回值是輸入框中的字符串。
刪除輸入框中的內容,使用 delete()。輸入參數 first 和 last,分別指定開始字符的索引和結束字符的索引。如果忽略 last,那麼默認 last = first+1。
插入內容,使用 insert()。輸入參數 index 和 s,index 代表開始插入的索引,s 表示插入的字符串。
控件 Spinbox 同樣支持參數 textvariable。
看看顯示效果
由於篇幅受限,本系列教程還未完結,下一篇《Python 內置界面開發框架 Tkinter入門篇 乙》將在本公眾號稍後推送,如果你對此教程有興趣或者想和我一起交流更多精彩內容,歡迎關注我的微信公眾號 【englyf】,等着你哦!