От класса Listbox создаются списки – виджеты, внутри которых в столбик перечисляются элементы. При этом можно выбирать один или множество элементов списка.
В Tkinter сначала создается экземпляр Listbox, после этого он заполняется с помощью метода insert.
Первым аргументом в insert передается индекс места, куда будет вставлен элемент. Если нужно вставлять в конец списка, то индекс обозначают константой END. Вторым аргументом передается вставляемый элемент.
По-умолчанию в Listbox, кликая мышкой, можно выбирать только один элемент. Если необходимо обеспечить множественный выбор, то для свойства selectmode можно установить значение EXTENDED. В этом режиме можно выбрать сколь угодно элементов, зажав Ctrl или Shift.
Если для Listbox необходим скроллер, то он настраивается также как для текстового поля. В программу добавляется виджет Scrollbar и связывается с экземпляром Listbox.
С помощью метода get из списка можно получить один элемент по индексу, или срез, если указать два индекса. Метод delete удаляет один элемент или срез.
Метод curselection позволяет получить в виде кортежа индексы выбранных элементов экземпляра Listbox.o
Ниже приводится пример программы, иллюстрирующей применение методов get, insert, delete и curselection класса Listbox. Первая кнопка добавляет введенную пользователем в текстовое поле строку в список, вторая кнопка удаляет выбранные элементы из списка, третья – сохраняет список в файл.

from tkinter import *
def add_item():
box.insert(END, entry.get())
entry.delete(0, END)
def del_list():
select = list(box.curselection())
select.reverse()
for i in select:
box.delete(i)
def save_list():
f = open('list000.txt', 'w')
f.writelines("\n".join(box.get(0, END)))
f.close()
root = Tk()
box = Listbox(selectmode=EXTENDED)
box.pack(side=LEFT)
scroll = Scrollbar(command=box.yview)
scroll.pack(side=LEFT, fill=Y)
box.config(yscrollcommand=scroll.set)
f = Frame()
f.pack(side=LEFT, padx=10)
entry = Entry(f)
entry.pack(anchor=N)
Button(f, text="Add", command=add_item)\
.pack(fill=X)
Button(f, text="Delete", command=del_list)\
.pack(fill=X)
Button(f, text="Save", command=save_list)\
.pack(fill=X)
root.mainloop()
В функции del_list кортеж выбранных элементов превращается в список, после чего выполняется его реверс, т. е. переворот. Это делается для того, чтобы удаление элементов происходило с конца списка. Иначе программа бы неверно работала, так как удаление элемента приводило бы к изменению индексов всех следующих за ним. Если же удалять с конца, то индексы впереди стоящих не меняются.
Метод curselection возвращает кортеж. Кортежи не имеют метода reverse, поэтому мы преобразуем его в список.
В функции save_list кортеж строк-элементов, который вернул метод get, преобразуется в одну строку с помощью строкового метода join через разделитель '\n'. Это делается для того, чтобы элементы списка записались в файл столбиком.
Listbox – достаточно сложный виджет. Кроме рассмотренных он обладает другими методами, а также множеством свойств.
Практическая работа
Напишите программу, состоящую из двух списков Listbox. В первом будет, например, перечень товаров, заданный программно. Второй изначально пуст, пусть это будет перечень покупок. При клике на одну кнопку товар должен переходить из одного списка в другой. При клике на вторую кнопку – возвращаться (человек передумал покупать). Предусмотрите возможность множественного выбора элементов списка и их перемещения.

Источник: https://younglinux.info/