ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 743
Скачиваний: 16
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
76
Флаги, используемые с регулярными выражениями:
Обозначение
Описание "(?i)", re.I, re.IGNORECASE
Сопоставление проводится без учета регистра букв "(?L)", re.L, re.LOCALE
Влияет на определение буквы в "\w", "\w", "\b",
"\B" в зависимости от текущей культурной сре- ды (locale)
"(?m)", re.M, re.MULTILINE
Если этот флаг задан, то "^" и " $" соответствуют началу и концу любой строки "(?s)", re.S, re.DOTALL
Если задан, то "." соответствует также и символу конца строки " \n"
"(?x)", re.X, re.VERBOSE
Если задан, то пробельные символы, не экрани- рованные в шаблоне обратной косой чертой, яв- ляются незначащими, а все, что расположено после символа "#", – комментариями. Позволяет записывать регулярное выражение в несколько строк для улучшения его читаемости и записи комментариев "(?u)", re.U, re.UNICODE
В шаблоне и в строке использован Unicode
22.12. Методы объекта-шаблона
В результате успешной компиляции шаблона функцией re.compile() получается объект-шаблон типа SRE_Pattern, имеющий несколько методов, некоторые из них будут рассмотрены ниже:
match(s) – сопоставляет строку s с шаблоном, возвращая в слу- чае удачного сопоставления объект с результатом сравнения
(объект SRE_Match), а в случае неудачного – None. Сопостав- ление начинается от начала строки;
search(s) – аналогичен match(s), но ищет подходящую подстроку по всей строке s;
split(s[,maxsplit=0]) – разбивает строку на подстроки, разделен- ные подстроками, заданными шаблоном. Если в шаблоне выде- лены группы, они попадут в результирующий список, переме- жаясь с подстроками между разделителями. Если указан maxsplit, то будет произведено не более maxsplit разбиений;
77
findall(s) – ищет все неперекрывающиеся подстроки s, удовле- творяющие шаблону;
finditer(s) – возвращает итератор по объектам с результатами сравнения для всех неперекрывающихся подстрок, удовлетво- ряющих шаблону.
23. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС
Пакет Tkinter, по сути, является оберткой для Tcl/Tk – известного графического пакета для сценарного языка Тсl. На примере этого па- кета будем изучать основные принципы построения графического интерфейса пользователя. Почти все современные графические ин- терфейсы общего назначения строятся по модели WIMP – Window,
Icon, Menu, Pointer (окно, иконка, меню, указатель). Внутри окон ри- суютсяэлементы графического интерфейса, которые для краткости будут называтьсявиджетами (widget – штучка). Меню могут распола- гаться в различных частях окна, но их поведение достаточно одно- типно: они служат для выбора действия из набора предопределенных действий. Пользователь графического интерфейса «объясняет» ком- пьютерной программе требуемые действия с помощью указателя.
Обычно указателем служит курсор мыши или джойстика, однако есть и другие «указательные» устройства. С помощью иконок графиче- ский интерфейс приобретает независимость от языка и в некоторых случаях позволяет быстрее ориентироваться в интерфейсе. Задачей графического интерфейса является упрощение коммуникации между пользователем и компьютером. Применение имеющихся в наличии у программиста (или дизайнера) средств при создании графического интерфейса нужно свести к минимуму, выбирая наиболее удобные пользователю виджеты в каждом конкретном случае. Кроме того, полезно следовать принципу наименьшего «удивления»: из формы интерфейса должно быть понятно его поведение. Для многих прило- жений такие действия выделены в отдельные серии экранов, называ- емые «мастерами» (wizards). Однако если приложение – скорее конструктор, из которого пользователь может строить нужные ему решения, то типичным действием является именно построение реше- ния. Определить типичные действия нелегко, поэтому компромиссом может быть гибрид, в котором есть «мастера» и хорошие возможно- сти для собственных построений. Тем не менее графический интер- фейс не является самым эффективным интерфейсом во всех случаях.
78
Для многих предметных областей решение проще выразить с помо- щью деклараций на некотором формальном языке илиалгоритма на сценарном языке.
23.1. Основы Tk
Основная черта любой программы с графическим интерфейсом
– интерактивность. Программа не просто что-то считает (в пакетном режиме) от начала своего запуска до конца, ее действия зависят от вмешательства пользователя. Фактически графическое приложение выполняет бесконечный цикл обработки событий. Программа, реали- зующая графический интерфейс,событийно-ориентирована. Она ждет от интерфейса событий, которые обрабатывает сообразно свое- му внутреннему состоянию.
Эти события возникают в элементах графического интерфейса
(виджетах) и обрабатываются прикрепленными к этим виджетам об- работчиками. Сами виджеты имеют многочисленные свойства (цвет, размер, расположение), выстраиваются в иерархию принадлежности
(один виджет может быть хозяином другого), имеют методы для до- ступа к своему состоянию.
Расположением виджетов (внутри других виджетов) ведают так называемыеменеджеры расположения.Виджет устанавливается на место по правилам менеджера расположения. Эти правила могут определять не только координаты виджета, но и его размеры. В Tk имеются три типа менеджеров расположения: простой упаковщик
(pack), сетка (grid) и произвольное расположение (place).
Но этого для работы графической программы недостаточно. Не- которые виджеты в графической программе должны быть взаимосвяза- ны определенным образом. Например, полоска прокрутки может быть взаимосвязана с текстовым виджетом: при использовании полоски текст в виджете должен двигаться, и наоборот, при перемещении по тексту полоска должна показывать текущее положение. Для связи меж- ду виджетами в Tk используются переменные, через которые виджеты и передают друг другу параметры.
23.2. Классы виджетов
Для построения графического интерфейса в библиотеке Tk ото- браны следующие классы виджетов:
Button(Кнопка) – простая кнопка для вызова некоторых действий
(выполнения определенной команды);
79
Canvas(Рисунок) – основа для вывода графических примитивов;
Checkbutton(Флажок) – кнопка, которая умеет переключаться между двумя состояниями при нажатии на нее;
Entry(Поле ввода) – горизонтальное поле, в которое можно ввести строку текста;
Frame(Рамка) – виджет, который содержит другие визуальные компоненты;
Label(Надпись) – виджет может показывать текст или графическое изображение;
Listbox(Список) – прямоугольная рамка со списком, из которого пользователь может выделить один или несколько элементов;
Menu(Меню) – элемент, с помощью которого можно создавать всплывающие (popup) и ниспадающие (pulldown) меню;
Menubutton(Кнопка-меню) – кнопка с ниспадающим меню;
Message(Сообщение) – аналогично надписи, но позволяет завора- чивать длинные строки и менять размер по требованию менеджера расположения;
Radiobutton(Селекторная кнопка) – кнопка для представления одного из альтернативных зна- чений. Такие кнопки, как пра- вило, действуют в группе. При нажатии на одну из них кнопка группы, выбранная ранее, «от- скакивает»;
Scale(Шкала) – служит для задания числового значения путем перемещения движка в определенном диапазоне;
Scrollbar(Полоса прокрутки) – полоса прокрутки служит для отображения величины прокрутки в других виджетах. Может быть как вертикальной, так и горизонтальной;
Text(Форматированный текст) – этот прямоугольный виджет позволяет редактировать и форма- тировать текст с использованием различных стилей, внедрять в текст рисунки и даже окна
Toplevel(Окно верхнего уровня) – показывается как отдельное окно и содержит внутри другие виджеты.
80
Все эти классы не имеют отношений наследования друг с дру- гом – они равноправны. Этот набор достаточен для построения ин- терфейса в большинстве случаев.
23.3. События
В системе современного графического интерфейса имеется воз- можность отслеживать различные события, связанные с клавиатурой и мышью и происходящие на «территории» того или иного виджета.
В Tk события описываются в виде текстовой строки – шаблона собы- тия, состоящего из трех элементов (модификаторы, тип события и де- тализация события).
Тип события
Содержание события
1 2
Activate
Активизация окна
ButtonPress
Нажатие кнопки мыши
ButtonRelease
Отжатие кнопки мыши
Deactivate
Деактивация окна
Destroy
Закрытие окна
Enter
Вхождение курсора в пределы ви- джета
Focusin
Получение фокуса окном
FocusOut
Потеря фокуса окном
Keypress
Нажатие клавиши на клавиатуре
KeyRelease
Отжатие клавиши на клавиатуре
Leave
Выход курсора за пределы виджета
Motion
Движение мыши в пределах ви- джета
MouseWheel
Прокрутка колесика мыши
Reparent
Изменение родителя окна
Visibility
Изменение видимости окна
Примеры описаний событий строками и некоторые названия клавиш приведены ниже:
81
"
"
Control, Shift, Lock, Button1-Button или В1-В5, Meta, Alt, Double,
Triple.
Просто символ обозначает событие – нажатие клавиши. Напри- мер, "k" – то же, что "
,
1 2 3 4 5
Здесь
,
. Остальные клавиши более или менее со- ответствуют надписям на стандартной клавиатуре. Следует заметить, что
В конкретной среде комбинации, означающие что-то особенное в системе, могут не дойти до графического приложения. Например, известный всем
# готовится описание атрибута события
82 ev="%s:%s\n" % (k,repr(getattr(ev,k))) txt.insert(END, ev) txt.bind("
При нажатии клавиши Esc в окне можно увидеть примерно сле- дующее:
char: '\x1b' delta: 9 height: 0 keycode: 9
keysym: 'Escape' keysym_num: 65307
num: 9 send_event: False serial: 159 state: 0 time: -1072960858 type: '2'
widget:
x: 83 x_root: 448
у: 44 y_root: 306
Некоторые атрибуты:
char – нажатый символ (для некоторых событий – ??);
height, width – высота и ширина;
Focus – был ли в момент события фокус у окна;
Keycode – код символа (скан-код клавиатуры);
Keysym – символическое имя клавиши;
Serial – серийный номер события, увеличивается по мере возникно- вения событий;
Time – время возникновения события;
widget – виджет, в котором возникло событие;
x,y – координаты указателя в виджете во время события;
x_root, y_root – координаты указателя на экране во время события.
Совсем необязательно, чтобы события обрабатывал виджет, ко- торый их первично принял. Например, можно перенаправить все со- бытия внутри подчиненных виджетов на данный виджет с помощью метода grab_set(), (grab_reiease() освобождает виджет от этой обя- занности). В Tk существуют и другие возможности управления собы- тиями, которые можно изучить по документации.
83
23.4. Создание и конфигурирование виджета
Создают виджет путем вызова конструктора соответствующего класса. Вызов конструктора имеет следующий синтаксис:
Widget([master[,option=value, …]]).
Здесь Widget – класс виджета, master – виджет-хозяин, option и value – конфигурационная опция и ее значение (таких пар может быть несколько).
Каждый виджет имеет свойства, которые можно устанавливать
(конфигурировать) с помощью методов config() (или configure()) и читать с помощью методов, подобных методам работы со словарями.
Ниже приведен возможный синтаксис для работы со свойствами: widget.config(option=value, ...) widget["option"] = value value = widget["option"] widget.keys()
В случае, когда имя свойства совпадает с ключевым словом языка Python, принято использовать после имени одиночное подчер- кивание. Так, свойство class нужно задавать как class_, a to как to_.
Изменять конфигурацию виджета можно в любой момент. Это изменение прорисуется на экране по возвращении в цикл обработки событий или при явном вызове update_idletasks().
Пример, приведенный ниже, показывает окно с двумя виджета- ми внутри – полем ввода и надписью. С помощью переменной надпись напрямую связана с полем ввода. В этом примере нарочно используется очень много свойств, чтобы продемонстрировать воз- можности по конфигурированию: from Tkinter import * tk = Tk() tv = StringVar()
Label(tk,textvariable=tv, relief="groove", borderwidth=3, font=("Courier",20,"bold"), justify=LEFT, width=50, padx=10, pady=20, takefocus=False,).pack()
Entry(tk, textvariable=tv, takefocus=True).pack() tv.set("123") tk.mainloop()
84
Виджеты конфигурируются прямо при создании. Более того, виджеты не связываются с именами, их только располагают внутри виджета-окна. Свойства виджета:
textvariable (текстовая переменная);
relief (рельеф);
borderwidth (ширина границы);
justify (выравнивание);
width (ширина, измеряемая в знакоместах);
padx и pady (прослойка в пикселях между содержимым и границами виджета);
takefocus (возможность принять фокус при нажатии клавиши
Tab);
font (шрифт, один из способов его задания).
Эти свойства достаточно типичны для многих виджетов, хотя иногда единицы измерения могут отличаться. Например, для виджета
Canvas ширина задается в пикселях, а не в знакоместах.
В следующем примере демонстрируются возможности по назначению цветов фону, переднему плану (тексту), выделению ви- джета (подсветка границы) в активном состоянии и при отсутствии фокуса: from Tkinter import * tk = Tk() tv =StringVar()
Entry(tk,textvariable=tv,takefocus=True, borderwidth=10).pack() mycolor1 = "#%02X%02X%02X" % (200, 200, 20)
Entry(tk,textvariable=tv,takefocus=True, borderwidth=10, foreground=mycolorl, # fg, текст виджета background="#0000FF", # bg, фон виджета highlightcolor='green', # подсветка при фокусе highlightbackground='red', # подсветка без фокуса
).pack() tv.set("123") tk.mainloop()