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()
2
3
4
5
6
7
8
9
10
11
12
Первым аргументом в 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()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Если сделать растяжение Listbox()
, по ширине окна то приложение может иметь следующий вид:
Для создания перемотки необходимо его создать:
scroll = Scrollbar(command=lbox.yview)
scroll.pack(side=LEFT, fill=Y)
lbox.config(yscrollcommand=scroll.set)
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()
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
Результат выполнения кода:
В функции 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().
Вывод в консоль может быть следующим:
('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Напишите программу состоящую из
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()
.
- кнопки