嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、開檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
專案目標
我們的記事本預計會實做以下功能:- 文字區:可以打字的地方,像個大輸入框。
- 選單:有「檔案」(存檔、開檔、離開)和「格式」(調字體大小)。
- 儲存與開啟:把寫的東西存成檔案,或開舊檔案繼續編輯。
- 簡單美化:用點 ttk 讓它看起來不那麼陽春。
基本架構:搭個視窗
先把視窗和主要元件放進去:
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
class NotepadApp:
def __init__(self, window):
self.window = window
self.window.title("簡單記事本")
self.window.geometry("600x400")
# 文字區
self.text = tk.Text(self.window, wrap="word", font=("微軟正黑體", 12))
self.text.pack(expand=True, fill="both", padx=10, pady=10)
# 選單列
self.menu_bar = tk.Menu(self.window)
self.window.config(menu=self.menu_bar)
# 檔案選單
file_menu = tk.Menu(self.menu_bar, tearoff=0)
self.menu_bar.add_cascade(label="檔案", menu=file_menu)
file_menu.add_command(label="開啟", command=self.open_file)
file_menu.add_command(label="儲存", command=self.save_file)
file_menu.add_separator()
file_menu.add_command(label="離開", command=self.quit)
# 格式選單
format_menu = tk.Menu(self.menu_bar, tearoff=0)
self.menu_bar.add_cascade(label="格式", menu=format_menu)
format_menu.add_command(label="字體大小", command=self.change_font_size)
def open_file(self):
pass # 先留空,等等填
def save_file(self):
pass
def change_font_size(self):
pass
def quit(self):
pass
# 啟動程式
window = tk.Tk()
app = NotepadApp(window)
window.mainloop()
跑一下看看!有個視窗,裡面是大大的文字區,上面有「檔案」和「格式」選單,點下去還沒反應,因為功能還沒寫。

- tk.Text:這是大輸入框,比 Entry 強,能多行編輯,wrap="word" 讓換行更自然。
- pack(expand=True, fill="both"):讓文字區填滿視窗,隨視窗大小調整。
功能實作:讓它動起來
現在來填滿那些空函式,讓記事本真的能用!
1. 儲存檔案
點「儲存」時,跳出檔案對話框,讓你選地方存:
def save_file(self):
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("文字檔案", "*.txt"), ("所有檔案", "*.*")]
)
if file_path:
try:
with open(file_path, "w", encoding="utf-8") as file:
file.write(self.text.get("1.0", tk.END).strip())
self.window.title(f"簡單記事本 - {file_path}")
except Exception as e:
messagebox.showerror("錯誤", f"儲存失敗!{e}")

- filedialog.asksaveasfilename:跳出儲存對話框,選檔案路徑。
- self.text.get("1.0", tk.END):從第一行第一個字(1.0)抓到最後,strip() 去掉多餘換行。
- 更新標題顯示檔案路徑,讓你知道存檔在哪裡。
2. 開啟檔案
點「開啟」時,選檔案讀進文字區:
def open_file(self):
file_path = filedialog.askopenfilename(
filetypes=[("文字檔案", "*.txt"), ("所有檔案", "*.*")]
)
if file_path:
try:
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
self.text.delete("1.0", tk.END) # 清空文字區
self.text.insert("1.0", content) # 放進新內容
self.window.title(f"簡單記事本 - {file_path}")
except Exception as e:
messagebox.showerror("錯誤", f"開啟失敗!{e}")

- filedialog.askopenfilename:選檔案的對話框。
- delete 和 insert:清空再填入,保持乾淨。
3. 調整字體大小
點「字體大小」時,跳個小視窗讓你選:
def change_font_size(self):
size_window = tk.Toplevel(self.window) # 跳出小視窗
size_window.title("字體大小")
size_window.geometry("200x100")
tk.Label(size_window, text="選個大小:").pack(pady=5)
size_var = tk.IntVar(value=12) # 預設 12
ttk.Spinbox(size_window, from_=8, to=30, textvariable=size_var).pack(pady=5)
def apply_size():
new_size = size_var.get()
self.text.config(font=("微軟正黑體", new_size))
size_window.destroy()
ttk.Button(size_window, text="確定", command=apply_size).pack(pady=5)

- Toplevel:跳出獨立小視窗,不影響主視窗。
- Spinbox:數字選擇器,範圍 8 到 30。
- config(font=...):動態改文字區字體。
4. 離開前提醒
關視窗前先做確認,避免寫好的訊息沒有存檔到:
def quit(self):
if messagebox.askokcancel("離開", "確定要關嗎?沒存的會不見喔!"):
self.window.destroy()
# 在 __init__ 最後加這行
self.window.protocol("WM_DELETE_WINDOW", self.quit)

完整程式碼
把上面的教學全部合起來,完成我們的記事本:
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
class NotepadApp:
def __init__(self, window):
self.window = window
self.window.title("簡單記事本")
self.window.geometry("600x400")
# 文字區
self.text = tk.Text(self.window, wrap="word", font=("微軟正黑體", 12))
self.text.pack(expand=True, fill="both", padx=10, pady=10)
# 選單列
self.menu_bar = tk.Menu(self.window)
self.window.config(menu=self.menu_bar)
# 檔案選單
file_menu = tk.Menu(self.menu_bar, tearoff=0)
self.menu_bar.add_cascade(label="檔案", menu=file_menu)
file_menu.add_command(label="開啟", command=self.open_file)
file_menu.add_command(label="儲存", command=self.save_file)
file_menu.add_separator()
file_menu.add_command(label="離開", command=self.quit)
# 格式選單
format_menu = tk.Menu(self.menu_bar, tearoff=0)
self.menu_bar.add_cascade(label="格式", menu=format_menu)
format_menu.add_command(label="字體大小", command=self.change_font_size)
# 關閉提醒
self.window.protocol("WM_DELETE_WINDOW", self.quit)
def save_file(self):
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("文字檔案", "*.txt"), ("所有檔案", "*.*")]
)
if file_path:
try:
with open(file_path, "w", encoding="utf-8") as file:
file.write(self.text.get("1.0", tk.END).strip())
self.window.title(f"簡單記事本 - {file_path}")
except Exception as e:
messagebox.showerror("錯誤", f"儲存失敗!{e}")
def open_file(self):
file_path = filedialog.askopenfilename(
filetypes=[("文字檔案", "*.txt"), ("所有檔案", "*.*")]
)
if file_path:
try:
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
self.text.delete("1.0", tk.END)
self.text.insert("1.0", content)
self.window.title(f"簡單記事本 - {file_path}")
except Exception as e:
messagebox.showerror("錯誤", f"開啟失敗!{e}")
def change_font_size(self):
size_window = tk.Toplevel(self.window)
size_window.title("字體大小")
size_window.geometry("200x100")
tk.Label(size_window, text="選個大小:").pack(pady=5)
size_var = tk.IntVar(value=12)
ttk.Spinbox(size_window, from_=8, to=30, textvariable=size_var).pack(pady=5)
def apply_size():
new_size = size_var.get()
self.text.config(font=("微軟正黑體", new_size))
size_window.destroy()
ttk.Button(size_window, text="確定", command=apply_size).pack(pady=5)
def quit(self):
if messagebox.askokcancel("離開", "確定要關嗎?沒存的會不見喔!"):
self.window.destroy()
# 啟動程式
window = tk.Tk()
app = NotepadApp(window)
window.mainloop()
跑跑看!寫點東西,存個檔案,再開回來看看,字體大小也能調,是不是超有成就感?
小挑戰:升級你的記事本
課後小挑戰,試試對記事本做以下升級:
- 加個「新建」選項,清空文字區並重設標題。
- 在文字區右邊加滾動條(用 Scrollbar)。
- 加個「關於」選項,點下去跳出你的名字和版本號(像「by 你的大名, v1.0」)。

這篇小結
今天我們從零打造了一個簡單記事本,能存檔能讀檔,還能調字體,已經很像個實用的工具了吧?怎麼樣,覺得 Tkinter 的潛力有沒有被你挖出來?這篇結束後,可以自己試著做些其他的小專案,像計算器、畫板之類的!