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

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

最終季來了,快來追更!這篇文章屬於系列文章《Python 內置界面開發框架 Tkinter入門篇》的第四篇,也是最後一篇了。 ...


如需要轉載,請聲明原文鏈接 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/X5cqennLrq7i1pzBAAqQ2w

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

​這篇文章屬於系列文章《Python 內置界面開發框架 Tkinter入門篇》的第四篇,也是最後一篇,上接《Python 內置界面開發框架 Tkinter入門篇 丙》,歡迎關註我的微信公眾號「ENG八戒」查看這個系列相關文章,也可以翻到文章底部查看整個系列的文章集合。

實現一個簡單的記事本應用

前面說了這麼多,用句流行語來概括就是 「散裝知識點」。為了串聯起來有個全面的體會,下麵讓我們一起來實現一個簡單的記事本程式吧!

產品定義

作為一個產品的開發來看的話,我們需要清楚地知道自己到底想要的產品是長什麼樣子,然後才是實現的過程。

我們打算做一個基本的記事本,它可以點擊按鍵打開 TXT 格式的文本文件,把文件內容讀取出來顯示在編輯區,然後在編輯區修改了文件內容後,又可以點擊其它按鍵把編輯區的內容另存為其它文本文件。

按照上面的功能需求定義,就可以給記事本定個草圖啦,長這樣

可以看到,它需要先有個主視窗

import tkinter as tk

window = tk.Tk()
window.mainloop()

然後,應該有個標題欄,上面顯示有軟體名稱 「記事本」

import tkinter as tk

window = tk.Tk()
window.title("記事本")
window.mainloop()

從草圖來看,它還需要功能按鈕區域和文本編輯區,可以使用 grid 佈局管理器來劃分區域。總體可以劃分為 1 行 2 列,第 1 列是功能按鈕區域,第 2 列是文本編輯區;第 1 行第 1 列也就是功能按鈕區域,又可以劃分為 2 行 1 列,第 1 行是按鈕打開,第 2 行是按鈕另存。

好了,這就是我們這個產品的初步定義。

UI實現

對界面佈局做好劃分之後,就開始添加控制項代碼了

import tkinter as tk

window = tk.Tk()
window.title("記事本")

btn_frame = tk.Frame(
    master=window,
    bd=2
    )
btn_open = tk.Button(
    master=btn_frame,
    text="打開"
    )
btn_save_as = tk.Button(
    master=btn_frame,
    text="另存"
    )

btn_open.grid(row=0, column=0)
btn_save_as.grid(row=1, column=0)
btn_frame.grid(row=0, column=0)

txt_edit = tk.Text(master=window)
txt_edit.grid(row=0, column=1)

window.mainloop()

顯示是這樣

看起來已經和草圖很接近了,不過按鈕的佈局還是需要調整,位置應該處於所屬列的頂部,而且按鈕太靠邊了。還有,窗體在拉伸之後,控制項也沒有跟隨變化。這幾個問題怎麼修複呢?

為了將按鈕置頂,可以對控制項 btn_frame 應用上下拉滿,sticky 設為 "ns"。

而按鈕太靠邊,可以通過修改填充屬性 padding,比如 padx=5, pady=5 讓控制項的邊框收縮 5 個像素,保持距離感。

而編輯框控制項沒有跟隨窗體一起拉伸,是因為控制項 txt_edit 還需要設置所有邊框靠著邊界,比如 sticky 設為 "nsew" 即可。

看看修改後的代碼

import tkinter as tk

window = tk.Tk()
window.title("記事本")

window.rowconfigure(
    0,
    minsize=100,
    weight=1
    )
window.columnconfigure(
    1,
    minsize=100,
    weight=1
    )

btn_frame = tk.Frame(
    master=window,
    bd=2
    )
btn_open = tk.Button(
    master=btn_frame,
    text="打開"
    )
btn_save_as = tk.Button(
    master=btn_frame,
    text="另存"
    )

btn_open.grid(
    row=0,
    column=0,
    sticky="ew",
    padx=5,
    pady=5
    )
btn_save_as.grid(
    row=1,
    column=0,
    sticky="ew",
    padx=5
    )
btn_frame.grid(
    row=0,
    column=0,
    sticky="ns"
    )

txt_edit = tk.Text(master=window)
txt_edit.grid(
    row=0,
    column=1,
    sticky="nsew"
    )

window.mainloop()

跑起來試一下

OK ! UI 界面視覺效果達到預期了。

邏輯功能

下一步就是補充邏輯功能,讓記事本能讀寫文本文件。

先看怎麼實現打開邏輯。

理一下思路: 點擊按鈕「打開」,程式就會彈出選取文件的視窗,選中文件後點擊確定就返回選中的文件路徑,然後按照文件路徑把文件內容讀取出來並且顯示到編輯框中。另外,為了讓用戶知道最終顯示的內容來自哪個文件,所以可以把文件路徑添加到視窗的標題欄最前面。看怎麼修改代碼

...

def open_file():
    file_path = filedialog.askopenfilename(
        filetypes=[
            ("Text files", "*.txt"),
            ("All files", "*.*")
            ]
    )
    if not file_path:
        window.title("無標題 - 記事本")
        return
    window.title(f"{file_path} - 記事本")
    txt_edit.delete("1.0",
                    tk.END)
    with open(
        file_path,
        mode="r",
        encoding="utf-8") as input_file:
        txt_edit.insert(
            tk.END,
            input_file.read()
            )

...

btn_open = tk.Button(
    master=btn_frame,
    text="打開",
    command=open_file
    )

...

上面代碼的修改點是添加了一個響應函數 open_file,這個函數用於打開文本文件並讀取文件內容顯示,然後在實例化按鈕控制項 btn_open 時,把響應函數 open_file 賦值給參數 command 即可。

為了測試記事本的顯示文本內容功能,我們先手動在桌面創建一個文本文件 test.txt,然後輸入內容並保存

這是測試文本文件
...

運行一下程式,然後點擊「打開」按鈕,選中剛剛創建的文件 test.txt 並打開

可見讀取文本內容的目標功能基本達成,再看怎麼實現另存邏輯。

理一下思路: 點擊按鈕「另存」,程式就會彈出選擇保存文件的路徑的視窗,選中路徑後點擊確定就返回選中的路徑,然後按照路徑把編輯框中的內容保存為文件。另存後,視窗標題欄也需要相應改變。看怎麼修改代碼

...

def save_as_file():
    file_path = filedialog.asksaveasfilename(
        defaultextension=".txt",
        filetypes=[
            ("Text files", "*.txt"),
            ("All files", "*.*")
            ]
    )
    if not file_path:
        return
    with open(
        file_path,
        mode="w",
        encoding="utf-8") as output_file:
        output_file.write(txt_edit.get("1.0",
                                        tk.END))
    window.title(f"{file_path} - 記事本")

...

btn_save_as = tk.Button(
    master=btn_frame,
    text="另存",
    command=save_as_file
    )

...

上面代碼的修改點是添加了一個響應函數 save_as_file,這個函數用於選擇另存文件位置並把編輯框內容寫入指定位置文件,然後在實例化按鈕控制項 btn_save_as 時,把響應函數 save_as_file 賦值給參數 command 即可。

為了測試記事本的文件另存功能,我們先用我們最新修改的記事本程式打開上面手動創建的文本文件 test.txt,然後在編輯框把內容修改一下

點擊「另存」按鈕,彈出「另存為」文件視窗,找到保存位置並輸入新文件名 test_save_as.txt,最後點擊「保存」。

另存完畢後,視窗標題內容變成了新文件路徑。

好了,一個簡單的記事本程式就這樣完成了。希望上面的內容能打開你的思路!

打包部署

關於 python 輸出獨立可執行應用的介紹,其實和用什麼 GUI 框架無關,可直接參考一下我的另一篇文章《Python:界面開發,wx入門篇》里的相關介紹。


由於篇幅受限,系列文章《Python 內置界面開發框架 Tkinter入門篇》分成了下麵幾個部分,有興趣的朋友可點擊跳轉查閱

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

《Python 內置界面開發框架 Tkinter入門篇 乙》

《Python 內置界面開發框架 Tkinter入門篇 丙》

《Python 內置界面開發框架 Tkinter入門篇 丁》


如需要完整示例代碼,可前往 github 倉庫獲取: [email protected]:ifi-leung/python_gui_tkinter.git


這裡預告一下,本公眾號 ENG八戒 的薦書活動馬上來臨,為了鼓勵大家多讀書,所以會有免費送圖書的名額哦!


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

-Advertisement-
Play Games
更多相關文章
  • 直接上重點。 如果是定位不准,Web瀏覽器端, 1,要使用者必須要做個人認證或者企業認證,且通過審核。 2,請求的網頁必須是https協議。 3,請求的功能變數名稱必須是加入到應用的Referer白名單。進入到應用設置里查看。 4,申請的應用類型必須是瀏覽器端。且必須勾選對應的服務。 有時申請地圖服務的人和 ...
  • ?. 和 ?? 是 JavaScript 中的兩個新操作符,分別是可選鏈操作符(optional chaining operator)和空值合併操作符(nullish coalescing operator)。 ?. 操作符 ?. 可選鏈操作符用於訪問可能為空或未定義的屬性或方法,它允許我們安全地訪 ...
  • 問題復現: 正常狀態下: 切換到其他頁面再切換回來: 問題解決: 其實這個問題的解決方式官網寫得清清楚楚,我們看看官網怎麼解決的: 接下來我用代碼解釋下這句話(正確的做法是,在圖表容器被銷毀之後,調用 echartsInstance.dispose 銷毀實例,在圖表容器重新被添加後再次調用 echa ...
  • 本文內容主要彙總如何在 Three.js 創建的 3D 世界中添加物理效果,使其更加真實。所謂物理效果指的是對象會有重力,它們可以相互碰撞,施加力之後可以移動,而且通過鉸鏈和滑塊還可以在移動過程中在對象上施加約束。 通過本文的閱讀,你將學習到如何使用 Cannon.js 在 Three.js 中創建... ...
  • <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ...
  • 公司去年對 CDN 資源伺服器進行了遷移,由原來的通過 FTP 方式的文件存儲改為了使用 S3 協議上傳的對象存儲,部門內 @柴俊堃 同學開發了一個命令行腳本工具 RapidTrans(睿傳),使用睿傳可以很方便將本地目錄下的資源上傳到 S3 中。 睿傳運行時接收兩個主要參數,一個為待上傳的本地路... ...
  • 有時,我們經常會在資料庫伺服器上做一些定時備份的工作,最常用的方法就是寫個sh腳本,然後配置/etc/crontab定時策略即可,但它有缺點,我總結如下: 腳本基本相同,代碼需要在每個數據伺服器上部署 由於代碼是分佈的,並且是個代碼,所以管理不清晰,不直觀 控制不統一,你需要在每個伺服器的/etc/ ...
  • 所謂線程就是操作系統(OS)能夠進行運算調度的最小單位,是一個基本的CPU執行單元,也是執行程式流的最小單元。能夠提高OS的併發性能,減小程式在併發執行時所付出的時空開銷。線程是進程的一個實體,是被系統獨立調度和分派的基本單位。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...