Tk a ete crée en tant que Toolkit graphique pour le langage Tcl. D'ailleurs on parle souvent de Tcl/Tk prononce Ticket/Tickelle.
C'est un toolkit graphique multi-platforme qui a le look du système sur lequel on l'utilise. Il s'associe parfaitement au langage Tcl qui lui aussi est multi-platforme. Le grand avantage de Tcl et de Tk est leurs simplissités. Ce couple permet de faire des applications très rapidement et d'une extrême porbabilité. Et tout comme il existe un tclsh pour tcl , il existe un interpreteur Tk et Tcl : wish
pack [ label .l -text "Bonjour monde" ]
#includePar rapport à du Motifnt 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); }
/* COMPILE cc xmhello.c -L/usr/X11R6/lib -lXm -lXt -lX11 -lXmu -o xmhello */ #includeCependant il est difficile de comparer du source d'un langage scriptique et un langage compilé. Il faut prendre en compte aussi d'autres aspects comme la taille d'execution en mémoire... Disons que pour faire un coucou au monde Tk c'est plus simple :). Mais il faudra peut etre retenir plus que le look du toolkit ( il y vrai pas trés joli sous X ) le concept, les idées.#include /* 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(); }
Si vous voulez avoir une démo de l'ensemble des widget disponible allez voir dans le répertoire /usr/local/lib/tk8.0/demos/ et lancez widget.
L'ensemble de ces objets graphiques reste assez limité . C'est pourquoi plusieurs personnes morales ou physiques ont créé des extensions dont l'une des plus célèbre : Tix les widgets Incr Tcl et récemment les excellents BWidget, l'ensemble des extensions est recencé sur le site de scriptics: Pour plus de détails
label .monlabel -text "hello world"
Comme vous pouvez le voir s'éffectue bien en donnant le nom de l'object graphique à créer , ici un label puis ne nom du conteneur , ici . correpondant a la fenêtre principale, puis les propriétées ( -text "hello word" ). l peut signaler ici que ces arguments peuvent être accedé ou modifié à tout moment après la création de l'objet graphique.
.monlabel cget text hello worldPour modifier la configuration , on utilise la commande configure. Cette commande vous retourne le nom de l'objet créé, ici .monlabel Exemple:
.monlabel configure -text "Bonjour Monde en francais :) "
puts [label .monlabel -text "hello world"]
Le label peut avoir comme le résultat d'une commande :
.monlabel configure -text " La date [exec date ]"Pour connaitre les options que l'on peut passer à configure pour une widget définit, Faites: ".monlabel configure" sous Wish en mode interactif.
Effectivement, vous venez de créer un objet de type label, mais vous n'avez pas encore demandé à ce qu'il soit afficher. Car l'affichage de cet objet requière une information que vous n'avez pas encore précisez. Dans quel layout ( un layout est un gestionnaire de disposition de fenêtre ) vous souhaitez mettre cet objet.
Il existe plusieurs layouts possibles:
Hello Word la totale
label .monlabel -text "hello world"
pack .monlabel
ou en une ligne
pack [label .monlabel -text "hello world"]
Le bouton
Voyons maintenant le cas du bouton:
button .monboutton -text "hello world" -command "exit"
pack .monboutton
On remarquer que le button a une propriété command qui prend en argument ( un seul ) la ou les commandes tcl a éxectuer lorsque l'utilisateur appuis sur celui-ci.
Dans le cas de cette exemple, la commande a éxecuter est exit, ce qui aura pour éffet de quitter le programme.
Les checkbuttons et les 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
La zone de saisie ou entry Cet objet graphique offre une zone d'une seule ligne de texte afin que l'utilisateur la renseigne.
entry .e -textvariable toto -width 40
Exemple:
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 |
On peut aussi configurer les widgets qu'il contient lors d'un agrandissement de fenetre: option -expand (yes|no) -fill ( x|y| both)
Exemple: place [ label .l -text "Avec 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
Tk gére les événements et éxecute les commandes lorsque que vous les avez précisé par -command. Mais il y a des cas ou l'on souhaite gérer plus finement les événements, ou gérer plusieurs événements pour une widget , par exemple le canvas.
Lorsque l'on souhaite réagir à un événement on utilise la commande bind
bind nomduwidget nom de l'événement code tcl.