![[Photo of the Author]](../../common/images/Charles-V.jpg) 
Original in fr Charles Vidal
fr to en Charles Vidal
en to nl Tom Uijldert
![[Illustratie]](../../common/images/illustration174.gif) 
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 .}
