Анимация
JavaScript
|
Главная Библионтека Пользовательские интерфейсы Потом разбились Окна - и тогда Пропало все перед глазами... Э. Дикинсон, «Я слышала жужжанье Мухи - когда я умерла» Введение Все, чем мы пользуемся - видеомагнитофоны, компьютеры, телефоны и даже книги, - имеет свой пользовательский интерфейс. Интерфейс есть и у наших программ. Какие аргументы должны передаваться в командной строке? Можно ли перетаскивать мышью файлы? Должны ли мы нажимать Enter после каждого ответа или программа читает входные данные по одному символу? В этой главе мы не будем обсуждать проектирование пользовательского интерфейса - на эту тему и так написано множество книг. Вместо этого мы сосредоточим внимание на реализации интерфейсов - передаче аргументов в командной строке, посимвольному чтению с клавиатуры, записи в любое место экрана и программированию графического интерфейса. Простейшим пользовательским интерфейсом обычно считается так называемый консольный интерфейс. Программы с консольным интерфейсом читают целые строки и выводят данные также в виде целых строк. Примером консольного интерфейса являются фильтры (например, grep) и утилиты (например, mail). В этой главе консольные интерфейсы почти не рассматриваются, поскольку им уделено достаточно внимания в остальных частях книги. Более сложный вариант - так называемый полноэкранный интерфейс. Им обладают такие программы, как elm или lynx. Они читают по одному символу и могут выводить данные в любой позиции экрана. Этот тип интерфейса рассматривается в рецептах 15.4, 15.6, 15.9-15.11. Последнюю категорию интерфейсов составляют графические пользовательские интерфейсы (GUI, Graphic User Interface). Программы с графическим интерфейсом работают не только с отдельными символами, но и с отдельными пикселями. В графических интерфейсах часто используется метафора окна - программа создает окна, отображаемые на пользовательском устройстве вывода. Окна заполняются элементами (widgets) - например, полосами прокрутки или кнопками. Netscape Navigator, как и ваш менеджер окон, обладает полноценным графическим интерфейсом. Perl позволяет работать со многими инструментальными пакетами GUI, однако мы ограничимся пакетом Тк, поскольку он является самым распространенным и переносимым. См. рецепты 15.14, 15.15 и 15.19. Не путайте пользовательский интерфейс программы со средой, в которой она работает. Среда определяет тип запускаемых программ. Скажем, при регистрации на терминале с полноэкранным вводом/выводом вы сможете работать с консольными приложениями, но не с графическими программами. Давайте кратко рассмотрим различные среды. Некоторые из них позволяют работать лишь с программами, обладающими чисто консольным интерфейсом. Упрощенный интерфейс позволяет объединять их в качестве многократно используемых компонентов больших сценариев; такое объединение открывает чрезвычайно широкие возможности. Консольные программы прекрасно подходят для автоматизации работы, поскольку они не зависят от клавиатуры или экрана. Они используют лишь STDIN и STDOUT, да и то не всегда. Обычно эти программы обладают наилучшей переносимостью, поскольку они ограничиваются базовым вводом/выводом, поддерживаемым практически в любой системе. Типичный рабочий сеанс, в котором участвует терминал с экраном и клавиатурой, позволяет работать как с консольными, так и полноэкранными интерфейсами. Программа с полноэкранным интерфейсом взаимодействует с драйвером терминала и хорошо знает, как вывести данные в любую позицию экрана. Для автоматизации работы таких программ создается псевдотерминал, с которым взаимодействует программа (см. рецепт 15.13). Наконец, некоторые оконные системы позволяют выполнять как консольные и полноэкранные, так и графические программы. Например, можно запустить grep (консольная программа) из vi (полноэкранная программа) в окне xterm (графическая программа, работающая в оконной среде). Графические программы автоматизируются труднее всего, если только они не обладают альтернативным интерфейсом на основе вызова удаленных процедур (RPC). Существуют специальные инструментальные пакеты для программирования в полноэкранных и графических средах. Такие пакеты (curses для полноэкранных программ; Тк - для графических) улучшают переносимость, поскольку программа не зависит от особенностей конкретной системы. Например, программа, написанная с применением curses, работает практически на любом терминале. При этом пользователю не приходится думать о том, какие служебные команды используются при вводе/выводе. Тк-программа будет работать и в UNIX и в Windows - при условии, что в ней не используются специфические функции операционной системы. Существуют и другие варианты взаимодействия с пользователем, в первую очередь - через Web. Программирование для Web подробно рассматривается в главах 19 и 20, поэтому в этой главе мы не будем задерживаться на этой теме. 15.1. Лексический анализ аргументов 523 15.1. Лексический анализ аргументов Проблема Вы хотите, чтобы пользователь могу повлиять на поведение вашей программы, передавая аргументы в командной строке. Например, параметр -v часто управляет степенью детализации вывода. Решение Передача односимвольных параметров командной строки обеспечивается стандартным модулем Getopt::Std: use Getopt::Std; # -V ARG, -D ARG, -o ARG, присваивает $opt v, $opt D, $opt o getoptCvDo"); # -V ARG, -D ARG, -o ARG, присваивает $args{v}, $args{D}, $args{o} getoptCvDo", \%args); getoptsCvDo:"); # -v, -D, -o ARG, присваивает # $opt v, $opt D, $opt o getoptsCvDo:", \%args); # -v, -D, -o ARG, присваивает # sets $args{v}, $args{D}, $args{o} Или воспользуйтесь модулем Getopt::Long, чтобы работать с именованными аргументами: use Getopt::Long; GetDptlons( "verbose" => \$verbose, » --verbose "Debug" => \$debug, # --Debug "output=s" => \$output ); # --output=string Комментарий Многие классические программы (такие, как к и гт) получают односимвольные параметры (также называемые флагами или ключами командной строки) - например, -1 или -г. В командных строках Ь-Ыгт-г аргумент является логической величиной: он либо присутствует, либо нет. Иначе дело обстоит в командной строке gcc -о compiled/He source.c, где compiled/He - значение, ассоциированное с параметром -о. Логические параметры можно объединять в любом порядке; например, строка: % rm -г -f /tmp/testdir эквивалентна следующей: % rm -rf /tmp/testdir Модуль Getopt::Std, входящий в стандартную поставку Perl, анализирует эти традиционные типы параметров. Его функция getopt получает одну строку, где каждый символ соответствует некоторому параметру, анализирует аргументы командной строки в массиве gARGV и для каждого параметра присваивает значение глобальной переменной. Например, значение параметра -D будет храниться в пе- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 [ 168 ] 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |