當某個欄位的值只能限定在幾個固定選項裡(例如性別只能是F或M、縣市只能是台灣的幾個城市),若用〈7. Radiobutton 選項按鈕元件〉逐一列出每個選項,選項一多畫面就會被占滿;這種情況更適合使用Combobox下拉式選單,把所有選項收合在一個下拉清單裡,使用者點開後選取其中一項即可,比較省版面。Combobox是ttk模組提供的元件(tkinter本身沒有),建立語法如下:
物件變數 = ttk.Combobox(容器物件, [參數1=值1, 參數2=值2, …, 參數n=值n])常用參數
| 參數 | 說明 |
|---|---|
values | 設定下拉清單中的選項內容,型別為串列(list),例如values=['F', 'M']。 |
textvariable | 代表下拉選單目前選取值的物件,用法與Entry的textvariable相同,須先用tkinter模組的StringVar()等方法定義變數,再透過var.get()取得目前選取的值,var.set(值)可用程式指定選取的值。可參考〈5. Entry 文字方塊元件〉。 |
width | 設定下拉選單的寬度。 |
state | 設定下拉選單的狀態,預設值'normal'表示使用者除了下拉選取,也可以自行在欄位中輸入文字;設為'readonly'表示唯讀,使用者只能從values清單中挑選,無法自行輸入其他字串(常用於避免使用者輸入不在允許範圍內的值,例如資料庫欄位限定只能存ENUM('F','M')時)。 |
當Combobox綁定了textvariable之後,除了透過變數的get()/set()存取目前選取值,元件本身也提供對應的get()/set()方法可以直接使用,兩種寫法效果相同:
vSex = var_sex.get() # 透過變數取得目前選取值
vSex = cboSex.get() # 或直接呼叫 Combobox 物件的 get()[簡例] 建立城市下拉選單,預設選取台北市,選取後按下[確定]鈕以對話方塊顯示選取的城市。(檔名:combobox01.py)
程式碼:
combobox01.pyimport tkinter as tk from tkinter import ttk, messagebox def fnOk(): messagebox.showinfo('選取結果', f'你選取的城市是:{city.get()}') win = tk.Tk() win.title('Combobox 範例') win.geometry('260x100') lblCity = ttk.Label(win, text='居住城市:') lblCity.pack(side='left', padx=10, pady=20) city = tk.StringVar(value='台北市') cboCity = ttk.Combobox(win, textvariable=city, values=['台北市', '新北市', '台中市', '台南市', '高雄市'], width=10, state='readonly') cboCity.pack(side='left') btnOk = ttk.Button(win, text='確定', command=fnOk) btnOk.pack(side='left', padx=10) win.mainloop()
[結果]
(可自行執行程式碼查看畫面:下拉選單預設顯示「台北市」,點開後可選取其他四個城市。)
說明
- 第
14行:建立city這個tk.StringVar()物件,並在建立時透過value='台北市'指定預設選取值。- 第
15~18行:建立cboCity下拉選單,values指定五個城市選項,textvariable=city把選單與city變數綁定,state='readonly'限制使用者只能從清單中選取,不能自行輸入其他文字。- 第
4~5行:定義fnOk()函式,用city.get()取得目前選取的城市並顯示於對話方塊。
在 student_crud.py 的應用
student_crud.py的_build_form()方法中,「性別」欄位就是用Combobox限定只能選F或M,對應資料表cSex欄位為ENUM('F','M')的設計:
self.var_sex = tk.StringVar(value='F')
ttk.Combobox(row0, textvariable=self.var_sex, values=['F', 'M'], width=5, state='readonly').pack(side='left', padx=5)因為資料庫欄位限定只能存'F'或'M',所以用state='readonly'避免使用者透過鍵盤輸入這兩個值以外的文字,寫入資料庫時觸發錯誤。
相關主題與延伸閱讀
- 0. 章節索引:本章全部筆記的學習地圖與快速查找。
- 1. tkinter 套件:
tkinter套件的整體介紹與元件總覽。 - 11. ttk 主題元件套件:
Combobox是ttk模組獨有、tkinter本身沒有的元件。 - 7. Radiobutton 選項按鈕元件:選項較少時可用
Radiobutton逐一列出,選項較多時則適合改用Combobox收合為下拉清單。 - 5. Entry 文字方塊元件:
textvariable參數用法與Entry相同,皆需搭配StringVar()等變數物件。 - 12. Frame 與 LabelFrame 容器元件:
student_crud.py表單中Combobox即放置於容器元件內。