Виджет 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-версия