Но достаточно разговоров о сложностях Юникода — вернемся к программированию графических интерфейсов. Помимо указания позиции, теги виджета Text могут также использоваться для форматирования и выполнения операций как над всеми символами подстроки, так и над всеми подстроками, помещенными в тег. Эта особенность составляет значительную часть мощи, предоставляемой виджетом Text:
• Теги имеют атрибуты форматирования, позволяющие определять цвет, шрифт, ширину табуляции, величину межстрочных интервалов и параметры выравнивания. Они могут применяться одновременно к нескольким фрагментам текста, если связать их с тегом и выполнить настройку тега с помощью метода tag_config, который очень напоминает общий метод config виджетов.
• Теги позволяют выполнять привязку событий, что дает возможность реализовать, например, гиперссылки в виджете Text : щелчок на тексте вызывает обработчик события его тега. Привязка событий к тегам осуществляется с помощью метода tag_bind, во многом подобного уже знакомому общему методу bind виджетов.
С помощью тегов можно отображать текст с различными настройками внутри одного и того же виджета Text; например, ко всему виджету Text можно применить один шрифт, а к тексту в тегах — другие шрифты. Кроме того, виджет Text позволяет встраивать другие виджеты в заданное индексом место (они интерпретируются, как отдельный символ), а также графические изображения.
Пример 9.12 иллюстрирует основы применения сразу всех этих дополнительных возможностей и воспроизводит интерфейс, изображенный на рис. 9.22. Этот сценарий применяет форматирование и выполняет привязку событий к трем подстрокам, помеченным тегами, выводит текст с помощью двух разных комбинаций шрифтов и цветов, а также встраивает графическое изображение и кнопку. Двойной щелчок мышью на любой из подстрок, заключенных в теги (или на встроенной кнопке), генерирует событие, которое выводит в поток stdout сообщение «Got tag event».
Пример 9.12. PP4E\Gui\Tour\texttags.py
“демонстрация дополнительных возможностей тегов и виджета Text”
from tkinter import * root = Tk()
def hello(event): print(‘Got tag event’)
# создать и настроить виджет Text
text = Text()
text.config(font=(‘courier’, 15, ‘normal’)) # общий шрифт
text.config(width=20, height=12)
text.pack(expand=YES, fill=BOTH)
text.insert(END, ‘This is\n\nthe meaning\n\nof life.\n\n’) # вставить 6 строк
# встроить окна и изображения
btn = Button(text, text=’Spam’, command=lambda: hello(0)) # встроить кнопку btn.pack()
text.window_create(END, window=btn) # встроить изображение
text.insert(END, ‘\n\n’)
img = PhotoImage(file=’../gifs/PythonPowered.gif’) text.image_create(END, image=img)
# применить теги к подстрокам
text.tag_add(‘demo’, ‘1.5’, ‘1.7’) text.tag_add(‘demo’, ‘3.0’, ‘3.3’) text.tag_add(‘demo’, ‘5.3’, ‘5.7’) text.tag_config(‘demo’, background=’purple’) text.tag_config(‘demo’, foreground=’white’) text.tag_config(‘demo’, font=(‘times’, 16, ‘ text.tag_bind(‘demo’, ‘<Double-1>’, hello) root.mainloop() |
# добавить ‘is’ в тег # добавить ‘the’ в тег # добавить ‘life’ в тег # изменить цвета тега # называются не bg/fg underline’)) # изменить шрифт тега # привязать события |
Рис. 9.22. Теги виджета Text в действии
Такие средства встраивания и работы с тегами тегов можно в конечном итоге использовать для отображения веб-страницы. А стандартный модуль html.parser анализа разметки HTML может помочь с автоматизацией построения графического интерфейса веб-страницы. Как можно догадаться, виджет Text предоставляет больше возможностей программирования графических интерфейсов, чем позволяет описать объем книги. За подробностями о возможностях, предоставляемых тегами и виджетом Text , обращайтесь к другим справочникам по библиотекам Tk и tkinter. А сейчас начнутся занятия в художественной школе.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011