Виджет Tkinter Combobox в Python и пример выпадающего списка

Виджет Tkinter combobox в 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()

Выход:

Пример создания виджета Combobox

Следующая программа показывает тот же виджет со списком месяцев и использует метод 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()
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *