Файл: Учебное пособие С. К. Буйначев н. Ю. Боклаг.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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

"" или просто "<3>" – щелчок правой кнопкой мыши (то есть третьей, если считать на трехкнопочной мыши слева направо);

"" – двойной щелчок мышью (левой кнопкой) с нажатой кнопкой . В качестве модификаторов могут быть использованы следующие (список неполный):
Control, Shift, Lock, Button1-Button или В1-В5, Meta, Alt, Double,
Triple.
Просто символ обозначает событие – нажатие клавиши. Напри- мер, "k" – то же, что "". Для неалфавитно-цифровых клавиш есть специальные названия: , ,
, , , , ,
,
, , Prior>, , ,
3>
1   2   3   4   5

, ,
, , , t, , , , ,
, , , , , , , , ,
, , , .
Здесь обозначает пробел, a – знак меньше.
, , , – стрелки.
, – это и
. Остальные клавиши более или менее со- ответствуют надписям на стандартной клавиатуре. Следует заметить, что в отличие от Shift нельзя использовать как модифика- тор.
В конкретной среде комбинации, означающие что-то особенное в системе, могут не дойти до графического приложения. Например, известный всем . Следующая программа позволяет пе- чатать направляемые виджету события, в частности KeyPress, а также анализировать, как различные клавиши можно представить в шаб- лоне события: from Tkinter import * tk = Tk()# основное окно приложения txt = Text(tk)# виджет, принадлежащий окну tk txt.pack()#ф.обраб. событ.располаг. менеджером pack def event_info(ev): txt.delete("1.0",END) #удаляется с нач. до конца for k in dir(ev): #цикл по атрибутам события if k[0] != "_": #только неслужебные атрибуты
# готовится описание атрибута события

82 ev="%s:%s\n" % (k,repr(getattr(ev,k))) txt.insert(END, ev) txt.bind("",' event_info) tk.mainloop() # главный цикл обработки событий
При нажатии клавиши 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: width: 0

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()