Виджет Tkinter Combobox в Python и пример выпадающего списка
Виджет Tkinter combobox в Python позволяет пользователям выбирать одно значение из набора значений.
- Знакомство с виджетом Tkinter Combobox
- Создание выпадающего списка
- Определение списка значений
- Как связать события
- Установка текущего значения
- Пример выпадающего списка Tkinter в Python
Знакомство с виджетом Tkinter Combobox
Combobox — это комбинация виджета Entry и виджета Listbox. Виджет combobox позволяет выбрать одно значение из набора значений. Кроме того, он позволяет ввести пользовательское значение.
Создание выпадающего списка
Чтобы создать виджет combobox, вы будете использовать конструктор ttk.Combobox(). Следующий пример создает виджет combobox и связывает его со строковой переменной:
current_var = tk.StringVar() combobox = ttk.Combobox(container, textvariable=current_var)
- container — это окно или рамка, в которую вы хотите поместить виджет выпадающего списка.
- Аргумент textvariable связывает переменную current_var с текущим значением выпадающего списка.
Чтобы получить текущее выбранное значение, можно использовать переменную current_var:
current_value = current_var.get()
В качестве альтернативы вы можете использовать метод get() объекта combobox:
current_value = combobox.get()
Чтобы установить текущее значение, используйте переменную current_var или метод set() объекта combobox:
current_value.set(new_value) combobox.set(new_value)
Определение списка значений
У выпадающего списка есть свойство values, которому можно присвоить список значений следующим образом:
combobox['values'] =('value1', 'value2', 'value3')
По умолчанию вы можете ввести пользовательское значение в выпадающем списке. Если вы этого не хотите, вы можете установить опцию состояния на «readonly»:
combobox['state'] = 'readonly'
Чтобы снова включить редактирование выпадающего списка, используйте состояние «normal» следующим образом:
combobox['state'] = 'normal'
Как связать события
При изменении выбранного значения виджет combobox генерирует виртуальное событие ‘<>’. Для обработки события можно использовать метод bind() следующим образом:
combobox.bind('<<ComboboxSelected>>', callback)
В этом примере функция обратного вызова будет выполняться при изменении выбранного значения в выпадающем списке.
Установка текущего значения
Чтобы установить текущее значение, используйте метод set():
combobox.set(self, value)
Также вы можете использовать метод current():
current(self, newindex=None)
newindex указывает индекс значений из списка, которые вы хотите выбрать в качестве текущего значения.
Если не указать newindex, метод current() вернет индекс текущего значения в списке значений или -1, если текущее значение отсутствует в списке.
Пример выпадающего списка Tkinter в Python
Следующая программа иллюстрирует, как создать виджет Combobox:
import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo from calendar import month_name root = tk.Tk() # config the root window root.geometry('300x200') root.resizable(False, False) root.title('Combobox Widget') # label label = ttk.Label(text="Please select a month:") label.pack(fill=tk.X, padx=5, pady=5) # create a combobox selected_month = tk.StringVar() month_cb = ttk.Combobox(root, textvariable=selected_month) # get first 3 letters of every month name month_cb['values'] = [month_name[m][0:3] for m in range(1, 13)] # prevent typing a value month_cb['state'] = 'readonly' # place the widget month_cb.pack(fill=tk.X, padx=5, pady=5) # bind the selected value changes def month_changed(event): """ handle the month changed event """ showinfo( title='Result', message=f'You selected {selected_month.get()}!' ) month_cb.bind('<<ComboboxSelected>>', month_changed) root.mainloop()
Выход:
Следующая программа показывает тот же виджет со списком месяцев и использует метод set() для установки текущего значения на текущий месяц:
import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo from calendar import month_name from datetime import datetime root = tk.Tk() # config the root window root.geometry('300x200') root.resizable(False, False) root.title('Combobox Widget') # label label = ttk.Label(text="Please select a month:") label.pack(fill=tk.X, padx=5, pady=5) # create a combobox selected_month = tk.StringVar() month_cb = ttk.Combobox(root, textvariable=selected_month) # get first 3 letters of every month name month_cb['values'] = [month_name[m][0:3] for m in range(1, 13)] # prevent typing a value month_cb['state'] = 'readonly' # place the widget month_cb.pack(fill=tk.X, padx=5, pady=5) # bind the selected value changes def month_changed(event): """ handle the month changed event """ showinfo( title='Result', message=f'You selected {selected_month.get()}!' ) month_cb.bind('<<ComboboxSelected>>', month_changed) # set the current month current_month = datetime.now().strftime('%b') month_cb.set(current_month) root.mainloop()