博客 / 詳情

返回

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

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

本文大概 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 倉庫獲取: git@github.com:ifi-leung/python_gui_tkinter.git


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

user avatar devil_5931bede13754 頭像 juqipeng 頭像 u_16213335 頭像 wangyaxi 頭像 yutou_5c10e66caa840 頭像
5 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.