Appearance
Listbox - текстовый список
Listbox создает списки – виджеты, внутри которых, в столбик перечисляются элементы. При этом можно выбирать один или множество элементов списка.
В tkinter сначала создается экземпляр Listbox(), после этого он заполняется с помощью метода insert():
py
from tkinter import *
from tkinter.ttk import * # строка окрашена в серый цвет. Это означает, что модуль не используется
root = Tk()
lbox = Listbox()
lbox.pack()
lbox.insert(END, 1)
lbox.insert(END, 2)
lbox.insert(END, 3)
root.mainloop()Первым аргументом в insert() передается индекс места, куда будет вставлен элемент. Если нужно вставлять в конец списка, то индекс обозначают константой END. Вторым аргументом передается вставляемый элемент.
Listbox and Scrollbar - Текстовый список с полосой прокрутки
Если для Listbox необходима перемотка, то в программу добавляется виджет Scrollbar и связывается с экземпляром Listbox.
py
from tkinter import *
from tkinter.ttk import *
root = Tk()
lbox = Listbox()
lbox.pack(side=LEFT, expand=1, fill=BOTH)
scroll = Scrollbar(command=lbox.yview)
scroll.pack(side=LEFT, fill=Y)
lbox.config(yscrollcommand=scroll.set)
for i in range(20):
lbox.insert(END, f"{i} next line")
root.mainloop()Если сделать растяжение Listbox(), по ширине окна то приложение может иметь следующий вид:
Для создания перемотки необходимо его создать:
py
scroll = Scrollbar(command=lbox.yview)
scroll.pack(side=LEFT, fill=Y)
lbox.config(yscrollcommand=scroll.set)Параметры:
command=lbox.yview- указывает, что связь c переменнойlboxбудет по оси Y, и привязывает управление перемоткой к перемотке листаlbox;yscrollcommand=scroll.set- задает пропорцию размера перемотки к длине листа.
Методы Listbox
Listbox имеет следующие методы:
delete(startindex [, endindex])- метод удаляет один элемент или срез.get(startindex [, endindex])- можно получить один элемент по индексу, или срез, если указать два индекса.curselection()- позволяет получить в виде кортежа индексы выбранных элементов экземпляраListbox().insert(index [,string]...)- метод вставляет строки в указанное место списка.
По-умолчанию в Listbox(), кликая мышкой, можно выбирать только один элемент. Если необходимо обеспечить множественный выбор, то можно установить значение Listbox(selectmode=EXTENDED). В этом режиме можно выбрать элементы, зажав Ctrl или Shift.
Ниже приводится пример программы. Первая кнопка добавляет введенную пользователем в текстовое поле строку в список, вторая кнопка удаляет выбранные элементы из списка, третья – считывает данные из виджета и печатает их в консоль:
py
from tkinter import *
from tkinter.ttk import *
def add_item():
lbox.insert(END, entry.get())
entry.delete(0, END)
def del_list():
select = list(lbox.curselection())
select.reverse()
for i in select:
lbox.delete(i)
def print_list():
print(lbox.get(0, END))
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)
Button(f, text="Add", command=add_item).pack(fill=X)
Button(f, text="Delete", command=del_list).pack(fill=X)
Button(f, text="Print", command=print_list).pack(fill=X)
root.mainloop()Результат выполнения кода:

В функции del_list() кортеж выбранных элементов превращается в список, после чего выполняется его реверс, т. е. переворот. Это делается для того, чтобы удаление элементов происходило с конца списка. Иначе программа бы неверно работала, так как удаление элемента приводило бы к изменению индексов всех следующих за ним. Если же удалять с конца, то индексы впереди стоящих не меняются.
В функции print_list() кортеж строк-элементов, который вернул метод get(), печатается в консоли.
Listbox – достаточно сложный виджет. Кроме рассмотренных он обладает другими методами, а также множеством свойств.
Упражнения
Напишите программу состоящую из
ListBox()и кнопки. При нажатии на кнопку в листе добавляется случайная цифра в диапазоне от -100 до 100.Напишите программу состоящую из
ListBox()c полосой прокрутки и кнопки. При нажатии на кнопку в листе добавляется список из 3-х цифр от -50 до 50.Напишите программу состоящую из
ListBox()c полосой прокрутки и кнопки. При нажатии на кнопку в листе добавляется цифра, при каждом следующем нажатии новая добавляющаяся цифра увеличивает свое значение на 5 относительно предыдущей цифры.Напишите программу состоящую из
ListBox()c полосой прокрутки,Text(), кнопки "Add elements", "Print to console" и "Print to Text()":- при нажатии на кнопку "Add elements" - ListBox() заполняется элементами списка: ['a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt'];
- при нажатии на кнопку "Print to console" - в консоль печатаются все элементы списка из ListBox();
- при нажатии на кнопку "Print to Text()" - в
Text()печатаются все элементы списка из ListBox().

Вывод в консоль может быть следующим:
py('a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt', 'a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt')Напишите программу состоящую из
ListBox()c полосой прокрутки,Text()и кнопок: "Add elements", "Print elements","Print the first element" и "Print the last element":- при нажатии на кнопку "Add elements" - ListBox() заполняется элементами списка: ['a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt'];
- при нажатии на кнопку "Print elements" - в
Text()печатаются все элементы списка из ListBox(); - при нажатии на кнопку "Print the first element" - в
Text()печатается первый элемент из ListBox(); - при нажатии на кнопку "Print the last element" - в
Text()печатается последний элемент из ListBox().

Напишите программу состоящую из
ListBox()c полосой прокрутки и кнопок: "Add elements", "Delete elements","Delete the first element" и "Delete the last element":- при нажатии на кнопку "Add elements" - ListBox() заполняется элементами списка: ['a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt'];
- при нажатии на кнопку "Delete elements" - удаляются все элементы списка из ListBox();
- при нажатии на кнопку "Delete the first element" - удаляется первый элемент из ListBox();
- при нажатии на кнопку "Delete the last element" - удаляется последний элемент из ListBox().
Напишите программу состоящую из
ListBox()c полосой прокрутки,Text()и кнопок: "Add elements", "Print an index element" и "Print the selected element":- при нажатии на кнопку "Add elements" - ListBox() заполняется элементами списка: ['a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt'];
- при нажатии на кнопку "Print an index element" - в
Text()печатается индекс выделенного элемента списка из ListBox(); - при нажатии на кнопку "Print the selected element" - в
Text()печатается выбранный элемент. Добавьте проверку, если элемент не выбран программа не должна выдавать ошибку.

Напишите программу состоящую из
ListBox()c полосой прокрутки,Text()и кнопок: "Add elements", "Print the element" и "Delete the element":- при нажатии на кнопку "Add elements" - ListBox() заполняется элементами списка: ['a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt'];
- при нажатии на кнопку "Print the element" - в
Text()печатается индекс и значение выделенного элемента списка из ListBox(); - при нажатии на кнопку "Delete the element" - удаляется выбранный элемент из ListBox();
- Добавьте необходимы проверки, если элемент не выбран, что бы программа не вызывала ошибок.

Напишите программу состоящую из
ListBox(selectmode=EXTENDED)c полосой прокрутки,Text()и кнопок: "Add elements", "Print the selected elements" и "Delete the seleсted elements":- при нажатии на кнопку "Add elements" - ListBox() заполняется элементами списка: ['a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt'];
- при нажатии на кнопку "Print the selected elements" - в
Text()печатаются индексы и значения выделенных элементов из ListBox(); - при нажатии на кнопку "Delete the seleсted elements" - удаляются выбранные элементы из ListBox();
- Добавьте необходимы проверки, если элемент не выбран, что бы программа не вызывала ошибок.

Напишите программу состоящую из поля ввода, кнопки и
ListBox()c полосой прокрутки. При нажатии на кнопку:- в лист добавляется строка, напечатанная в поле ввода;
- после добавления поле ввода очищается.
- строки добавляются без лишних пробелов, не начинались и не заканчивались пробелами;
- Добавьте необходимы проверки, что бы программа не вызывала ошибок.
Напишите программу, состоящую из двух списков
Listbox()c полосой прокрутки. В первом будет, например, перечень товаров, заданный программно. Второй изначально пуст, пусть это будет перечень покупок. При клике на одну кнопку товар должен переходить из одного списка в другой. При клике на вторую кнопку – возвращаться (человек передумал покупать). Предусмотрите возможность множественного выбора элементов списка и их перемещения.Написать программу с двумя
ListBox()c полосой прокрутки иText(). Добавить список записей в обаListBox(). Реализовать:- кнопки
>>>и<<<премещают выбранные элементы списка между правым и левымListbox(); - кнопки
Up to 1иDown to 3премещают выбранные элементы списка между левымListbox()и нижнимText(); - кнопки
Up to 2иDown to 3премещают выбранные элементы списка между правымListbox()и нижнимText().

- кнопки