Виджет Tkinter Listbox в Python — создание и примеры

Виджет Listbox отображает список однострочных текстовых элементов. Listbox в Python позволяет просматривать элементы и выбирать один или несколько элементов одновременно.

Содержание

Создание виджета 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()

Выход:

Пример Tkinter Listbox со списком языков программирования

Как это работает.

Сначала создайте переменную, содержащую список языков программирования:

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.

Похожие посты
Добавить комментарий

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