автор Charles VIDAL Об авторе : Владелец гастрономического склада в Париже. Приверженец философии GNU и Open Source за возможность обмена знаниями. Хотел бы выделять время для игры на саксофоне. Содержание:
|
Резюме:
Цель заметки - рассмотрение графического инструментария Tcl : Tk. Также будет продемонстрировано создание GUI в несколько строк.
Tk был разработан для расширения языка Tcl графическими возможностями, обычно их упоминают как Tcl/Tk ( произносится как Tikel/Tikey ).
Это многоплатформенный графический инструментарий, использующий вид самой ОС. Tk прекрасно сочетается с другим многоплатформенным инструментом - языком Tcl. Огромным преимуществом этой связки является простота использования. Действительно портируемые приложения создаются очень быстро.
pack [ label .l -text "Bonjour monde" ]
#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 выглядит действительно просто. Но кроме внешнего вида необходимо обратить внимание на концепцию.
Для просмотра доступных перейдите в каталог /usr/local/lib/tk8.0/demos/
и
выполните widget.
Набор элементов ограничен. Но существуют расширения, созданные отдельными людьми и компаниями, среди которых наиболее известные : Tix, the widgets Incr Tcl , BWidget, все доступны на сайте scriptics
label .mylabel -text "hello world"
Рассмотрим детально : строка начинается с названия объекта, который необходимо создать, далее название так называемого контейнера, где . обозначает "root window" и последнее свойство (-text " hello Word "). Заметим, что доступ к свойствам открывается после создания самого объекта :
.mylabel cget text hello world
.mylabel configure -text "Bonjour Monde in french :)"
puts [label .mylabel -text "hello world"]
Также объект может вывести результат выполнения другой команды :
.mylabel configure -text " This is the date [exec date ]"Для получения доступных для изменения свойств используйте команду : ".ylabel configure" в интерактивном режиме Wish.
Конечно, вы ведь только создали объект, но не вывели его на экран. Для изображения объекта необходима дополнительная информация, которую мы еще не определили - в каком виде надо вывести объект.
Существуют следующие layouts:
Полнофункциональный 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 для выхода из программы.
Checkbuttons и radiobuttons.
checkbutton $w.b1 -text "Wipers OK" -variable wipers -relief flat -onvalue "Ok" -offvalue "not Ok"
radiobutton .b1 -text "Premier " -variable size -value 1
radiobutton .b2 -text "Second " -variable size -value 2
entry .e -textvariable toto -width 40
Пример :
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 |
Пример : place [ label .l -text "With Place"] -x 100 -y 100 .l configure -bg red
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.
Следим за событием "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 .}
|
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:
|
2000-10-31, generated by lfparser version 1.5