Tcl/Tk FAQ

Creation: 19 octobre 2013
Mise à jour: 11 Juillet 2005
Version: 1.1
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2005-2013 Jean-Louis BICQUELET-SALAÜN
Je n'aime pas trop tcltk mais il faut avouer que pour réaliser des petits bouts de programmes rapidement, en wrappant plusieurs outils, c'est parfois bien pratique.

FAQ Revised: Friday 26 August 2011 14:10:31


Table of Contents

1. systeme
2. boucles
3. string
4. tableaux
5. syntaxe
6. fichiers
7. widgets

1. systeme

1.1. comment générer les arguments d'un programme?
set VerboseFlag false
set FileToRead "-"
set Usage "Usage: concord \[-v] \[-f]"

foreach arg $argv {
    switch -glob -- $arg {
        -v      {set VerboseFlag true}
        -f*     {set FileToRead [string range $arg 2 end]}
        -h      {puts stderr $Usage; exit}
        default {error "bad argument: $arg\n$Usage"}
    }
}


1.2. comment gérer les arguments avec booleens et variable?

-a montre comment on recupère le contenu d'une variable, -e , -r, etc montre comment on fixe une variable booleenne pour chaque option.

set var ""
      foreach a $argv {
    switch -glob -- $a {
	-e	{set echo 1}
	-r	{set raw 1}
	-i	{set isig 1}
	-p	{set bindpriv 1}
	-a      {set var [lindex $argv 1]
                set argv [lrange $argv 1 end]
                puts $var
                }
	--	break
	-*	{puts stderr "Unknown switch $a"}
	default	break
    }
    set argv [lrange $argv 1 end]
}

puts $var


1.3. Comment lister des fichiers avec un filtre ?
foreach file [glob *] {
   $file
}



2. boucles

2.1. Comment faire une boucle for?
for {set i 0} {$i < 15} {set i [expr $i+1]} {}


2.2. Comment faire une boucle sur une liste ?
foreach item {name email address phone} {puts $item }



3. string

3.1. comment remplacer un mot par un autre dans une chaine?
puts [ string map { ok "guy ok" } "Je te remplace ok?" ]
Je te remplace guy ok?

Attention, ceci remplace toutes les occurences trouvées.


4. tableaux

4.1. comment faire une boucle sur un tableau
array set a { "é" "e" "è" "e" }
foreach i [ array names a] {
  puts $a($i)
}
e
e

Attention les tableau ne sont pas forcément dans l'ordre. Il faut utiliser lsort

4.2. comment connaitre la taille d'un tableau?
Il faut utiliser array size.
puts [ array size  a ]
5



5. syntaxe

5.1. comment afficher un texte en multiligne ?
Il suffit de mettre le texte entre accolades sur plusieurs lignes.
puts {
ceci est un texte
sur plusieures lignes
3 meme
}
puts "ok"

résultat:

D:\tcl\test>e.tcl

ceci est un texte
sur plusieures lignes
3 meme

ok

Si on désire faire des substitutions de variables, on remplace les accolades par des guillemets.

set a "ma valeur" puts "ceci est un texte sur plusieures lignes 3 meme $a "
ceci est un texte
sur plusieures lignes
3 meme ma valeur



5.2. comment obtenir un nombre aléatoire entre 0 et 20 ?
expr {int(rand()*20)}

On peut en déduire les fonctions suivantes:

  1. Entre 0 et max:
    proc RandomInteger0 {max} {
             return [expr {int(rand()*$max)}]
     }
    
  2. Entre 1 et max:
    proc RandomInteger {max} {
             return [expr {int(rand()*$max) + 1}]
     }
    
  3. Entre min et max:
    proc RandomIntegerminmax {min max} {
             return [expr {int(rand()*($max-$min+1)+$min)}]
    



6. fichiers

6.1. comment lire un fichier ligne par ligne?
set srcId [open "read.tcl" r]

while {[gets $srcId line] > -1} {
  puts $dstId ">> $line"
}
close $srcId


6.2. comment recopier un fichier en le modifiant ?
set srcId [open "read.tcl" r]
set dstId [open "readinew.tcl" w]

while {[gets $srcId line] > -1} {
  puts $dstId ">> $line"
}
close $srcId
close $dstId



7. widgets

7.1. comment dimensionner une fenetre et placer des widgets dedans?

Il faut utiliser wm geometry en utilisant la syntaxe largeurxhauteur+positon x +position y , pour dimensionner la fenetre.

place permet de positionner le widget où on le désire.

button .hello -text "Quitter" -command { exit }
place .hello -x 240 -y 120

wm title . "Quit button"
wm geometry . 320x160+100+100



7.2. comment gérer une grid ?
set row 0
foreach item {name email address phone} {
  label .$item-label -text "${item}:" 
  entry .$item-entry  -width 20
  grid .$item-label -row $row -column 0 -sticky e
  grid .$item-entry -row $row -column 1 -columnspan 2 -sticky "ew"
  incr row
}

grid columnconfigure . 1 -weight 1


7.3. comment créer une liste?
# create  the user interface elements.
scrollbar .h -orient horizontal -command ".list xview"
scrollbar .v  -command ".list yview"

listbox .list -selectmode single -width 20 -height 10 \
	-setgrid 1 -xscroll ".h set" -yscroll ".v set"
label .label -text "File Selected:" -justify left 
entry .e -textvariable fileSelected

# manage the widgets using the grid geometry manager.
grid .list -row 0 -column 0 -columnspan 2 -sticky "news"
grid .v -row 0 -column 2 -sticky "ns"
grid .h -row 1 -column 0 -columnspan 2 -sticky "we"
grid .label -row 2 -column 0 
grid .e -row 3 -column 0  -columnspan 3 -sticky "we" 

grid columnconfigure . 0 -weight 1
grid rowconfigure . 0 -weight 1

# initialize the listbox with the contents of the current directory
foreach file [glob *] {
  .list insert end $file
}


7.4. Comment afficher une image ?
set image [image create photo -file tcl.gif -width 200 -height 200]
label .t.l -image $image



Copyright (c) 2005-2011 Jean-Louis BICQUELET

This list of questions and answers was generated by makefaq.