Python 內置界面開發框架 Tkinter入門篇 甲

来源:https://www.cnblogs.com/englyf/archive/2023/01/23/17064862.html
-Advertisement-
Play Games

最近寫了個 python 的 tkinter 框架入門教程,希望給大家介紹一下這個框架的上手過程,這是一個系列文章,現在是第一篇。 ...


本文大概 4158 個字,閱讀需花 10 分鐘
內容不多,但也花了一些精力
如要交流,歡迎關註我然後評論區留言
謝謝你的點贊收藏分享

首先,今天先給大家拜個好年!新年快樂,恭喜發財!為了感謝大家對我的鼓勵和支持,特地在公眾號里搞了一波紅包抽獎活動。如果需要參與沾沾手氣的話,可以在1月23號22:00之前到公眾號消息頁面回覆關鍵詞【錢兔無量】,然後系統會自動回覆抽獎活動的鏈接,點擊進去看提示繼續操作即可。

農曆新的一年開始了,打工的煩心事兒可以稍停,但是學習不能停止!

關於 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】,等著你哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring管理Bean-IOC-05 3.基於註解配置bean 3.3自動裝配 基本說明: 基於註解配置bean,也可以實現自動裝配,使用的註解是:@AutoWired或者@Resource @AutoWired 的規則說明 (1)在IOC容器中查找待裝配的組件的類型,如果有唯一的bean裝配(按 ...
  • 前言 質數歷來都是數學界的寵兒,是數學里神秘的謎團。 質數又和 C 語言有著不解之緣,本篇文章將講解如何用 C 語言判斷質數。 為了方便大家在讀完此文章後使用文中程式,我會將判斷質數的程式封裝成函數,此函數的功能是:判斷形參 _number 是否是質數,若 _number 是質數,則返回 1;若不是 ...
  • 2023-01-21 一、文件下載 1、實現文件下載步驟 (1)準備文件下載相關步驟 (2)將ResponseEntity<T>對象,作為方法返回值 (3)為ResponseEntity<T>對象,設置三個參數 2、示例代碼 @RequestMapping("/fileDownloadControl ...
  • 開心一刻 有一天,qq收到一個好友申請,驗證消息上寫的是:哥哥加我,我是妹妹 我以為是性騷擾,就沒加,直接回了一句:我喜歡少婦 過了一會兒,姑姑就給我打了個電話:你妹妹qq加你,你怎麼不同意,她想問你幾道數學題,你說你喜歡少婦 我:姑姑,你聽我狡辯一下...... 祝大家除夕快樂! 節點準備 基於  ...
  • JavaScript 中的繼承可以通過多種方式來實現,如原型鏈繼承、借用構造函數繼承、組合繼承、ES6 Class繼承等。 ...
  • 兔年到了,祝大家身體健,康萬事順利。本文內容作為兔年新春紀念頁面,將使用 Three.js 及 其他前端開發知識,創建一個以兔子為主題的 3D 簡單的趣味頁面 Rabbit craft go。本文內容包括使用純代碼創建三維浮島、小河、樹木、兔子、胡蘿蔔以及兔子的運動交互、浮島的動畫效果等。本文包含的... ...
  • JavaScript 中的記憶體管理主要由 JavaScript 引擎負責,開發人員不需要手動管理記憶體。JavaScript 引擎使用垃圾回收演算法來實現自動垃圾回收。 JavaScript 垃圾回收演算法是指在 JavaScript 程式中,用來回收不再使用的記憶體的演算法。 ...
  • 使用 CSS 的 box-sizing 屬性 MDN docs 關於box-sizing 一種解決方法是使用 CSS 的 box-sizing 屬性來控制元素的盒模型。預設情況下,盒模型是 "content-box",這意味著元素的寬度和高度只包括其內容,而不包括 padding 和 border。 ...
一周排行
    -Advertisement-
    Play Games
  • 1.部署歷史 猿友們好,作為初來實習的我,已經遭受社會的“毒打”,所以請容許我在下麵環節適當吐槽,3Q! 傳統部署 ​ 回顧以往在伺服器部署webapi項目(非獨立發佈),dotnet環境、守護進程兩個逃都逃不掉,正常情況下還得來個nginx代理。不僅僅這仨,可能牽扯到yum或npm。node等都要 ...
  • 隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,前一篇文章,已經簡單介紹瞭如何搭建開發框架,和登錄功能實現,本篇... ...
  • 這道題只要會自定義cmp恰當地進行排序,其他部分沒有什麼大問題。 上代碼: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,s,h1,h2,cnt; 4 struct apple{ 5 int height,ns;//height為蘋 ...
  • 這篇文章主要描述RPC的路由策略,包括為什麼需要請求隔離,為什麼不在註冊中心中實現請求隔離以及不同粒度的路由策略。 ...
  • 簡介: 中介者模式,屬於行為型的設計模式。用一個中介對象來封裝一系列的對象交互。中介者是各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的交互。 適用場景: 如果平行對象間的依賴複雜,可以使用中介者解耦。 優點: 符合迪米特法則,減少成員間的依賴。 缺點: 不適用於系統出現對 ...
  • 【前置內容】Spring 學習筆記全系列傳送門: Spring學習筆記 - 第一章 - IoC(控制反轉)、IoC容器、Bean的實例化與生命周期、DI(依賴註入) Spring學習筆記 - 第二章 - 註解開發、配置管理第三方Bean、註解管理第三方Bean、Spring 整合 MyBatis 和 ...
  • 簡介: 享元模式,屬於結構型的設計模式。運用共用技術有效地支持大量細粒度的對象。 適用場景: 具有相同抽象但是細節不同的場景中。 優點: 把公共的部分分離為抽象,細節依賴於抽象,符合依賴倒轉原則。 缺點: 增加複雜性。 代碼: //用戶類 class User { private $name; fu ...
  • 這次設計一個通用的多位元組SPI介面模塊,特點如下: 可以設置為1-128位元組的SPI通信模塊 可以修改CPOL、CPHA來進行不同的通信模式 可以設置輸出的時鐘 狀態轉移圖和思路與多位元組串口發送模塊一樣,這裡就不給出了,具體可看該隨筆。 一、模塊代碼 1、需要的模塊 通用8位SPI介面模塊 `tim ...
  • AOP-03 7.AOP-切入表達式 7.1切入表達式的具體使用 1.切入表達式的作用: 通過表達式的方式定義一個或多個具體的連接點。 2.語法細節: (1)切入表達式的語法格式: execution([許可權修飾符] [返回值類型] [簡單類名/全類名] [方法名]([參數列表]) 若目標類、介面與 ...
  • 測試一、虛繼承與繼承的區別 1.1 單個繼承,不帶虛函數 1>class B size(8): 1> + 1> 0 | + (base class A) 1> 0 | | _ia //4B 1> | + 1> 4 | _ib //4B 有兩個int類型數據成員,占8B,基類邏輯存在前面 1.2、單個 ...