Главная


14. Виджет Listbox

Виджет Listbox предназначен для отображения ряда строк текста. Обычно он используется для того, чтобы пользователь мог выбрать один или несколько элементов из списка. Во всех строках текста используется один и тот же шрифт. Если вам нужно что-то более напоминающее текстовый редактор, смотрите Раздел 24, "Виджет Text".

Чтобы создать новый виджет Listbox внутри корневого окна или фрейма parent:

w = tk.Listbox(parent, option, ...)

Этот конструктор возвращает новый виджет Listbox. Опции:

Таблица 22. Опции виджета Listbox

activestyle Этот параметр задает внешний вид активной строки. Он может иметь любое из этих значений:

'underline' - Активная строка будет подчеркнута. Это вариант по умолчанию.

'dotbox' - Активная строка заключена в пунктирную линию со всех четырех сторон.

'none' - Активной строке не придается никакого особого вида.
bg или background Цвет фона в Listbox.
bd или borderwidth Ширина границы вокруг Listbox. По умолчанию - два пикселя. Возможные значения см. в Раздел 5.1, "Размеры".
cursor Курсор, который появляется при наведении мыши на Listbox. См. раздел Раздел 5.8, "Курсоры".
disabledforeground Цвет текста в Listbox, когда его состояние (state) равно tk.DISABLED.
exportselection По умолчанию пользователь может выделять текст с помощью мыши, и выделенный текст будет экспортирован в буфер обмена. Чтобы отключить это поведение, используйте exportselection=0.
font Шрифт, используемый для текста в Listbox. См. раздел Раздел 5.4, "Шрифты".
fg или foreground Цвет, используемый для текста в Listbox. См. раздел Раздел 5.3, "Цвета".
height Количество строк (не пикселей!), отображаемых в Listbox. По умолчанию 10.
highlightbackground Цвет подсветки фокуса, когда виджет не имеет фокуса. Смотрите Раздел 53, "Фокус: маршрутизация ввода с клавиатуры".
highlightcolor Цвет, отображаемый в подсветке фокуса, когда виджет имеет фокус.
highlightthickness Толщина выделения фокуса.
listvariable Переменная StringVar, связанная с полным списком значений в Listbox (см. раздел 52, "Управляющие переменные: значения за виджетами").

Если вы вызовете метод .get() переменной listvariable, то получите строку вида "('v0', 'v1', ...)", где каждое vi - это содержимое одной строки Listbox.

Чтобы изменить сразу весь набор строк в Listbox, вызовите .set(s) для listvariable, где s - строка, содержащая значения строк с пробелами между ними.

Например, если listCon - это StringVar, связанная с параметром listvariable списка Listbox, то этот вызов приведет к тому, что список Listbox будет содержать три строки:

listCon.set('ant bee cicada')

Этот вызов вернет строку "('ant', 'bee', 'cicada')":

listCon.get()
relief Выбирает трехмерные эффекты границ. По умолчанию используется tk.SUNKEN. Другие значения см. в Раздел 5.6, "Стили рельефа".
selectbackground Цвет фона для отображения выделенного текста.
selectborderwidth Ширина границы, которую следует использовать вокруг выделенного текста. По умолчанию выделенный элемент отображается сплошным блоком цвета selectbackground; если увеличить selectborderwidth, то элементы будут раздвигаться дальше друг от друга, а выделенный элемент будет иметь рельеф tk.RAISED (см. Раздел 5.6, "Стили рельефа").
selectforeground Цвет переднего плана для отображения выделенного текста.
selectmode Определяет, сколько элементов можно выделить и как перетаскивание мышью влияет на выделение:

tk.BROWSE: Обычно в listbox можно выбрать только одну строку. Если вы щелкните на элементе, а затем перетащите его на другую строку, выделение будет следовать за мышью. Это значение используется по умолчанию.

tk.SINGLE: Вы можете выбрать только одну строку, и вы не можете перетаскивать мышь - где бы вы ни нажали кнопку 1, эта строка будет выбрана.

tk.MULTIPLE: Вы можете выбрать любое количество строк одновременно. Щелчок на любой строке определяет, будет ли она выбрана или нет.

tk.EXTENDED: Вы можете выбрать любую соседнюю группу линий одновременно, щелкнув на первой строке и перетащив ее к последней.
state По умолчанию Listbox находится в состоянии tk.NORMAL. Чтобы Listbox не реагировал на события мыши, установите этот параметр в значение tk.DISABLED.
takefocus Обычно фокус перемещается по виджетам Listbox. Установите этот параметр в 0, чтобы убрать виджет из последовательности. См. раздел Раздел 53, "Фокус: маршрутизация ввода с клавиатуры".
width Ширина виджета в символах (не пикселях!). Ширина основывается на средней величине символа, поэтому некоторые строки такой длины в непропорциональных шрифтах могут не поместиться. По умолчанию - 20.
xscrollcommand Если вы хотите, чтобы пользователь мог прокручивать Listbox по горизонтали, вы можете связать виджет Listbox с горизонтальной полосой прокрутки. Установите этот параметр в метод .set полосы прокрутки. Подробнее о виджетах Listbox с возможностью прокрутки см. в Раздел 14.1, "Скроллинг виджета Listbox".
yscrollcommand Если вы хотите позволить пользователю прокручивать Listbox по вертикали, вы можете связать виджет Listbox с вертикальной полосой прокрутки. Установите этот параметр в метод .set полосы прокрутки. Смотрите Раздел 14.1, "Скроллинг виджета Listbox".

Для многих методов объектов Listbox используется специальный набор значений для индекса:

Методы для объектов Listbox включают:

.activate(index)

Выбирает строку, указанную по заданному index.

.bbox(index)

Возвращает ограничивающую рамку строки, указанной по index, в виде 4-кортежа (xoffset, yoffset, width, height), где верхний левый пиксель рамки находится в точке (xoffset, yoffset), а width и height заданы в пикселях. Возвращаемое значение width включает только ту часть строки, которую занимает текст.

Если строка, указанная аргументом index, не видна, метод возвращает None. Если она частично видна, возвращаемое ограничение может выходить за пределы видимой области.

.curselection()

Возвращает кортеж, содержащий номера строк выделенного элемента или элементов, считая от 0. Если ничего не выделено, возвращает пустой кортеж.

.delete(first, last=None)

Удаляет строки, чьи индексы находятся в диапазоне [first, last], включительно (в отличие от обычного соглашения в Python, где удаление прекращается до последнего индекса), считая от 0. Если второй аргумент опущен, удаляется единственная строка с индексом first.

.get(first, last=None)

Возвращает кортеж, содержащий текст строк с индексами от first до last, включительно. Если второй аргумент опущен, возвращается текст строки, ближайшей к first.

.index(i)

Если возможно, позиционирует видимую часть Listbox так, чтобы строка, содержащая индекс i, находилась в верхней части виджета.

.insert(index, *elements)

Вставляет одну или несколько новых строк в Listbox перед строкой, указанной index. Используйте tk.END в качестве первого аргумента, если вы хотите добавить новые строки в конец Listbox.

.itemcget(index, option)

Получает одно из значений опций для определенной строки в Listbox. Значения опций см. в разделе itemconfig ниже. Если данная опция не была установлена для данной строки, возвращаемое значение будет пустой строкой.

.itemconfig(index, option=value, ...)

Изменяет опцию конфигурации для строки, указанной в index. Имена опций включают:

background - Цвет фона данной строки.

foreground - Цвет текста данной строки.

selectbackground - Цвет фона данной строки при ее выделении.

selectforeground - Цвет текста данной строки при ее выделении.

.nearest(y)

Возвращает индекс видимой строки, ближайшей к координате Y относительно виджета Listbox.

.scan_dragto(x, y)

См. scan_mark ниже.

.scan_mark(x, y)

Используйте этот метод для реализации сканирования-быстрой устойчивой прокрутки Listbox. Чтобы получить эту возможность, привяжите событие нажатия кнопки мыши к обработчику, который вызывает scan_mark с текущим положением мыши. Затем привяжите событие <Motion> к обработчику, вызывающему scan_dragto с текущим положением мыши, и Listbox будет прокручиваться со скоростью, пропорциональной расстоянию между положением, зафиксированным scan_mark, и текущим положением.

.see(index)

Регулирует положение Listbox таким образом, чтобы строка, на которую ссылается index, была видна.

.selection_anchor(index)

Помещает "якорь выделения" на строку, выбранную аргументом index. После размещения этого якоря вы можете ссылаться на него с помощью специальной индексной формы tk.ANCHOR.

Например, для Listbox с именем lbox эта последовательность выберет строки 3, 4 и 5:

lbox.selection_anchor(3)
lbox.selection_set(tk.ANCHOR,5)

.selection_clear(first, last=None)

Снимает выделение со всех строк между индексами first и last, включительно. Если второй аргумент опущен, снимается выделение строки с индексом first.

.selection_includes(index)

Возвращает 1, если строка с заданным index выделена, иначе возвращает 0.

.selection_set(first, last=None)

Выбирает все строки между индексами first и last, включительно. Если второй аргумент опущен, выбирается строка с индексом first.

.size()

Возвращает количество строк в Listbox.

.xview()

Чтобы сделать Listbox горизонтально прокручиваемым, установите опцию command связанной горизонтальной полосы прокрутки на этот метод. См. Раздел 14.1, "Скроллинг виджета Listbox".

.xview_moveto(fraction)

Прокручивает Listbox так, чтобы крайняя левая часть (fraction) ширины его самой длинной строки находилась за пределами левой стороны Listbox. Фракция находится в диапазоне [0,1].

.xview_scroll(number, what)

Прокручивает Listbox по горизонтали. Для аргумента what используйте либо tk.UNITS для прокрутки по символам, либо tk.PAGES для прокрутки по страницам, то есть по ширине Listbox. Аргумент number указывает, сколько страниц прокручивать; отрицательные значения перемещают текст в Listbox вправо, положительные - влево.

.yview()

Чтобы сделать Listbox вертикально прокручиваемым, установите параметр command связанной вертикальной полосы прокрутки на этот метод. Смотрите Раздел 14.1, "Скроллинг виджета Listbox".

.yview_moveto(fraction)

Прокручивает Listbox так, чтобы верхняя часть (fraction) ширины его самой длинной строки находилась за пределами левой стороны Listbox. Дробь находится в диапазоне [0,1].

.yview_scroll(number, what)

Прокручивает Listbox по вертикали. Для аргумента what используйте либо tk.UNITS для прокрутки по строкам, либо tk.PAGES для прокрутки по страницам, то есть по высоте Listbox. Аргумент number указывает, сколько страниц прокручивать; отрицательные значения перемещают текст вниз внутри Listbox, а положительные - вверх.


>> Скроллинг виджета Listbox