Виджет Listbox

От класса Listbox создаются списки – виджеты, внутри которых в столбик перечисляются элементы. При этом можно выбирать один или множество элементов списка.

В Tkinter сначала создается экземпляр Listbox, после этого он заполняется с помощью метода insert().

Listbox

Первым аргументом в insert() передается индекс места, куда будет вставлен элемент. Если нужно вставлять в конец списка, то индекс обозначают константой END. Вторым аргументом передается вставляемый элемент.

По-умолчанию в Listbox, кликая мышкой, можно выбирать только один элемент. Если необходимо обеспечить множественный выбор, то для свойства selectmode можно установить значение EXTENDED. В этом режиме можно выбрать сколь угодно элементов, зажав Ctrl или Shift.

Если для Listbox необходим скроллер, то он настраивается также как для текстового поля. В программу добавляется виджет Scrollbar и связывается с экземпляром Listbox.

С помощью метода get() из списка можно получить один элемент по индексу, или срез, если указать два индекса. Метод delete() удаляет один элемент или срез.

Метод curselection() позволяет получить в виде кортежа индексы выбранных элементов экземпляра Listbox.

Ниже приводится пример программы, иллюстрирующей применение методов get(), insert(), delete() и curselection() класса Listbox. Первая кнопка добавляет введенную пользователем в текстовое поле строку в список, вторая кнопка удаляет выбранные элементы из списка, третья – сохраняет список в файл.

Методы Listbox

from tkinter import *
 
def addItem():
    lbox.insert(END, entry.get())
    entry.delete(0, END)
 
def delList():
    select = list(lbox.curselection())
    select.reverse()
    for i in select:
        lbox.delete(i)
 
def saveList():
    f = open('list000.txt', 'w')
    f.writelines("\n".join(lbox.get(0, END)))
    f.close()
 
root = Tk()
 
lbox = Listbox(selectmode=EXTENDED)
lbox.pack(side=LEFT)
scroll = Scrollbar(command=lbox.yview)
scroll.pack(side=LEFT, fill=Y)
lbox.config(yscrollcommand=scroll.set)
 
f = Frame()
f.pack(side=LEFT, padx=10)
entry = Entry(f)
entry.pack(anchor=N)
badd = Button(f, text="Add", command=addItem)
badd.pack(fill=X)
bdel = Button(f, text="Delete", command=delList)
bdel.pack(fill=X)
bsave = Button(f, text="Save", command=saveList)
bsave.pack(fill=X)
 
root.mainloop()

В функции delList() кортеж выбранных элементов превращается в список, после чего выполняется его реверс, т. е. переворот. Это делается для того, чтобы удаление элементов происходило с конца списка. Иначе программа бы неверно работала, так как удаление элемента приводило бы к изменению индексов всех следующих за ним. Если же удалять с конца, то индексы впереди стоящих не меняются.

В функции saveList() кортеж строк-элементов, который вернул метод get(), преобразуется в одну строку с помощью строкового метода join() через разделитель '\n'. Это делается для того, чтобы элементы списка записались в файл столбиком.

Listbox – достаточно сложный виджет. Кроме рассмотренных он обладает другими методами, а также множеством свойств.

Практическая работа

Напишите программу, состоящую из двух списков Listbox. В первом будет, например, перечень товаров, заданный программно. Второй изначально пуст, пусть это будет перечень покупок. При клике на одну кнопку товар должен переходить из одного списка в другой. При клике на вторую кнопку – возвращаться (человек передумал покупать). Предусмотрите возможность множественного выбора элементов списка и их перемещения.

Пример использования списка

Курс с примерами решений практических работ: android-приложение, pdf-версия.

Создано

Обновлено