[Python教學] Tkinter:專案實戰與程式最佳化 - 從學習到應用

更新於 發佈於 閱讀時間約 11 分鐘

嘿,大家好!走到這一步,我們已經玩過 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()

跑起來,是不是有個像樣的介面?輸入框放任務,清單框秀出來,兩個按鈕負責加和刪。接下來讓它動起來!

raw-image



功能實作

我們來加點邏輯,讓按鈕真的會做事:

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()

試試看!輸入「買牛奶」,按「新增」,任務就跑進清單;選中任務,按「刪除」就消失。沒輸入或沒選任務,還會跳提醒。

raw-image


  • 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)

跑跑看,按鈕和輸入框會變得更現代風,感覺高級了一點點!

raw-image



3. 錯誤處理:別讓程式掛掉

現在已經有基本的防呆,但可以再加點保護,比如視窗關閉時提醒:

def on_closing(self):
if messagebox.askokcancel("離開", "確定要走嗎?任務會不見喔!"):
self.window.destroy()

# 在 __init__ 最後加這行
self.window.protocol("WM_DELETE_WINDOW", self.on_closing)

關視窗時會跳提醒,點「確定」才真的關,這樣就不會不小心丟掉任務。

raw-image



小挑戰:升級你的 To-Do List

試著改進這個專案,加點功能:

  1. 加個「清空全部」按鈕,一鍵清掉所有任務(記得加確認提醒)。
  2. 加個「完成」按鈕,為選中的任務加個完成狀態。
  3. 美化一下,按鈕用 ttk,視窗背景改成淺灰色(bg="lightgray")。

跑跑看,感覺自己是不是越來越像個高手了?

raw-image



結語

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


留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
9會員
144內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/10
嘿,大家好!到目前為止,我們已經能讓視窗動起來,還能抓資料、處理按鈕點擊,感覺有點像回事了吧?不過,單靠標籤、按鈕、輸入框有點單調,今天我們要來玩點進階的東西,像是勾選框、選單、下拉清單這些,讓你的應用更有「專業感」。
2025/04/10
嘿,大家好!到目前為止,我們已經能讓視窗動起來,還能抓資料、處理按鈕點擊,感覺有點像回事了吧?不過,單靠標籤、按鈕、輸入框有點單調,今天我們要來玩點進階的東西,像是勾選框、選單、下拉清單這些,讓你的應用更有「專業感」。
看更多
你可能也想看
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
如果你也是從事軟體相關工作的人,一定會遭遇突然需要你去學習一套你不熟悉的程式語言狀況吧,此時你會怎麼做呢? 是趕快去買書來看嗎? 還是趕快找一門程式課來上? 又或者乾脆去找會的同事來教學?
Thumbnail
如果你也是從事軟體相關工作的人,一定會遭遇突然需要你去學習一套你不熟悉的程式語言狀況吧,此時你會怎麼做呢? 是趕快去買書來看嗎? 還是趕快找一門程式課來上? 又或者乾脆去找會的同事來教學?
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
本文總結和介紹了Kotlin的基本語法、註解和變數的使用,透過實例進行講解,以幫助讀者更好地理解和快速上手Kotlin語言。
Thumbnail
本文總結和介紹了Kotlin的基本語法、註解和變數的使用,透過實例進行講解,以幫助讀者更好地理解和快速上手Kotlin語言。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
本文將介紹如何從頭開始建立一個Django專案,包括安裝和設定,以及創建管理員帳戶和新的app。透過本文,你可以學習到建立自己的網頁的所有步驟和設定。
Thumbnail
本文將介紹如何從頭開始建立一個Django專案,包括安裝和設定,以及創建管理員帳戶和新的app。透過本文,你可以學習到建立自己的網頁的所有步驟和設定。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News