Виджет Tkinter Listbox в Python — создание и примеры
Виджет Listbox отображает список однострочных текстовых элементов. Listbox в Python позволяет просматривать элементы и выбирать один или несколько элементов одновременно.
- Создание виджета Tkinter Listbox
- Список элементов
- Выбор режима
- Привязка выбранного события
- Пример виджета Tkinter Listbox
- Добавление полосы прокрутки в список
Создание виджета Tkinter Listbox
Чтобы создать Listbox, используйте класс tk.Listbox следующим образом:
listbox = tk.Listbox(container, listvariable, height)
В этом синтаксисе:
- container является родительским компонентом Listbox.
- listvariable ссылается на объект tkinter.Variable. Подробнее об этом позже.
- height — это количество элементов, которые будут отображаться в списке без прокрутки.
Список элементов
Чтобы заполнить элементы Listbox, сначала создайте объект Variable, который инициализируется списком элементов. Затем вы назначаете этот объект Variable опции listvariable следующим образом:
list_items = tk.Variable(value=items) listbox = tk.Listbox( container, height, listvariable=list_items )
Чтобы добавить, удалить или переупорядочить элементы в списке, вам просто нужно изменить переменную list_items.
Выбор режима
Параметр selectmode определяет, сколько элементов вы можете выбрать и как перетаскивание мыши повлияет на элементы:
- tk.BROWSE – позволяет сделать одиночный выбор. Если выбрать элемент и перетащить его на другую строку, выбор последует за мышью. Это значение по умолчанию.
- tk.EXTENDED – выберите любую смежную группу элементов одновременно, щелкнув первый элемент и перетащив его на последнюю строку.
- tk.SINGLE – позволяет выбрать одну строку и не может перетаскивать ее мышью.
- tk.MULTIPLE – выбрать любое количество строк одновременно. Нажатие на любую строку переключает ее выбор или нет.
Привязка выбранного события
Чтобы выполнить функцию при изменении выбранных элементов, необходимо привязать эту функцию к событию <>:
listbox.bind('<<ListboxSelect>>', callback)
Пример виджета Tkinter Listbox
Следующая программа отображает Listbox, содержащий список языков программирования. Когда вы выбираете один или несколько элементов, программа отображает выбранные элементы в окне сообщения:
import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo # create the root window root = tk.Tk() root.title('Listbox') # create a list box langs =('Java', 'C#', 'C', 'C++', 'Python', 'Go', 'JavaScript', 'PHP', 'Swift') var = tk.Variable(value=langs) listbox = tk.Listbox( root, listvariable=var, height=6, selectmode=tk.EXTENDED ) listbox.pack(expand=True, fill=tk.BOTH) def items_selected(event): # get all selected indices selected_indices = listbox.curselection() # get selected items selected_langs = ",".join([listbox.get(i) for i in selected_indices]) msg = f'You selected: {selected_langs}' showinfo(title='Information', message=msg) listbox.bind('<<ListboxSelect>>', items_selected) root.mainloop()
Выход:
Как это работает.
Сначала создайте переменную, содержащую список языков программирования:
langs =('Java', 'C#', 'C', 'C++', 'Python', 'Go', 'JavaScript', 'PHP', 'Swift') var = tk.Variables(value=langs)
Во-вторых, создайте новый виджет Listbox и назначьте объект var переменной list:
listbox = tk.Listbox( root, listvariable=var, height=6, selectmode=tk.EXTENDED )
height показывает шесть языков программирования без прокрутки. Selectmode=tk.EXTENDED позволяет множественный выбор.
- В-третьих, определите функцию, которая будет вызываться при выборе одного или нескольких элементов. Функция items_selected() показывает список выбранных в данный момент элементов списка:
def items_selected(event): # get all selected indices selected_indices = listbox.curselection() # get selected items selected_langs = ",".join([listbox.get(i) for i in selected_indices]) msg = f'You selected: {selected_langs}' showinfo(title='Information', message=msg)
- Наконец, свяжите функцию items_selected с событием ‘<>’:
listbox.bind('<<ListboxSelect>>', items_selected)
Добавление полосы прокрутки в список
Следующая программа иллюстрирует, как добавить полосу прокрутки в список:
import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo # create the root window root = tk.Tk() root.title('Listbox') # create a list box langs =('Java', 'C#', 'C', 'C++', 'Python', 'Go', 'JavaScript', 'PHP', 'Swift') var = tk.Variable(value=langs) listbox = tk.Listbox( root, listvariable=var, height=6, selectmode=tk.EXTENDED) listbox.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) # link a scrollbar to a list scrollbar = ttk.Scrollbar( root, orient=tk.VERTICAL, command=listbox.yview ) listbox['yscrollcommand'] = scrollbar.set scrollbar.pack(side=tk.LEFT, expand=True, fill=tk.Y) def items_selected(event): # get selected indices selected_indices = listbox.curselection() # get selected items selected_langs = ",".join([listbox.get(i) for i in selected_indices]) msg = f'You selected: {selected_langs}' showinfo(title='Information', message=msg) listbox.bind('<<ListboxSelect>>', items_selected) root.mainloop()
Выход:
Дополнительную информацию о том, как привязать полосу прокрутки к прокручиваемому виджету, можно найти в руководстве по виджету scrollbar.