Как уже отмечалось, виджеты Entry часто применяются в качестве полей ввода при реализации форм. Мы часто будем создавать такие формы в этой книге. Простую иллюстрацию такого применения дает пример 8.18, в котором несколько меток, полей ввода и фреймов объединены в форму для ввода нескольких значений, изображенную на рис. 8.23.
Пример 8.18. PP4E\Gui\Tour\entry2.py
непосредственное использование виджетов Entry и размещение их по рядам с метками фиксированной ширины: такой способ компоновки, а также использование менеджера grid обеспечивают наилучшее представление для форм
from tkinter import *
from quitter import Quitter
fields = ‘Name’, ‘Job’, ‘Pay’
def fetch(entries):
for entry in entries:
print(‘Input => “%s”’ % entry.get()) # извлечь текст
def makeform(root, fields):
entries = []
for field in fields:
row = Frame(root) # создать новый ряд
lab = Label(row, width=5, text=field) # добавить метку, поле ввода
ent = Entry(row)
row.pack(side=TOP, fill=X) # прикрепить к верхнему краю
lab.pack(side=LEFT)
ent.pack(side=RIGHT, expand=YES, fill=X) # растянуть по горизонтали entries.append(ent)
return entries
if __name__ == ‘__main__’:
root = Tk()
ents = makeform(root, fields)
root.bind(‘<Return>’, (lambda event: fetch(ents)))
Button(root, text=’Fetch’,
command = (lambda: fetch(ents))).pack(side=LEFT)
Quitter(root).pack(side=RIGHT)
root.mainloop()
Рис. 8.23. Внешний вид форм entry2 (и entry3)
Полями ввода здесь служат простые виджеты Entry. Сценарий создает список виджетов, с помощью которого потом будут извлекаться их значения. При каждом нажатии кнопки Fetch текущие значения извлекаются из всех полей ввода и выводятся в стандартный поток вывода:
C:\…\PP4E\Gui\Tour> python entry2.py
Input => “Bob”
Input => “Technical Writer”
Input => “Jack”
Тот же результат дает нажатие клавиши Enter, когда окно обладает фокусом ввода, — на этот раз событие привязано к корневому окну в целом, а не к отдельному полю ввода.
Искусство создания структуры формы состоит в основном в организации иерархии виджетов. В данном сценарии каждый ряд метка/поле ввода конструируется как новый фрейм Frame, прикрепляемый к текущему краю TOP окна. Метки прикрепляются к левому краю ряда (LEFT), а поля — к правому (RIGHT). Поскольку каждый ряд представляет собой отдельный фрейм, его содержимое изолируется от других операций компоновки, производимых в этом окне. Кроме того, этот сценарий разрешает увеличение горизонтального размера при изменении размеров окна только для полей ввода, как показано на рис. 8.24.
Рис. 8.24. Возможность растягивания полей ввода в сценариях entry2 (и entry3) в действии
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011