Возобновим наш обзор виджетов. Виджеты Listbox позволяют отображать списки элементов, доступных для выбора, а виджеты Scrollbar предназначаются для прокрутки содержимого других виджетов. Эти виджеты часто используются друг с другом, поэтому будем изучать их одновременно. В примере 9.9 виджеты Listbox и Scrollbar образуют упакованный набор.
Пример 9.9. PP4E\Gui\Tour\scrolledlist.py
“простой настраиваемый компонент окна списка с прокруткой”
from tkinter import *
def __init__(self, options, parent=None):
Frame.__init__(self, parent)
self.pack(expand=YES, fill=BOTH) # сделать растягиваемым self.makeWidgets(options)
def handleList(self, event):
index = self.listbox.curselection() # при двойном щелчке на списке label = self.listbox.get(index) # извлечь выбранный текст self.runCommand(label) # и вызвать действие
# или get(ACTIVE)
def makeWidgets(self, options):
sbar = Scrollbar(self)
list = Listbox(self, relief=SUNKEN)
sbar.config(command=list.yview) # связать sbar и list
list.config(yscrollcommand=sbar.set) # сдвиг одного = сдвиг другого sbar.pack(side=RIGHT, fill=Y) # первым добавлен — посл. обрезан
list.pack(side=LEFT, expand=YES, fill=BOTH) # список обрезается первым pos = 0
for label in options: # добавить в виджет списка
list.insert(pos, label) # или insert(END,label)
pos += 1 # или enumerate(options)
#list.config(selectmode=SINGLE, setgrid=1) # режимы выбора, измен. разм. list.bind(‘<Double-1>’, self.handleList) # установить обр—к события self.listbox = list
def runCommand(self, selection): # необходимо переопределить
print(‘You selected:’, selection)
if __name__ == ‘__main__’:
options = ((‘Lumberjack-%s’ % x) for x in range(20)) # или map/lambda, ScrolledList(options).mainloop() # […]
Этот модуль можно запускать как самостоятельный сценарий, чтобы поэкспериментировать с этими виджетами, или использовать в качестве библиотечного объекта. Передавая различные списки выбора в аргументе options и переопределяя метод runCommand в подклассе, можно повторно использовать определенный здесь класс компонента ScrolledList всякий раз когда потребуется вывести список с прокруткой. Мы еще будем использовать этот класс в главе 11, в примере программы PyEdit. При грамотном подходе можно легко расширить библиотеку tkinter классами на языке Python таким способом.
Если запустить этот пример как самостоятельный сценарий, он создаст окно, подобное изображенному на рис. 9.14, которое было получено в Windows 7. Это фрейм Frame со списком Listbox в левой части, содержащим 20 сгенерированных элементов (на пятом выполнен щелчок) и связанным с виджетом Scrollbar в правой части, предназначенным для прокрутки списка. Если переместить ползунок в полосе прокрутки, список также будет прокручиваться, и наоборот.
tk | □ || В
Lumberjack-0 ж
Lumberjack-1
Lumberjack-2
Lumberjack-3
Lumberjack-4
Lumberjack-5
Lumberjack-6
Lumberjack-7
Lumberjack-8
Lumberjack-9
Рис. 9.14. Сценарий scrolledlist в действии
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011