|
|
Dit artikel is beschikbaar in: English Castellano Deutsch Francais Nederlands Russian Turkce |
door Charles Vidal <charles_vidal(at)bigfoot.com> Over de auteur: Baas van een gastronomisch tentje in Parijs. Gecharmeerd door GNU en de filosofie van Open Source omdat ze mensen kennis laten delen. Hij zou wat meer tijd aan zijn saxofoon willen besteden. Vertaald naar het Nederlands door: Tom Uijldert <tom.uijldert(at)cmgplc.com> Inhoud:
|
Kort:
Dit artikel gaat in op de grafische hulpmiddelen van Tcl, te weten: Tk.
We zullen demonstreren hoe eenvoudig het is een grafische toepassing hiermee in elkaar te
zetten, met gebruikmaking van slechts enkele regels code.
Tk is een grafische omgeving, geschikt voor meerdere machines maar met hetzelfde uiterlijk als het
lokale operating systeem. Een ideale combinatie met Tcl, dat ook geschikt is voor
meerdere machines. Groot voordeel van Tcl/Tk is de eenvoud. Het duo stelt je in staat snel
applicaties te maken die je op meerdere omgevingen in kunt zetten. Net zoals er een
tclsh
is voor Tcl is er een
wish
voor Tk.
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); }...of met 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(); }Maar het is niet eenvoudig om de code van een scripttaal te vergelijken met die van een gecompileerde. We moeten hierbij ook andere aspecten betrekken zoals het geheugengebruik van de totale applicatie. Het enige wat we hier dus kunnen concluderen is dat het maken van het klassieke "Hello World" programma in Tk een makkie is. We kunnen beter kijken naar het concept en de ideeën van de hulpmiddelen in plaats van naar het uiterlijk.
widget
.
Het aantal grafische objecten is beperkt (er zijn geen tree widgets, combo boxes enz.). Een aantal personen en bedrijven echter hebben waardevolle uitbreidingen hierop uitgebracht. De meest bekende hiervan is Tix, de widgets Incr Tcl en meest recentelijk het mooie BWidget. Al deze uitbreidingen zijn te verkrijgen bij scriptics.
.
voor de start van de boom (wortel of root).
.(naam_dumpplaats)*naam_ grafisch_object
.
(punt).
naam_object.(naam_dumpplaats)*naam_grafisch_object[karakteristiek
waarde]
Voorbeeld:
label .mylabel -text "hello world"
Zoals je kunt zien wordt de actie geïnitieerd door de naam op te geven van het object dat
moet worden gecreëerd, hier .label
genaamd,
vervolgens de naam van de dumpplaats, waarvan .
het root-venster is en op
het eind geef je de karakteristieken (-text "hello world"
). Merk op
dat je op ieder moment de argumenten en dus de karakteristieken van het object na het aanmaken kunt
veranderen.
cget
(voor Configuration
get).
.mylabel cget text hello world
configure
. Het commando retourneert de naam van het gecreëerde
object, in dit geval .mylabel
.
.mylabel configure -text "Bonjour Monde in french :)"
puts [label .mylabel -text "hello
world"]
.
.mylabel configure -text "Dit is de datum [ exec date ]"Om de opties te laten zien die je aan
configure
mee kunt geven voor een
bepaalde widget kun je het volgende intikken: ".mylabel configure
",
interactief in wish. Je krijgt dan een foutmelding en een lijst van opties die je
mee kunt geven.
Inderdaad, je hebt net een object aangemaakt van het label-type maar je hebt niet gevraagd om het ook weer te geven. Dat is omdat voor het weergeven nog meer informatie nodig is die je niet hebt gegeven, namelijk de opmaak (de opmaak bepaalt het plaatsen of positioneren van vensters) die voor dit object geldt.
Hier de mogelijke opmaken:
Een meer volledig hello world programma
label .mylabel -text "hello world" pack .mylabelOf, in 1 regel:
pack [label .mylabel -text "hello world"]De button. Laten we deze eens bekijken:
button .mybutton -text "hello world" -command "exit" pack .mybuttonMerk op dat de button een command-karakteristiek heeft als argument (slechts één). Dit is het te executeren tcl-commando als de gebruiker deze button aanklikt. In dit voorbeeld is het betreffende commando
exit
, wat het programma laat
stoppen.
Voorbeeld
De checkbuttons en radiobuttons
checkbutton $w.b1 -text "Wipers OK" -variable wipers -relief flat -onvalue "Ok" -offvalue "not Ok"
radiobutton .b1 -text "Een " -variable size -value 1 radiobutton .b2 -text "Twee " -variable size -value 2
-textvariable
.
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 |
-expand (yes|no) -fill (x|y|both)
Voorbeeld:
place [ label .l -text "Avec Place"] -x 100 -y 100 .l configure -bg red
.e_name
en geef deze
vervolgens weer met:
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 exists name_objectWe kunnen het overzicht krijgen van alle widgets met:
winfo children .Deze functionaliteit kun je niet vinden in andere gecompileerde hulpmiddelen (gtk, wt, Motif ...).
-command
optie mee werd gegeven. Er zijn gevallen waarin je dit met meer detail af wilt
handelen of wanneer je meerdere gebeurtenissen voor een widget wil afhandelen. Het
canvas is hier een voorbeeld van.
bind naam_widget naam_event tcl_code.
proc makegui
)
tabgui
tar -tzvf naam_tar_bestand
.
Control-C
" toetscombinatie om het
programma te beëindigen.
bind all <Control-c> {destroy .}Dit is slechts een klein voorbeeld, voor verbetering vatbaar. We kunnen testen of het bestand gecomprimeerd is of niet met het tcl-commando
string first
. Als de gebruiker
geen argument meegeeft kunnen we een venster maken van waaruit we het betreffende bestand
kunnen selecteren (file chooser). We kunnen wat finesse toevoegen door een
popmenu te maken, waarmee de gebruiker bestanden uit de lijst kan manipuleren.
Tenslotte kunnen we boven nog een menubalk toevoegen waarmee de gebruiker een nieuw
bestand kan openen, een nieuw archief creëren...
#!/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 .}
|
Site onderhouden door het LinuxFocus editors team
© Charles Vidal, FDL LinuxFocus.org Klik hier om een fout te melden of commentaar te geven |
Vertaling info:
|
2002-06-08, generated by lfparser version 2.28