Listbox - текстовый список

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

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

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()
1
2
3
4
5
6
7
8
9
10
11
12

listbox01

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

Listbox and Scrollbar - Текстовый список с полосой прокрутки

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

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Если сделать растяжение Listbox(), по ширине окна то приложение может иметь следующий вид:

listbox_scroll_01

Для создания перемотки необходимо его создать:

scroll = Scrollbar(command=lbox.yview)
scroll.pack(side=LEFT, fill=Y)
lbox.config(yscrollcommand=scroll.set)
1
2
3

Параметры:

  • 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.

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

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Результат выполнения кода:

listbox02

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

В функции print_list() кортеж строк-элементов, который вернул метод get(), печатается в консоли.

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

Упражнения

  1. Напишите программу состоящую из ListBox() и кнопки. При нажатии на кнопку в листе добавляется случайная цифра в диапазоне от -100 до 100.

    listbox_task_01

  2. Напишите программу состоящую из ListBox() c полосой прокрутки и кнопки. При нажатии на кнопку в листе добавляется список из 3-х цифр от -50 до 50.

    listbox_task_02

  3. Напишите программу состоящую из ListBox() c полосой прокрутки и кнопки. При нажатии на кнопку в листе добавляется цифра, при каждом следующем нажатии новая добавляющаяся цифра увеличивает свое значение на 5 относительно предыдущей цифры.

    listbox_task_03

  4. Напишите программу состоящую из 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().

    listbox_task_04

    Вывод в консоль может быть следующим:

    ('a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt', 'a hat', 'a dress', 'a tie', 'a shirt', 'a belt', 'a skirt')
    
    1
  5. Напишите программу состоящую из 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_task_05

  6. Напишите программу состоящую из 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_task_06

  7. Напишите программу состоящую из 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_task_07

  8. Напишите программу состоящую из 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_task_08

  9. Напишите программу состоящую из 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_task_09

  10. Напишите программу состоящую из поля ввода, кнопки и ListBox() c полосой прокрутки. При нажатии на кнопку:

    • в лист добавляется строка, напечатанная в поле ввода;
    • после добавления поле ввода очищается.
    • строки добавляются без лишних пробелов, не начинались и не заканчивались пробелами;
    • Добавьте необходимы проверки, что бы программа не вызывала ошибок.

    listbox_task_10

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

    listbox_task_11

  12. Написать программу с двумя ListBox() c полосой прокрутки и Text(). Добавить список записей в оба ListBox(). Реализовать:

    • кнопки >>> и <<< премещают выбранные элементы списка между правым и левым Listbox();
    • кнопки Up to 1 и Down to 3 премещают выбранные элементы списка между левым Listbox() и нижним Text();
    • кнопки Up to 2 и Down to 3 премещают выбранные элементы списка между правым Listbox() и нижним Text().

    listbox_task_12