Виджет Listbox в Tkinter

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

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

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

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

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

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

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

Ниже приводится пример программы, иллюстрирующей применение методов 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. В первом будет, например, перечень товаров, заданный программно. Второй изначально пуст, пусть это будет перечень покупок. При клике на одну кнопку товар должен переходить из одного списка в другой. При клике на вторую кнопку – возвращаться (человек передумал покупать). Предусмотрите возможность множественного выбора элементов списка и их перемещения.

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


Tkinter. Программирование GUI на Python




Все разделы сайта