嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
實戰專案:打造待辦事項清單
我們的目標是做一個簡單的 To-Do List,能加任務、刪任務,還能秀出所有任務。聽起來很實用對吧?我們一步步來!基本架構
先搭個視窗,丟進需要的元件:
import tkinter as tk
from tkinter import messagebox
# 開視窗
window = tk.Tk()
window.title("待辦事項清單")
window.geometry("400x500")
# 標籤
tk.Label(window, text="新增任務:").grid(row=0, column=0, padx=5, pady=5)
# 輸入框
entry = tk.Entry(window, width=30)
entry.grid(row=0, column=1, padx=5, pady=5)
# 清單框
listbox = tk.Listbox(window, height=20, width=40)
listbox.grid(row=1, column=0, columnspan=2, padx=5, pady=5)
# 按鈕區
tk.Button(window, text="新增").grid(row=2, column=0, pady=5)
tk.Button(window, text="刪除").grid(row=2, column=1, pady=5)
window.mainloop()
跑起來,是不是有個像樣的介面?輸入框放任務,清單框秀出來,兩個按鈕負責加和刪。接下來讓它動起來!

功能實作
我們來加點邏輯,讓按鈕真的會做事:
import tkinter as tk
from tkinter import messagebox
def add_task():
task = entry.get().strip() # 抓輸入並去掉多餘空白
if task:
listbox.insert(tk.END, task) # 加到清單尾巴
entry.delete(0, tk.END) # 清空輸入框
else:
messagebox.showwarning("警告", "你沒輸入任務啦!")
def delete_task():
try:
index = listbox.curselection()[0] # 抓選中的索引
listbox.delete(index) # 刪掉它
except IndexError:
messagebox.showwarning("警告", "請先選一個任務!")
# 開視窗
window = tk.Tk()
window.title("待辦事項清單")
window.geometry("400x500")
# 標籤
tk.Label(window, text="新增任務:").grid(row=0, column=0, padx=5, pady=5)
# 輸入框
entry = tk.Entry(window, width=30)
entry.grid(row=0, column=1, padx=5, pady=5)
# 清單框
listbox = tk.Listbox(window, height=20, width=40)
listbox.grid(row=1, column=0, columnspan=2, padx=5, pady=5)
# 按鈕
tk.Button(window, text="新增", command=add_task).grid(row=2, column=0, pady=5)
tk.Button(window, text="刪除", command=delete_task).grid(row=2, column=1, pady=5)
window.mainloop()
試試看!輸入「買牛奶」,按「新增」,任務就跑進清單;選中任務,按「刪除」就消失。沒輸入或沒選任務,還會跳提醒。

strip()
:去掉輸入前後的空白,避免亂七八糟的任務。delete(0, tk.END)
:清空輸入框,方便下次用。curselection()
:抓清單框選中的東西,沒選會丟IndexError
,我們用 try-except 接住。
程式最佳化:讓程式更順眼
這個 To-Do List 已經能用,但我們可以讓它更好。來聊幾個實用的技巧:
1. 模組化:把功能拆開
把所有東西塞在一起很亂,我們可以用類(class)包起來:
import tkinter as tk
from tkinter import messagebox
class TodoApp:
def __init__(self, window):
self.window = window
self.window.title("待辦事項清單")
self.window.geometry("400x500")
# 標籤
tk.Label(self.window, text="新增任務:").grid(row=0, column=0, padx=5, pady=5)
# 輸入框
self.entry = tk.Entry(self.window, width=30)
self.entry.grid(row=0, column=1, padx=5, pady=5)
# 清單框
self.listbox = tk.Listbox(self.window, height=20, width=40)
self.listbox.grid(row=1, column=0, columnspan=2, padx=5, pady=5)
# 按鈕
tk.Button(self.window, text="新增", command=self.add_task).grid(row=2, column=0, pady=5)
tk.Button(self.window, text="刪除", command=self.delete_task).grid(row=2, column=1, pady=5)
def add_task(self):
task = self.entry.get().strip()
if task:
self.listbox.insert(tk.END, task)
self.entry.delete(0, tk.END)
else:
messagebox.showwarning("警告", "你沒輸入任務啦!")
def delete_task(self):
try:
index = self.listbox.curselection()[0]
self.listbox.delete(index)
except IndexError:
messagebox.showwarning("警告", "請先選一個任務!")
# 啟動程式
window = tk.Tk()
app = TodoApp(window)
window.mainloop()
用 class 包起來,邏輯清楚多了,之後加功能也方便。
self
:把元件綁到 class 裡,隨時都能用。
2. 美化介面:用 ttk
Tkinter 預設樣式有點老氣,我們可以用 ttk 讓它現代一點:
from tkinter import ttk # 導入 ttk
# ... (其他程式碼一樣)
# 用 ttk 的元件取代
tk.Label(self.window, text="新增任務:").grid(row=0, column=0, padx=5, pady=5)
self.entry = ttk.Entry(self.window, width=30) # ttk.Entry
self.listbox = tk.Listbox(self.window, height=20, width=40) # Listbox 沒 ttk 版,用原本的
ttk.Button(self.window, text="新增", command=self.add_task).grid(row=2, column=0, pady=5)
ttk.Button(self.window, text="刪除", command=self.delete_task).grid(row=2, column=1, pady=5)
跑跑看,按鈕和輸入框會變得更現代風,感覺高級了一點點!

3. 錯誤處理:別讓程式掛掉
現在已經有基本的防呆,但可以再加點保護,比如視窗關閉時提醒:
def on_closing(self):
if messagebox.askokcancel("離開", "確定要走嗎?任務會不見喔!"):
self.window.destroy()
# 在 __init__ 最後加這行
self.window.protocol("WM_DELETE_WINDOW", self.on_closing)
關視窗時會跳提醒,點「確定」才真的關,這樣就不會不小心丟掉任務。

小挑戰:升級你的 To-Do List
試著改進這個專案,加點功能:
- 加個「清空全部」按鈕,一鍵清掉所有任務(記得加確認提醒)。
- 加個「完成」按鈕,為選中的任務加個完成狀態。
- 美化一下,按鈕用 ttk,視窗背景改成淺灰色(
bg="lightgray"
)。
跑跑看,感覺自己是不是越來越像個高手了?

結語
今天我們從零到有,做出一個實用的 To-Do List,還學了怎麼把程式寫得乾淨又漂亮。怎麼樣,覺得 Tkinter 越來越好玩了吧?這篇是實戰篇,之後你可以自己試著做些小工具,像記事本、計算器之類的,我們下次可以再聊聊其他專案的實作或進階玩法!