Python 內置界面開發框架 Tkinter入門篇 丙(文末有福利彩蛋,今天可是元宵節)

来源:https://www.cnblogs.com/englyf/archive/2023/02/06/17094290.html
-Advertisement-
Play Games

以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/B1hH5Qzd2RkAiiUId1tLWw 本文大概 2874 個字,閱讀需花 10 分鐘 內容不多,但也花了一些精力 如要交流,歡迎關註我然後評論區留言 謝謝你的點 ...


以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/B1hH5Qzd2RkAiiUId1tLWw

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

進入正文之前先說一件小事,本公眾號已改名為【ENG八戒】,原名是【englyf】。改名的理由是什麼?以後會告訴朋友們的!

另外文末有福利彩蛋,畢竟今天是元宵節!


這篇文章屬於系列文章《Python 內置界面開發框架 Tkinter入門篇》的第三篇,上接《Python 內置界面開發框架 Tkinter入門篇 乙》,歡迎關註我的微信公眾號「ENG八戒」查看這個系列相關文章。

界面佈局

關於 Tkinter 框架的 GUI 佈局,其實官方沒有提供對應的圖形化工具可用,但是網上有一些開源的小工具可以使用。這裡不打算介紹這些小工具的使用,而是直接用框架提供的幾何圖形管理器來佈局,比如上面提到過的 pack() 就是其中一種。這裡提到的幾何圖形管理器也就是其它框架里常說的佈局管理器。

Tkinter 框架提供的佈局管理器有:pack、grid、place 三種。每一個控制項只可以使用一種佈局管理器,不同控制項使用的佈局管理器可以不一樣。

pack

形象點說, pack 就是把控制項包裝在一個矩形區域,這個區域大小足夠放置控制項,而且預設置中。pack 是最簡單的佈局管理器,也稱之為包裝佈局。

直接試一試用 pack 來佈局三個靜態標簽 Label,預設設置(pack() 傳入參數為空)

import tkinter as tk

window = tk.Tk()
lbl_1 = tk.Label(
    master=window,
    text="label 1",
    fg="black",
    bg="red",
    width=10,
    height=5
    )
lbl_1.pack()
lbl_2 = tk.Label(
    master=window,
    text="label 2",
    fg="black",
    bg="yellow",
    width=10,
    height=5
    )
lbl_2.pack()
lbl_3 = tk.Label(
    master=window,
    text="label 3",
    fg="black",
    bg="blue",
    width=10,
    height=5
    )
lbl_3.pack()
window.mainloop()

看看顯示效果

可以看到,預設 pack 會在父視窗 window 中垂直方向按順序包裝排列這三個靜態標簽 Label。

那麼,如果我需要讓這幾個標簽水平排列呢?可以這樣子改

lbl_1.pack(side=tk.LEFT)
...
lbl_2.pack(side=tk.LEFT)
...
lbl_3.pack(side=tk.LEFT)

看看顯示效果

pack(side=tk.TOP) 和預設設置等價。

簡單彙總介紹一下其它的參數

參數 賦值 說明
after 控制項 widget 將此控制項包裝在控制項 widget 後邊
anchor NSEW (or subset) 根據方向定位此控制項,NSEW 表示北南東西四個方向
before 控制項 widget 將此控制項包裝在控制項 widget 前邊
expand bool 類型值 跟著父控制項一起伸縮
fill NONE、X、Y、BOTH 選擇當控制項伸縮時按照哪個方向填充
ipadx amount 在x方向添加內部填充
ipady amount 在y方向添加內部填充
padx amount 在x方向添加填充
pady amount 在y方向添加填充
side TOP、BOTTOM、LEFT、RIGHT 把控制項往哪邊添加

很多時候開發界面都需要讓裡邊的控制項跟隨視窗自動拉伸大小,來看一下上面的代碼應該怎麼改

lbl_1.pack(fill=tk.BOTH, expand=tk.TRUE)
...
lbl_2.pack(fill=tk.BOTH, expand=tk.TRUE)
...
lbl_3.pack(fill=tk.BOTH, expand=tk.TRUE)

啟動的時候,還沒有拉伸視窗

然後拉伸看看

grid

如名字表述,grid 會把父視窗劃分成行列,然後根據調用時傳入參數 row,column 確定把控制項放置在對應的行列中。grid 也稱之為格子佈局。

還是以靜態標簽為例,創建 3x3 的矩陣標簽。為了凸顯各個標簽的邊界,這裡還需要添加 Frame 控制項,每個標簽放置於單獨的 Frame 中。

import tkinter as tk

window = tk.Tk()

for i in range(3):
    for j in range(3):
        frame = tk.Frame(
            master=window,
            relief=tk.RAISED,
            borderwidth=1
        )
        frame.grid(row=i, column=j)
        label = tk.Label(
            master=frame,
            text=f"Row {i}\nColumn {j}"
            )
        label.pack()

window.mainloop()

可以看到,上面這個例子佈局時,只有 Frame 才需要應用 grid 管理器,因為每個標簽和 Frame 一一對應,所以標簽不需要重覆應用格子佈局。

看看顯示效果

簡單彙總介紹一下其它的參數

參數 賦值 說明
column 列序號 指定放置的列,從0開始
columnspan 列數 放置的控制項橫跨多少列
ipadx amount 在 x 方向添加內部填充
ipady amount 在 y 方向添加內部填充
padx amount 在 x 方向添加外部填充
pady amount 在 y 方向添加外部填充
row 行序號 指定放置的行,從0開始
rowspan number 放置的控制項橫跨多少行
sticky NSEW 如果單元格比較大,那麼控制項的指定邊界將貼著單元格。NSEW分別對應頂部、底部、右邊、左邊邊界

細心的朋友會發現,一旦拉伸上面的那個矩陣標簽視窗,視窗界面就會露出部分底面,矩陣標簽沒有跟隨一起拉伸。

這樣明顯和我們的預期不符合,這個問題怎麼解決呢?

可以調用父視窗的 columnconfigure() 和 rowconfigure() 方法配置各列和行的伸縮比。這兩個方法都有三個輸入參數,看下麵的表格

參數 說明
index 序號,指定特定的行或列,可以是單個行列序號值,也可以是代表多個行或列的列表
weight 伸縮權重
minsize 最小寬度值

現在來看看怎麼改,才能讓矩陣標簽跟隨父視窗一起拉伸?

import tkinter as tk

window = tk.Tk()

for i in range(3):
    window.rowconfigure(i, weight=1)
    window.columnconfigure(i, weight=1)

    for j in range(3):
        frame = tk.Frame(
            master=window,
            relief=tk.RAISED,
            borderwidth=1
        )
        frame.grid(row=i, column=j)
        label = tk.Label(
            master=frame,
            text=f"Row {i}\nColumn {j}"
            )
        label.pack()

window.mainloop()

看看拉伸之後的顯示效果

perfect!另外需要提一下,grid 具有 pack 能做的所有功能,但是使用的形式更簡單,因此應該作為更優先的佈局管理器。

place

place 用於對控制項精確定位的場合。使用的時候需要傳入參數 x 和 y 分別用於指定控制項的放置位置坐標值 x 和 y,傳入的 x 和 y 是基於父控制項的左上角為原點的坐標系,單位是像素點。

大多數界面應用里,控制項都不需要精確的定位。但是某些,比如地圖應用里,就的確需要對元素的精確定位了。

下麵舉個慄子,在視窗里不同位置放置各一個標簽

import tkinter as tk

window = tk.Tk()

label1 = tk.Label(
    master=window,
    text="place (0, 0)",
    bg="yellow"
    )
label1.place(x=0, y=0)

label2 = tk.Label(
    master=window,
    text="place (40, 40)",
    bg="blue"
    )
label2.place(x=40, y=40)

window.mainloop()

看看上面代碼的顯示效果

說回來,place 的參數xy單位是像素,那麼在不同的系統下,字體類型和大小都是不同的,那麼被放置的控制項就有可能超出視窗邊界。因此 place 真的不常用,關於 place 進一步的信息就不再展開了。

交互

上面介紹的內容都僅限於 Tkinter 界面的可視化設計,那麼現在是時候介紹一下Tkinter 界面和用戶的互動了。

比如,Tkinter 界面對於事件的響應是怎麼發生的?

一般,在 Tkinter 中通過預先綁定事件和響應處理函數,每當事件發生時,主視窗的 mainloop 就會收到事件,然後根據綁定信息,查找到響應處理函數並調用,來達到交互的效果。綁定的通用方法是調用各個控制項的 bind()。

比如,下麵我們來實現一個簡單的鍵盤響應互動,每次按鍵按下時就把對應的按鍵列印出來

import tkinter as tk

def handle_keypress(event):
    print(event.char)

window = tk.Tk()
window.bind("<Key>", handle_keypress)
window.mainloop()

上面的代碼沒有添加額外的控制項,除了有個空白的主視窗。其中,對主視窗 window 綁定了按鍵事件 Key 和處理函數 handle_keypress。

調用 bind() 最少要求輸入兩個參數,一個是形式為 "<event_name>" 的事件,另一個是事件處理函數。

定義處理函數 handle_keypress 時,唯一做的事情是把傳入的事件字元列印到標準終端。

每當按下鍵盤的按鍵,命令行終端就會輸出對應的按鍵。

但是,對於按鈕 Button 來說,點擊事件的觸發處理可以不需要使用 bind(),僅需要在實例化控制項 Button 時,傳入處理函數給 command 參數即可,初始化過程會自動綁定 click 事件的響應。

上代碼看看

import tkinter as tk

def handle_keypress():
    print("clicked")

window = tk.Tk()
button = tk.Button(
    master=window,
    text="click me!",
    command=handle_keypress
    )
button.pack()
window.mainloop()

運行程式

用滑鼠點擊一下界面上的按鈕,發現終端會輸出字元串 clicked


由於篇幅受限,本系列教程還未完結,下一篇《Python 內置界面開發框架 Tkinter入門篇 丁》將在本公眾號稍後推送,如果你對此教程有興趣或者想和我一起交流更多精彩內容,歡迎關註我的微信公眾號 【ENG八戒】,等著你哦!

《元宵彩蛋》

鬧元宵了,《八戒陪你一起鬧元宵2023


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

-Advertisement-
Play Games
更多相關文章
  • 一、最終效果 遠程開機app下載: 下載鏈接:https://wwp.lanzoup.com/iDR330ml4l2b 提取碼 : dxcg 註意:使用前請按照2.1的步驟設置電腦“ mac地址:填寫自己的mac地址 主機地址:填寫自己的公網ip,百度搜索ip 映射埠:第二點準備工作裡面配置的映射 ...
  • 背景 REST作為一種現代網路應用非常流行的軟體架構風格,自從Roy Fielding博士在2000年他的博士論文中提出來到現在已經有了20年的歷史。它的簡單易用性,可擴展性,伸縮性受到廣大Web開發者的喜愛。 REST 的 API 配合JSON格式的數據交換,使得前後端分離、數據交互變得非常容易, ...
  • 為了方便操作apk 實現app的自動化點擊 封裝了個adb操作類。基本上的操作都有了, 如果配合好C# 程式和模擬器 基本上什麼樣的操作都可以實現。 using System; using System.Collections; using System.Collections.Generic; u ...
  • 在種草了很多天之後,最近終於在淘寶下單了友善 nanoPi R5S。 選擇友善 nanoPi R5S 有兩點主要理由: 1. 自帶 EMMC 存儲,可以使用 RockChip 提供的 MaskRom 模式直接連線燒系統,不依賴 TF 卡(我覺得 TF 卡太累贅了,買普通的又慢又不穩定,對於我這種新手 ...
  • Docker部署SpringBoot項目 前言: 以前幾次在雲伺服器上部署項目都是手動打包,安裝mysql等環境最後再部署運行,相對比較麻煩而且加上網上各種教程質量層次不齊,如果過程中出錯的話排查問題對於新人來說已經夠喝一壺了。(我自己第一次手動裝mysql8.0就出過問題,最後找不到問題所在只能推 ...
  • Git for Windows 的 Bash 有一個很實用的功能,如果當前目錄處於 Git 倉庫中,那麼命令行中會顯示當前 Git 分支的名稱(見下圖)。 然而原版的 MSYS2 Bash 沒有這個功能(見下圖),不過我們可以自己動手配置出相同的效果。 配置方法 打開 MSYS2 的家目錄,找到 . ...
  • 一:背景 1. 講故事 上一篇寫完 SQLSERVER 的四個事務隔離級別到底怎麼理解? 之後,有朋友留言問什麼時候可以把 snapshot 隔離級別給補上,這篇就來安排,快照隔離級別看起來很魔法,不過在修車之前,得先看下怎麼開車。 二:snapshot 隔離詳解 1. snapshot 之前的困境 ...
  • 洛谷oj題單【入門2】分支結構-入門難度(Java) 來源:https://www.luogu.com.cn/training/101#problems P5709 【深基2.習6】Apples Prologue / 蘋果和蟲子 import java.util.Scanner; public cl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...