| Эта заметка доступна на: English Castellano Deutsch Francais Nederlands Russian Turkce |
автор 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