Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
Эта заметка доступна на: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

[Photo of the author]
автор Charles VIDAL

Об авторе :

Владелец гастрономического склада в Париже. Приверженец философии GNU и Open Source за возможность обмена знаниями. Хотел бы выделять время для игры на саксофоне.

Содержание:

Изучаем Tk

logo de Tcl Tk

Резюме:

Цель заметки - рассмотрение графического инструментария Tcl : Tk. Также будет продемонстрировано создание GUI в несколько строк.



 

Tk графический инструментарий Tcl :WISH

Tk был разработан для расширения языка Tcl графическими возможностями, обычно их упоминают как Tcl/Tk ( произносится как Tikel/Tikey ).

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

 

Hello world !

Продемонстрируем легкость и простоту применения этой связки на классическом примере :
pack [ label .l -text "Bonjour monde" ]

Сравним с gtk:
#include <gtk/gtk.h>
Int main( int   argc,
          char *argv[] )
{
   /* GtkWidget is the storage type for widgets */
    GtkWidget *window;
    GtkWidget *button;

    gtk_init(&&argc, &&argv);
   /* create a new window */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label ("Bonjour Monde");
    gtk_container_add (GTK_CONTAINER (window), button);
    gtk_widget_show (button);

    /* and the window */
    gtk_widget_show (window);
    gtk_main ();

    return(0);
}
или с Motif
/* COMPILE  cc xmhello.c -L/usr/X11R6/lib  -lXm -lXt -lX11 -lXmu -o xmhello */

#include <Xm/PushB.h>
#include <Xm/Form.h>

/* Widget */

    Widget      main_widget, pushb;

main(int argc, char **argv)
{
    Widget      form;
    Arg         args[1];
    int         ac = 0;
    XmString    label_str;

    main_widget = XtInitialize(argv[0], "test", NULL, 0, &&argc, argv);
    label_str = XmStringCreate("Bonjour Monde", XmSTRING_DEFAULT_CHARSET);
    XtSetArg(args[ac], XmNlabelString, label_str);
    ac++;
    pushb = XmCreatePushButton(main_widget, "hello", args, ac);
    XtManageChild(pushb);
    XtRealizeWidget(main_widget);
    XtMainLoop();
}
На самом деле довольно трудно сравнивать код написанный для интерпретатора и компилятора. В этом случае эффективнее посмотреть на размер памяти, занимаемый программой. Рассматривая данный пример, все что мы можем сказать - написание данной программы с помощью Tk выглядит действительно просто. Но кроме внешнего вида необходимо обратить внимание на концепцию.
Существует множество расширений, изменяющих внешний вид Tk Widget - например Qtk, или TkStep.
Немаловажно и то, что Tk можно применять в сочетании со множеством языков : Как и большинство интерпретаторов - связка Tcl/Tk многоплатформенная.  

Создание графического объекта Tk

Инструментарий содержит набор базовых объектов ( widgets ) для построения GUI.

Для просмотра доступных перейдите в каталог /usr/local/lib/tk8.0/demos/ и выполните widget.

Набор элементов ограничен. Но существуют расширения, созданные отдельными людьми и компаниями, среди которых наиболее известные : Tix, the widgets Incr Tcl , BWidget, все доступны на сайте scriptics

 

Структура объекта в GUI

По сути дела GUI можно охарактеризовать как набор "окон" со своими свойствами.
Вершиной структуры объекта являестся его название, например кнопка. Структура в языке Tcl/Tk описывается следующим образом : Когда запускается программа wish появляется окно, с именем . ( точка ).  

Создание графических объектов : "hello world"

Команда языка Tcl для создания графического объекта имеет следующий синтаксис :
name_object .(name_container.)*name_graphical_object [property value]
Пример : label .mylabel -text "hello world"

Рассмотрим детально : строка начинается с названия объекта, который необходимо создать, далее название так называемого контейнера, где . обозначает "root window" и последнее свойство (-text " hello Word "). Заметим, что доступ к свойствам открывается после создания самого объекта :


Теперь объект содержит текст "Bonjour Monde in french :)"
Вывод объекта осуществляется командой : puts [label .mylabel -text "hello world"] Также объект может вывести результат выполнения другой команды :
.mylabel configure -text " This is the date [exec date ]"
Для получения доступных для изменения свойств используйте команду : ".ylabel configure" в интерактивном режиме Wish.
Результатом выполнения будет ошибка и список свойств доступных для изменения.
 

Форматирование: управление положением вывода элементов.

Ничего не происходит, ничего не отображается на дисплее.

Конечно, вы ведь только создали объект, но не вывели его на экран. Для изображения объекта необходима дополнительная информация, которую мы еще не определили - в каком виде надо вывести объект.

Существуют следующие layouts:
  1. The packer
  2. The placer
  3. The grid
Выберем простейший : the packer.

Полнофункциональный Hello Word

label .mylabel -text "hello world" pack .mylabel
Или одной строкой
pack [label .mylabel -text "hello world"]


Кнопка Рассмотрим данный объект : button .myboutton -text "hello world" -command "exit" pack .myboutton Заметим, что он обладает свойством "command", через которое можно выполнять команду языка tcl при нажатии пользователем на объект. В нашем примере это команда exit для выхода из программы.

 

Ассоциирование графических объектов с переменными.

Мощь Tcl/tk в связывании объектов с переменными, которые демонстрируют изменение их состояния. Вследствие нет необходимости вызывать дополнительные функции, чтобы узнать состояние объекта. С другой стороны - изменение значения переменной автоматически влечет изменение состояния объекта. Как видите код становится более стройным и уменьшается в объеме. Пример

Checkbuttons и radiobuttons.

  1. Checkbutton отображает состояние - установлен или нет.
    С данным элементом можно связать переменную, принимающую значение 0 ( по умолчанию ) или 1 в зависимости от состояния, с другой стороны мы сами можем определить состояние элемента через присваивание переменной определенного значения.
    Пример : checkbutton $w.b1 -text "Wipers OK" -variable wipers -relief flat -onvalue "Ok" -offvalue "not Ok"
  2. Radiobutton отображает состояние набора элементов.
    Эти элементы чаще всего сгруппированы и допускают выбор только одного из них. Чтобы сгруппировать элементы - необходимо привязать их к одной переменной, значение которой и будет демонстрировать выбранный элемент.
    Пример :
    radiobutton .b1 -text "Premier " -variable size -value 1 radiobutton .b2 -text "Second " -variable size -value 2
  3. Entry
    Этот элемент - строка, куда пользователь может вводить текст.
    Пример :
    entry .e -textvariable toto -width 40

 

Формат вывода

Обычно элементы помещаются в рамку. Будьте внимательны и не используйте более одного layout manager в одной рамке. Перечислим существующие layout managers :
  1. The packer: Позиционирует объект :
    1. top
    2. bottom
    3. right
    4. left

    Пример :
    pack [ button .b1 -text top ] -side top
    pack [ button .b2 -text bottom ] -side bottom
    pack [ button .b3 -text right ] -side right
    pack [ button .b4 -text right ] -side left
    

  2. The placer: Позиционирование объекта по "x" и "y".

    Пример : place [ label .l -text "With Place"] -x 100 -y 100 .l configure -bg red

  3. The grid Объекты располагаются в виртуальной сетке, состоящей из строк и столбцов. Больше всего это подходит для listboxes или multiple lines editboxes. Синтаксис : label .mainlbl2 -text "Label 2" -bd 2 -relief sunken grid .mainlbl2 -row 0 -column 1 -sticky news label .mainlbl1 -text "Label 1" -bd 2 -relief raised grid .mainlbl1 -row 0 -column 0 -sticky news label .mainlbl3 -text "Label 3" -bd 2 -relief solid grid .mainlbl3 -row 1 -column 0 label .mainlbl4 -text "Label 4" -bd 2 -relief groove grid .mainlbl4 -row 1 -column 1

 

Список созданных объектов

Команда winfo выводит список созданных объектов.

 winfo exists name_object
или :
winfo children .

 

События

Аргумент -command определяет действие выполняемое в ответ на событие. Но бывают случаи, когда необходимо более точно управлять объектом или отслеживать несколько событий. Для этой цели служит объект canvas.

bind name_of_widget name_of_event tcl_code.
 

Небольшой пример

Создадим GUI для просмотра содержимого tar ( gz ) файлов.
Интерфейс состоит из list и scrollbars.
Ниже следует описание структуры скрипта :
  1. Создаем gui (proc makegui).
  2. Помещаем все объекты в tabgui.
  3. Следим за количеством аргументов - если их нет - завершаем программу.
  4. Выполняем команду tar -tzvf имя_файла_tar.
  5. Каждая строка помещается в list.
Следим за событием "Control C" для завершения приложения :
bind all <Control-c> {destroy .}
Можно немного улучшить скрипт : проверить сжат файл или нет командой языка tcl string first; если не был передан аргумент - открыть окно выбора файла; создать меню для выбора действия над файлами архива, создания нового файла или архива...
#!/bin/sh
# the next line restarts using wish \
exec wish8.0 "$0" "$@"

global tabgui

proc makegui { } {
global tabgui
#
# Creation of the  scrollbars for the list
# then the horizontal scrollbar is placed right, filling up horizontally the window
# and the vertical scrollbaris placed below, filling up vertically the window
#
set tabgui(scrollv) [scrollbar .scrollv -command ".list yview"]
pack $tabgui(scrollv) -side right -fill y
set tabgui(scrollh) [scrollbar .scrollh -command ".list xview" -orient horizontal ]
pack $tabgui(scrollh) -side bottom -fill x
#
# Creation of the list associating it to the scrollbar
#
#
set tabgui(list) [listbox .list  \
                -yscroll "$tabgui(scrollv) set" \
                -xscroll "$tabgui(scrollh) set" \
                -relief sunken -width 20 -height 20 \
        -setgrid yes ]
pack $tabgui(list) -side left -fill both -expand yes
wm minsize . 1 1
}

#
# Creation of the GUI
#
makegui

if $argc>0 {set tarfile [lindex $argv 0]} else {puts stderr "tar file missing" ; exit} 
set command "tar -tzvf $tarfile"
set tube [ open |$command r] 
 while {![eof $tube]} {
    set tarresult  [ gets $tube ] 
    $tabgui(list)  insert end $tarresult
}

bind all <Control-c> {destroy .}
 

Ссылки

 

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Charles VIDAL, FDL
LinuxFocus.org

Click here to report a fault or send a comment to Linuxfocus
Translation information:
fr -> -- Charles VIDAL
fr -> en Charles VIDAL
en -> ru Kirill Poukhliakov

2000-10-31, generated by lfparser version 1.5