Содержание


Технология Tcl

Используйте Tcl/Tk для организации рабочего стола и автоматизации вашей работы

Comments

Большинство пользователей взаимодействует с компьютерами с помощью графического интерфейса пользователя (GUI). В операционных системах Microsoft® Windows® этот интерфейс строго контролируется. Операционные системы UNIX®, напротив, предлагают много различных графических интерфейсов GUI с различным уровнем функциональности. Графические интерфейсы GUI больше известны как оконные менеджеры, так как расположены выше уровня X-Windows и организуют работу с оконными GUI приложений.

Главным принципом UNIX всегда было право пользователя самому выбирать, как должна работать его система. У разных людей имеются разные потребности, и графический интерфейс UNIX имеет больше возможностей для персонализации. В качестве GUI пользователь UNIX может использовать как простые оконные менеджеры, такие как twm, так и мощные многофункциональные инструменты, такие как GNOME и KDE (K Desktop Environment). Между двумя этими крайностями находится множество других оконных менеджеров, предлагающих различные возможности и особенности. (Список наиболее популярных оконных менеджеров приведен в разделе Ресурсы.)

Можно реализовать для рабочего стола дополнительные возможности с помощью скриптов, не тратя время на изучение программирования, либо использовать программируемый оконный менеджер, поведение которого также можно контролировать, как и работу интерфейса командной строки, однако оптимальным решением будет простой оконный менеджер, который запускается поверх основного оконного менеджера, и обеспечивает достаточную гибкость для легкого написания скриптов.

Tcl/Tk приходит на помощь

Созданный доктором Джоном Оустерхоутом (John Ousterhout) из Калифорнийского Университета, к которому позже присоединились Sun Microsystems и Scriptics, язык программирования Tool Command Language (Tcl) and Tk - Tcl/Tk - предлагает простой и удобный способ для программирования элементов GUI с минимальными усилиями.

При разработке программы для решения какой-либо задачи всегда возникают крайней мере две важные проблемы: как она должна выглядеть (how should it look?) и что должна делать (what should it do?). Язык программирования Tcl/Tk старается сделать как можно более безболезненным решение проблемы как она будет выглядеть: он позволяет легко программировать элементы графического интерфейса, такие как окна и кнопки, и назначать им определенную функциональность (проблема как она будет работать).

Что делать?

Чистый, приведенный в порядок рабочий стол хорош для обоих миров - реального и виртуального. Приведенный в порядок означает, что на нем находятся только несколько пиктограмм, которые делают основную часть работы по подготовке рабочего стола. Иногда их еще называют "кофейные пиктограммы" (англ. coffee icons). Подразумевается, что, нажав на эти пиктограммы, можно попить кофе, пока они будут запускать те программы, с которыми вам предстоит работать. Полезно сгруппировать запуск нескольких программ, предназначенных для решения одной задачи, в функциональности одной пиктограммы.

Например, чтобы написать статью, такую как эта, можно запрограммировать одну пиктограмму так, что при нажатии на нее запустятся xterm (текстовый редактор для редактирования XML-файлов) и Web-браузер для просмотра статьи. Всего лишь одним нажатием на пиктограмму все эти инструменты запускаются, настраиваются согласно вашим предпочтениям, максимально удобно размещаются на экране, выбирается текущий каталог, все нужные файлы открываются и подготавливаются для работы. Вот это программа!

Такого же результата можно достичь, написав сценарий для командной оболочки Bash и подключив его к пиктограмме на рабочем столе, но Tcl/Tk предлагает значительно более удобный интерфейс для взаимодействия с компонентами GUI.

Помощник писателя

В листинге 1 показана Tcl/Tk-программа, выполняющая все действия по нажатию на пиктограмму, описанные в предыдущем пункте. В дополнение к запуску текстового редактора xterm и браузера она предлагает кнопку, нажав на которую можно в любой момент конвертировать статью из XML в HTML с помощью скрипта, предоставленного IBM.

Листинг 1. Помощник писателя
#!/usr/bin/wish -f

# 1 -- How should it look?

set PageTitle "IBM developerWorks Articles -- Studio B"
set InitDir "/home/bill/StudioB/developerworks"
set ChooseDir "Choose an Article Directory"

frame .rc -borderwidth 2
wm title . $PageTitle
wm resizable . 0 0
button .rc.b -width 20 -text "Rebuild Article" -command {rebuild-article}
button .rc.c -width 20 -text "Exit" -command {exit}
pack .rc
pack .rc.b
pack .rc.c
grid .rc.b .rc.c -sticky ew

# 2 -- What should it do?

proc rebuild-article {} {
  exec ./dw-transform.sh &
}

wm geometry . =336x32+0+707
set dir ""
while {$dir == ""} {
  set dir [tk_chooseDirectory \
           -initialdir $InitDir \
           -title $ChooseDir]
}
cd $dir
exec nedit -geometry 150x48+0+0 index.xml &
exec konsole &
exec opera -geometry 1024x680+0+0 index.html &

Можно скопировать этот код, нажав левую кнопку мыши и выделив его целиком, а затем запустив свой любимый редактор и вставив в него текст нажатием средней кнопки мыши. Полученный файл надо сохранить под именем article.tcl и сделать его исполняемым с помощью команды chmod:

$ chmod +x article.tcl

Так как оконные менеджеры могут отличаться друг от друга, как и аппаратное обеспечение (например, на мыши может и не быть средней кнопки), эти процедуры могут не работать в вашей системе. В таком случае попросите кого-нибудь вам помочь.

В следующем разделе разобраны части программы.

Переменные

В первой части кода используется традиционный UNIX pound-bang-код (#!) для запуска интерпретатора Tcl/Tk wish. Параметр -f заставляет интерпретатор выполнить программу, а затем выйти.

После этого комментарием, отмеченным #, начинается фрагмент как она должна выглядеть? (How should it look?). В этом фрагменте выполняется инициализация строковых переменных. Лучше сгруппировать строковые переменные вместе и выполнить их инициализацию вне основного кода программы, это давно стало хорошей практикой в программировании:

#!/usr/bin/wish -f

# 1 -- How should it look?

set PageTitle "IBM developerWorks Articles -- Studio B"
set InitDir "/home/bill/StudioB/developerworks"
set ChooseDir "Choose an Article Directory"

Код графического интерфейса

Этот небольшой фрагмент кода создает окно с двумя кнопками, расположенными рядом друг с другом. Подчеркнем, что среди всех инструментов UNIX у Tk самые мощные возможности определения окон и элементов GUI:

frame .rc -borderwidth 2
wm title . $PageTitle
wm resizable . 0 0
button .rc.b -width 20 -text "Rebuild Article" -command {rebuild-article}
button .rc.c -width 20 -text "Exit" -command {exit}
pack .rc
pack .rc.b
pack .rc.c
grid .rc.b .rc.c -sticky ew

Команда frame создает окно с названием .rc и границей шириной в два пикселя. Команда wm заставляет основной оконный менеджер назвать самое верхнее окно значением строковой переменной PageTitle, а следующая команда wm запрещает пользователю изменять размеры созданного окна. После этого создаются две кнопки и располагаются друг за другом горизонтально в сетке окна.

Код кнопки

IBM предоставляет программу для конвертации статей, написанных с использованием XML, в Web-страницы (HTML), которые можно просмотреть в разделе developerWorks. Метод rebuild-article запускает эту программу при нажатии на кнопку с таким же именем. Когда программа заканчивает свою работу, она выводит диалоговое окно с информацией о том, как было выполнено конвертирование XML в HTML, вместе с сообщениями об ошибках (если они были). Если программа говорит, что был создан файл index.html, надо нажать OK, перейти в Web-браузер, и обновить страницу, чтобы увидеть новый документ:

proc rebuild-article {} {
  exec ./dw-transform.sh &
}

Код запуска

Команда wm geometry . =336x32+0+707 во фрагменте кода для запуска размещает созданное окно в нижней части рабочего стола с разрешением 1024 x 768 пикселей. Затем открывается диалоговое окно для выбора статьи для редактирования. Наконец, каталог, в котором находится статья, делается текущим рабочим каталогом, и запускаются редактор (nedit), xterm (консоль терминала) и Web-браузер (Opera). Все они настроены должным образом, чтобы можно было сразу начинать работать:

wm geometry . =336x32+0+707
set dir ""
while {$dir == ""} {
  set dir [tk_chooseDirectory \
           -initialdir $InitDir \
           -title $ChooseDir]
}
cd $dir
exec nedit -geometry 150x48+0+0 index.xml &
exec konsole &
exec opera -geometry 1024x680+0+0 index.html &

Эту Tcl/Tk-программу можно улучшить разными способами. Например, имеет смысл добавить кнопку для создания новой статьи или кнопку для резервного сохранения всех статей в архив, и с помощью Tcl/Tk можно легко это сделать. Также можно выбрать наиболее подходящий редактор xterm и Web-браузер. Экспериментируйте с подобными расширениями для рабочего стола, не ограничиваясь написанием статей для IBM. Напишите подобную программу для запуска среды программирования или для запуска среды Web-разработки.

Научный калькулятор

Теперь усовершенствуем рабочий стол более сложной программой с графическим интерфейсом пользователя: научным калькулятором, который содержит не более пятидесяти строк кода (см. листинг 2). Калькулятор вычисляет значения выражений, введенных с клавиатуры или с помощью кнопок GUI-программы. Если вводится некорректное выражение, то текст становится красным. Так же как и в программе из листинга 1, можно скопировать код в файл, сохранить его в файл calc.tcl, командой chmod сделать его исполняемым и запустить.

Листинг 2. Научный калькулятор
#!/usr/bin/wish -f
# 1 -- How should it look?
set cflag 0; set nextkey 0
wm title . "50-Line Calculator" 
wm resizable . 0 0
grid [entry .display -textvariable expression -justify right] -columnspan 6
focus .display
bind .display <Return> equals; bind .display <KP_Enter> equals
foreach row {
  {7 8 9 + -  sin(}
  {4 5 6 * /  cos(}
  {1 2 3 ( )  tan(}
  {C 0 . = Pi log(}
  } {
  foreach key $row {
    switch -- $key {
            C       {set string {set cflag 1; set expression ""}}
            Pi      {set string pi}            
            =       {set string equals}
            default {set string "press $key"}
    }
    lappend keys [button .[incr nextkey] -text $key -command $string]
  }
  eval grid $keys -sticky we
  set keys [list]
}
# 2 -- What should it do?
proc press {key} {
  if $::cflag {
    set ::expression ""
    if ![regexp {[0-9().]} $key] {set ::expression $::results}
      .display configure -fg black
      .display icursor end; set ::cflag 0
  }
  .display insert end $key
}
proc pi {} {
  if $::cflag {set ::expression ""}
  lappend ::expression "3.14159265"
  .display icursor end; set ::cflag 0
}
proc equals {} {
  regsub {=.+} $::expression "" ::expression
  if [catch {lappend ::expression = \
     [set ::results [expr \
     [string map {/ *1.0/} $::expression]]]}] {
      .display configure -fg red
  }
  .display xview end; set ::cflag 1
}

Этот код немного упрощен за счет дублирования некоторых коротких строчек кода, но как можно видеть, Tcl/Tk - это весьма лаконичный язык. Не так много языков программирования позволяют таким малым числом строчек кода создать сложную программу с графическим интерфейсом пользователя.

Главное окно

Кроме обычного pound-bang-кода для запуска интерпретатора сразу инициализируются несколько переменных: cflag для управления основным GUI-элементом для ввода данных, .display для сбора введенных символов и переменная nextkey - индекс, используемый при заполнении массива символов, вводимых с клавиатуры. Потом, как и в предыдущей программе, задается заголовок окна и устанавливается запрет на изменение его размеров.

После этого задается элемент GUI, который будет использоваться как экран калькулятора. Здесь надо отметить насколько вещей: текст всегда выравнивается по правому краю - как в большинстве калькуляторов, значения нажатых клавиш появляются на правой стороне экрана и сдвигаются влево. Команда focus переводит фокус на экран, так что можно использовать клавиатуру или GUI-кнопки для ввода выражений. Далее задается код, который должен выполняться при нажатии клавиши Enter на основном или числовом блоке клавиатуры, и экран готов:

#!/usr/bin/wish -f
# 1 -- How should it look?
set cflag 0; set nextkey 0
wm title . "50-Line Calculator" 
wm resizable . 0 0
grid [entry .display -textvariable expression -justify right] -columnspan 6
focus .display
bind .display <Return> equals; bind .display <KP_Enter> equals

Клавиатура калькулятора

Этот код динамически создает экранные клавиши для калькулятора, определяя для каждой клавиши текст, который будет выводиться на экран, или в случае с клавишами C, Pi и = специальную функцию, которую необходимо выполнить при нажатии клавиши. Не так много языков программирования позволяют создать такой сложный графический интерфейс пользователя с большим количеством GUI-элементов при помощи небольшого числа строчек кода, как Tcl/Tk:

foreach row {
  {7 8 9 + -  sin(}
  {4 5 6 * /  cos(}
  {1 2 3 ( )  tan(}
  {C 0 . = Pi log(}
  } {
  foreach key $row {
    switch -- $key {
            C       {set string {set cflag 1; set expression ""}}
            Pi      {set string pi}            
            =       {set string equals}
            default {set string "press $key"}
    }
    lappend keys [button .[incr nextkey] -text $key -command $string]
  }
  eval grid $keys -sticky we
  set keys [list]
}

Функциональность калькулятора

Вся функциональность калькулятора определяется всего лишь с помощью трех процедур. Пока программа выполняется, действие сфокусировано на выражении, находящемся на экране калькулятора. Метод expr вычисляет это выражение при нажатии клавиш = или Enter.

Метод press вызывается при нажатии большинства кнопок из GUI-калькулятора. Задача этого метода - вывести название кнопки на экран и добавить его к переменной expression, содержащей выражение, которое будет вычислено позже. При установке параметра cflag он стирает предыдущее выражение, готовя его для ввода и вычисления следующего выражения:

# 2 -- What should it do?
proc press {key} {
  if $::cflag {
    set ::expression ""
    if ![regexp {[0-9().]} $key] {set ::expression $::results}
      .display configure -fg black
      .display icursor end; set ::cflag 0
  }
  .display insert end $key
}

Метод pi выводит значение числа pi на экран и записывает его в строковую переменную, содержащую выражение:

proc pi {} {
  if $::cflag {set ::expression ""}
  lappend ::expression "3.14159265"
  .display icursor end; set ::cflag 0
}

Метод equals выполняется при нажатии клавиш = или Enter. При помощи команды языка Tcl/Tk expr и математической библиотеки вычисляется значение выражения, и результат записывается в переменную results. Если при вводе выражения произошла ошибка, например, было введено неправильное число скобок, фрагмент кода catch обрабатывает ошибку, сброшенную командой expr, и меняет цвет экрана на красный:

proc equals {} {
  regsub {=.+} $::expression "" ::expression
  if [catch {lappend ::expression = \
     [set ::results [expr \
     [string map {/ *1.0/} $::expression]]]}] {
      .display configure -fg red
  }
  .display xview end; set ::cflag 1
}

В документации команды expr указано, что она может использоваться для множества других математических функций, таких как asin, acos, atan, экспоненты и других. Можно ввести эти функции с клавиатуры и убедиться, что expr работает с ними. У читателя этой статьи уже должно быть достаточно знаний, чтобы добавить в код калькулятора кнопки, реализующие эти функции. Более подробную информацию можно получить из Tcl/Tk keywords в разделе Ресурсы

Рабочие столы, созданные только с помощью Tcl

Множество людей настолько очарованы возможностями написания графических интерфейсов с помощью Tcl/Tk, что они уже написали редакторы, браузеры, файловые и оконные менеджеры с использованием только Tcl/Tk. Выборочный список этих продуктов приведен в разделе Ресурсы.

Заключение

Любое хорошее изобретение, меняющее современную жизнь, появляется, когда человек, недовольный текущей ситуацией, решает изменить мир к лучшему. Вы можете улучшить мир с помощью технологии, поэтому, написав ради удовольствия новый рабочий стол, можно открыть дверь другим, более совершенным идеям. Удачного программирования!


Ресурсы для скачивания


Похожие темы

  • Tcl your desktop (EN): оригинал статьи.
  • AIX and UNIX articles: другие статьи, написанные Вильямом Циммерли.(EN)
  • Window Managers for X: сайт, посвященный оконным менеджерам UNIX и Linux®. (EN)
  • Server clinic: Expect exceeds expectations (EN) (developerWorks, апрель 2002): статья о возможностях языка программирования Tcl/Tk.
  • Tcler's Wiki: информация о Tcl/Tk и лучшие программы на Tcl/Tk.(EN)
  • Tcl/Tk keywords: список ключевых слов на Tclers Wiki с подробной информацией об отдельных командах и функциях Tcl/Tk. Особенно рекомендую прочитать в разделе E описание команды expr. (EN)
  • The Script Archive: из этого сайта можно узнать больше о прошлом и будущем Tcl/Tk непосредственно от компании, основанной первым разработчиком это языка (Dr. John Ousterhout). (Примечание: на момент написания этой статьи Web-сайт был на реконструкции).(EN)
  • Linux.com's HOWTO on Tcl and Tk: материалы о работе Tcl/Tk на платформе Linux. (EN)
  • AIX и UNIX: сообщество developerWorks по AIX и UNIX предлагает десятки статей и учебных курсов для пользователей различных уровней - от начинающего до продвинутого.
  • IBM trial software: ознакомительные версии программного обеспечения IBM для разработчиков, доступные для загрузки прямо с сайта developerWorks. (EN)

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=296762
ArticleTitle=Технология Tcl
publish-date=03242008