Виджет Combobox представляет выпадающий список, из которого пользователь может выбрать один элемент. Фактически он представляет комбинацию виджетов Entry и Listbox.
Основные параметры конструктора Combobox:
values: список строк для отображения в Combobox
background: фоновый цвет
cursor: курсор указателя мыши при наведении на текстовое поле
foreground: цвет текста
font: шрифт текста
justify: устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю
show: задает маску для вводимых символов
state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
textvariable: устанавливает привязку к элементу StringVar
height: высота элемента
width: ширина элемента
Определим простейший выпадающий список:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
languages = ["Python", "C#", "Java", "JavaScript"]
combobox = ttk.Combobox(values=languages)
combobox.pack(anchor=NW, padx=6, pady=6)
root.mainloop()
Здесь для элемента combobox в качестве источника значений устанавливается список languages:
С помощью параметра textvariable мы можем установить привязку к выбранному в Combobox значению:
from cProfile import label
from cgitb import text
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
languages = ["Python", "C#", "Java", "JavaScript"]
# по умолчанию будет выбран первый элемент из languages
languages_var = StringVar(value=languages[0])
label = ttk.Label(textvariable=languages_var)
label.pack(anchor=NW, padx=6, pady=6)
combobox = ttk.Combobox(textvariable=languages_var, values=languages)
combobox.pack(anchor=NW, padx=6, pady=6)
print(combobox.get())
root.mainloop()
Здесь выбранный в Combobox элемент привязан к переменной languages_var. По умолчанию выбран первый элемент списка languages. Для отслеживания изменения выбора определена метка Label, которая отображает выбранный элемент:
По умолчанию мы можем ввести в текстовое поле в Combobox любое значение, даже то, которого нет в списке. Такое поведение не всегда может быть удобно. В этом случае мы можем установить для виджета состояние только для чтения, передав параметру "state" значение "readonly":
combobox = ttk.Combobox(textvariable=languages_var, values=languages, state="readonly")
Выбранный элемент можно получить с помощью метода get() класса Combobox
selection = combobox.get()
либо с помощью метода get() привязанной переменной
selection = languages_var.get()
Для установки нового значения можно использовать метод set():
languages_var.set(new_value) combobox.set(new_value)
Для установки по индексу из привязанного набора значений также можно использовать метод current(newindex),
где с помощью параметра newindex задается индекс выбранного значения. Например, выберем второй элемент:
combobox.current(1)
Для обработки выбора элементов в Combobox необходимо прикрепить функцию обработки к событию <<ComboboxSelect>> с помощью метода bind:
combobox.bind("<<ComboboxSelected>>", функция_обработки)
Например, динамически обработаем выбор в Combobox:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
def selected(event):
# получаем выделенный элемент
selection = combobox.get()
print(selection)
label["text"] = f"вы выбрали: {selection}"
languages = ["Python", "C#", "Java", "JavaScript"]
label = ttk.Label()
label.pack(anchor=NW, fill=X, padx=5, pady=5)
combobox = ttk.Combobox(values=languages, state="readonly")
combobox.pack(anchor=NW, fill=X, padx=5, pady=5)
combobox.bind("<<ComboboxSelected>>", selected)
root.mainloop()
В данном случае при изменении выбора в списке срабатывает функция selected. Функция должна принимать один параметр, который несет информацию о событии -
здесь это параметр event. Хотя в данном случае он никак не используется.
В самой функции получаем выбранный элемент и выводит соответствующую информацию на метку Label.