如需要轉載,請宣告原文鏈接 微信公眾號「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八戒 的薦書活動馬上來臨,為了鼓勵大家多讀書,所以會有免費送圖書的名額哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543978.html
標籤:Python
