學習路線

本章 15 篇筆記依「先會開視窗 → 再放元件 → 最後組成程式」的順序安排:

A 起步  ─── 1 tkinter → 3 版面配置 → 11 ttk 主題元件
                              │
B 基本元件 ─ 2 Label · 4 Button · 5 Entry · 6 messagebox · 9 PhotoImage
                              │
C 選擇元件 ─ 7 Radiobutton · 8 Checkbutton · 13 Combobox
                              │
D 容器表格 ─ 12 Frame / LabelFrame · 14 Treeview
                              │
E 綜合實作 ─ 10 遊戲銷售統計 · 15 學生資料維護系統

建議順序

1 → 3 → 2 → 4 → 5 → 6 這六篇是核心,學完就能做出「輸入資料、按按鈕、跳提示」的完整互動程式。
其餘元件(7、8、9、13)用到再查即可,不必一次讀完。
11 ttk 建議提早看 —— 之後的範例幾乎都用 ttk 版本的元件。


全部筆記一覽

A|起步:視窗與版面

筆記內容關鍵語法
1. tkinter 套件匯入套件、建立主視窗、元件總覽tk.Tk() mainloop() title() geometry()
3. 視窗版面配置元件如何排列與對齊pack() grid() fill expand padx pady
11. ttk 主題元件套件外觀較新的元件版本ttk.Button ttk.Entry ttk.Label

B|基本元件

筆記內容關鍵語法
2. Label 標籤元件顯示文字或圖片tk.Label
4. Button 按鈕元件按鈕與事件觸發tk.Button command=
5. Entry 文字方塊元件單行文字輸入tk.Entry textvariable= StringVar
6. messagebox 對話方塊元件提示、警告、確認對話框showinfo showwarning showerror askyesno
9. Photoimage 圖片元件在視窗中顯示圖片tk.PhotoImage

C|選擇類元件

筆記內容關鍵語法
7. Radiobutton 選項按鈕元件多選一tk.Radiobutton variable= value=
8. Checkbutton 核取按鈕元件可複選tk.Checkbutton BooleanVar
13. Combobox 下拉式選單元件下拉選單ttk.Combobox values= state='readonly'

D|容器與表格

筆記內容關鍵語法
12. Frame 與 LabelFrame 容器元件把元件分組、做出水平排列ttk.Frame ttk.LabelFrame
14. Treeview 清單(表格)元件以表格顯示多筆多欄資料ttk.Treeview heading column insert bind

E|綜合實作

筆記內容搭配技術
10. 遊戲銷售統計輸入銷售量並即時繪製柱狀圖tkinter + matplotlib
15. 學生資料維護系統(綜合實作)完整 CRUD 圖形介面ttk + MySQL,class 封裝

貫穿全章的核心觀念

一、變數類別(Variable Class)

tkinter的元件不直接存值,而是透過變數類別與畫面雙向綁定。這個觀念在第 5、6、7、8、13、15 篇都會用到:

變數類別存放型態常搭配
StringVar()字串EntryComboboxLabel
IntVar()整數RadiobuttonCheckbutton
DoubleVar()浮點數數值輸入
BooleanVar()布林值Checkbutton
var = tk.StringVar()                              # 建立
ttk.Entry(frame, textvariable=var).pack()         # 綁定到元件
var.get()                                         # 畫面 → 程式(讀出)
var.set("預設值")                                  # 程式 → 畫面(填入)

二、事件驅動

視窗程式不是由上往下執行,而是等待事件發生才呼叫對應函式。三種觸發方式:

方式寫法用在
按鈕 commandttk.Button(…, command=self.save)按下按鈕
bind() 綁定tree.bind('<<TreeviewSelect>>', on_select)選取清單、鍵盤、滑鼠
直接呼叫self.refresh()程式自己需要時

⚠️ 全章最常犯的錯: command 後面多加括號

command=self.save      # ✅ 把函式「交給」按鈕,按下才執行
command=self.save()    # ❌ 建立按鈕當下就執行一次,按鈕反而失效

三、容器的層次

元件不是直接放進主視窗,而是先放進容器再組合。這是做出「多欄排列」的關鍵:

主視窗 (tk.Tk)
 └─ LabelFrame(分組外框)
     └─ Frame(每一列)
         └─ Label + Entry + Combobox(水平排列)

若所有元件都直接pack到主視窗,它們只會一個一個往下疊。詳見 12. Frame 與 LabelFrame 容器元件


我想做什麼?(任務導向查找)

我想…看這篇
開一個視窗、設定標題與大小1. tkinter 套件
讓元件並排而不是往下疊3. 視窗版面配置12. Frame 與 LabelFrame 容器元件
讓元件之間留空隙3. 視窗版面配置padxpady
讓元件隨視窗放大3. 視窗版面配置fillexpand
顯示一段文字2. Label 標籤元件
讓使用者輸入文字5. Entry 文字方塊元件
按鈕按下去要做事4. Button 按鈕元件
跳出提示/錯誤/確認視窗6. messagebox 對話方塊元件
多選一(性別、方案)7. Radiobutton 選項按鈕元件
可複選(興趣、配備)8. Checkbutton 核取按鈕元件
下拉選單13. Combobox 下拉式選單元件
顯示圖片9. Photoimage 圖片元件
表格顯示多筆資料14. Treeview 清單(表格)元件
讓外觀比較新11. ttk 主題元件套件
把整個程式組織成類別15. 學生資料維護系統(綜合實作)
資料庫做完整系統15. 學生資料維護系統(綜合實作)
統計圖表10. 遊戲銷售統計

常見錯誤 → 去哪裡找答案

症狀原因看這篇
視窗一閃就關閉忘記root.mainloop()1. tkinter 套件
按鈕一建立就自動執行command=函式() 多加括號4. Button 按鈕元件
元件全部擠成一直排沒用Frame分組,或忘了side='left'12. Frame 與 LabelFrame 容器元件
讀不到使用者輸入的值沒綁textvariable,或忘了.get()5. Entry 文字方塊元件
圖片沒顯示(一片空白)PhotoImage物件被回收9. Photoimage 圖片元件
Treeview 資料越按越多沒先delete()清空就重新insert14. Treeview 清單(表格)元件
清單顯示一堆 None沒用or ''NULL轉空字串15. 學生資料維護系統(綜合實作)
按「修改」沒反應沒先選取,selected_id仍是None15. 學生資料維護系統(綜合實作)
資料改了但畫面沒更新忘記操作後呼叫refresh()15. 學生資料維護系統(綜合實作)

全章重點速記

記住這 8 條

  1. 視窗程式的骨架固定是 tk.Tk() → 建立元件 → mainloop()
  2. command=函式不要加括號,加了就變成立刻執行
  3. 元件要並排必須先包進 Frame,再用side='left'
  4. 讀寫元件的值靠變數類別.get()讀出、.set()填入
  5. ttk 版本外觀較新,新程式優先用 ttk(但messagebox仍在tkinter底下)
  6. Treeview 更新資料要delete()清空再insert()
  7. 刪除等不可逆操作,一定先用 askyesno() 確認
  8. 元件一多就用 class 封裝,元件與狀態都掛在self底下

延伸應用

主題關聯
1. MYSQL 資料庫連線第 15 篇的資料層,含參數化查詢與 CRUD 完整教案
generate_students產生測試資料,可先塞資料再用第 15 篇的程式維護
0. 章節索引視窗程式的資料庫操作與檔案存取都需要例外處理

本章的三支實作程式

程式位置說明
Sales.py第 10 篇內遊戲銷售統計(tkinter + matplotlib)
student_crud.pyassets/ 資料夾學生資料維護系統(ttk + MySQL)
generate_students.pyvault 根目錄產生測試用的學生假資料