Questions résolues

 

Ci-dessous les anciennes entrées de la page Une question ...

Prière de ne pas éditer cette page SVP.


CK L'essentiel de mon programme est en C; je voudrais cependant coder un GUI en Tc-Tk ou en TK et pouvoir le compiler avec mon compilateur de C soit DevC++ en même temps que le programme principal. Quelle librairie de Tcl-Tk dois-je inclure? (#include.h) Un grand merci pour ces precieuses informations!

Quelques semaines plus tard Je suis en mesure de répondre à ma question. J'ai demandé partout et la réponse que j'ai reçue à tout coup est: ça ne se fait tout simplement pas; c'est trop complexe. Donc cette question passe à: Questions résolues


Robert Abitbol Ah! Je suis très heureux de me retrouver en France! Quel pays merveilleux!

Un grand merci à tous les tecleurs qui m'ont aidé à réparer les bugs de mon éditeur fait-maison et en particulier à Michel Salvagniac (France) et Michael Griffiths (UK).

Une question simple: après que l'usager ouvrira un fichier, je voudrais que le curseur se place au 1.0 dans la surface d'édition (editing area). Or je ne sais pas comment rendre ce concept de après que .. ai fait .. en tcl.

Quelqu'un a une vague idée?

Kroc : Regarde du côté de tkwait et vwait. En plus complexe, tu peux également utiliser trace.


[ZG] Je ne sais pas si ça se fait sur le site mais j'ai trouvé Je mets la solution mais vous pouvez tout enlever s'il le faut Après l'obtention du chanelid (fid dans mon exemple) par la commande open il faut faire la commande fconfigure avec l'option binary Je pensais que la commande read sous sa 2eme forme(sans -nonewline) lisait en binaire sans interpreter. Voilà et félicitation pour votre site

[ZG] J'essaie de lire un fichier binaire à base de read , mot (16 bits) par mot : exemple : set val [read $fid 2] puis je visualise en hexa ce que j'ai lu par "binary scan ...." : exemple : binary scan $val H* val2 puis j'affiche $val2

Cela marche tres bien excepté pour les mots commencant par 8xxx Je sais exactement ce que j'ai dans mon fichier via un editeur hexa genre Hexedit Exemple : pour DB01 je trouve DB01 : OK

          pour 1301 je trouve 1301 : OK
          pour 8C01 je trouve 5201 : NOK
          pour 8501 je trouve 2601 : NOK , etc, etc, ...

Je suis sur PC Windows 2000, et je fais afficher en hexa ou binaire (en faisant attention au little endian ou big endian). Ce qui me perturbe c'est que des valeurs comme DB01 qui ont aussi le premier bit à 1 marchent. Ce n'est pas une histoire de signé ou non signé car je reste au niveau de l'hexa. J'ai aussi converti en décimal et mes conversions en décimal marchent quand la valeur est bien lue. On dirait qu'on lit autre chose que 8C01 au niveau du read. Il y a t'il une interpretation du 8 dans 8xxx pour le read ?

Merci d'avance


dMc- en développant TTC : sauvegarder les tags et les images avec le texte d'un widget text, sous Windows (archive Tk ActiveState) les valeurs par défaut de certaines couleurs de tags (par exemple "sel") d'un text sont de la forme System*, de même que pour d'autres options de type HightLight.

Sous Mandriva 10.1 ou FreeBsd (Freesbie) ces valeurs de couleurs ne sont pas reconnues.

Est-ce un problème de version de Tk ou des caractéristiques propres à Windows? Il s'agit pourtant à chaque fois de Wish8.4.

Kroc : Il s'agit d'un nom de couleur propre à Windows : SystemButtonFace dont l'équivalent portables est #C0C0C0.

On peut corriger ce problème avec un string map :

 set coul [string map {SystemButtonFace #C0C0C0} $coul]

dMc: OK merci. J'ai trouvé cette page qui aborde le sujet, mais en anglais : http://wiki.tcl.tk/8606


comment realiser une petite interface grafique liée à un noyau prolog sous eclipse pour afficher le contenu d'une matrice, avec quelques intéractions avec l'utilisateur du style : il peut choisir les valeurs de certaines cases du tableau qui deviennnet ainsi des contraintes avan dexecuter le script prolog et d'afficher le resultat avec tcl/tk et ce quand on ne connait pas du tt ce logiciel, que je trouve personnelement trop vaste pour l'application que j'ai a réaliser merci

sernin

Kroc 4/5/2006 : Sernin (et les autres), quand on rajoute du texte à un wiki, on ne doit pas effacer le texte existant, c'est mal ! Comme c'est indiqué en haut de la page, on écrit au dessous du premier séparateur, mais pas à la place du reste du texte.


bonjour,

Je n'ai aucune compétence/formation informatique, ai découvert le language LISP il y a un an , et depuis je passe tout mon temps libre dessus...je trouve ça fascinant, et très adapté au débutant (syntaxe limpide, peu de primitives à maîtriser, très flexible...)

Bref, j'aimerais m'en servir pour créer des animations graphiques (un peu plus raffinées que celle que je faisais sur mon vieil amstrad) mais le logiciel que j'utilise (Symbolic Composer) n'inclut pas de librairies graphiques et ne permet pas d'en importer non plus...

J'ai louché sur Squeak, mais je n'y comprend rien. Java, idem. (en fait j'ai plutôt la flemme et je préfère me concentrer sur LISP...)

Ce que j'aimerais : trouver un format d'image simple à encoder (comme ppm), et pouvoir séquencer (pas forcément très rapidement, car je filme image par image sur une TV) une liste de ces images générées par Symbolic Composer.

J'ai l'impression que tcl/tk pourrait m'aider...

Est-ce quelqu'un pourrait me conseiller ? (suis sur mac, os x 10.3.9)

merci


DMc.31/03/06

Je voudrais sauvegarder avec le texte le formatage de ce texte, c'est à dire les polices utilisées, le corps des caractères, leur couleur, ... bref les tags, mark, images et windows associés au texte dans un widget "text". La commande dump fournit toutes les informations que l'on peut stocker dans le même fichier que le texte, le problème consiste alors à retraiter ces informations.

Si quelqu'un connait un package qui le fait, je m'éviterais de réinventer l'eau tiède.

RS: Voilà une petite demonstration - <F1> converte le text formatté à son dump (avec la configuration des tags), <F2> renverse le procès (en ajoutant une ligne au fin - je ne sais pas comment éviter c,a):

 package require Tk

 pack [text .t -wrap word] -fill both -expand 1
 set font [.t cget -font]
 set bfont [concat $font bold]
 .t tag config bold -font $bfont
 .t tag config red -foreground red
 .t insert end "Hello " {} world bold , "" this {} " is " bold red red

 bind .t <F1> {
   set dump [dumptags %W]\n[%W dump 1.0 end]
   %W delete 1.0 end
   %W insert end $dump
 }
 bind .t <F2> {
    set content [%W get 1.0 end-1c]
   %W delete 1.0 end
   undump %W $content
 }
 proc undump {w content} {
    foreach {type value pos} $content {
	switch -- $type {
	    text   {$w insert $pos $value}
            tag    {eval [list $w tag configure $value] $pos}
	    tagon  {set on($value) $pos}
	    tagoff {$w tag add $value $on($value) $pos; unset on($value)}
	}
    }
 }
 proc dumptags w {
    set res {}
    foreach name [$w tag names] {
        set items {}
        foreach tag [$w tag configure $name] {
            if {[lindex $tag 3] ne [lindex $tag 4]} {
               lappend items [lindex $tag 0] [lindex $tag 4]
            }
        }
        if [llength $items] {lappend res tag $name $items}
    }
    set res
 }

DMC : Merci!

Je suis épaté de la vitesse à laquelle on obtient une aide sur ce wiki.

Pour ce qui est de la ligne surnuméraire, il suffit de supprimer les treize derniers caractères du texte "dumpé" de la manière suivante :

 bind .t <F2> {
     set content [%W get 1.0 end-13c]; # c'est là, la modification
                                       # 13 au lieu de 1 caractère
    %W delete 1.0 end
    undump %W $content
  }

mb: Parenthèses et expression régulière

J'ai besoin de rechercher des parenthèses dans un texte, mais je ne trouve pas la syntaxe pour cela. En effet, même si je mets une oblique devant le signe ( ou si je l'isole par des guillements "(", ou si je le place d'abord dans une variable, l'interpréteur renvoie un message d'erreur comme quoi il manque une parenthèse fermante. Mes recherches compulsives dans la documentation n'ont abouti à rien. Quelqu'un connait-il la solution? Merci DM.

ulis, 2005-01-26.

  set text ")ce (texte) contient des (parenthèses)("
  set p 0
  while {$p <= [string length $text]} \
  {
    # recherche du premier caractère (
    set n1 [string first "(" $text $p]
    # recherche du premier caractère )
    set n2 [string first ")" $text $p]
    # recherche du premier des deux
    set n $n1
    if {$n1 == -1 || ($n2 > -1 && $n2 < $n)} { set n $n2 }
    if {$n == -1} { break } ;# plus de parenthèses
    # traitement du caractère trouvé
    switch [string index $text $n] \
    {
      "("     { puts "( trouvé à $n" }
      ")"     { puts ") trouvé à $n" }
      default { puts "ce satané code ne marche pas !" }
    }
    # recherche suivante
    set p $n; incr p
  }

(j'évite les expressions régulières dès que je le peux) - DMc : c'est dommage, c'est beau.


DM 25/02/06

scrollbar pour deux widgets text

J'aimerais commander deux widgets text par la même scrollbar (y) comme dans Ctext où les numéros de lignes sont liés aux lignes du texte éditable. Je ne trouve pas la syntaxe dans mes livres, et le code de Ctext est quelque peu opaque.

Merci de me fournir une piste.

DM.

ulis, 2006-01-25. En voici une : http://wiki.tcl.tk/MultiScrolling.

L'exemple porte sur deux listbox synchronisées.

Le miracle tiens dans l'overloading des routines de scrolling :

  # the scroll procs
    # called by a listbox
  proc yset {args} \
  {
    eval [linsert $args 0 .f.sb set]
    yview moveto [lindex [.f.sb get] 0]
  }
    # called by the scroll bar
  proc yview {args} \
  {
    eval [linsert $args 0 .f.lb1 yview]
    eval [linsert $args 0 .f.lb2 yview]
  }

  listbox .f.lb1 -list ::list1 -height 8 -yscrollc yset
  listbox .f.lb2 -list ::list2 -height 8 -yscrollc yset
  scrollbar .f.sb -command yview

DM. merci, je vais piocher ça. DM. Si on remplace les "listbox" par des "text", ça fonctionne très bien.


DM 22/12/2005

parenthèses et expression régulière

J'ai besoin de rechercher des parenthèses dans un texte, mais je ne trouve pas la syntaxe pour cela. En effet, même

si je mets une oblique devant le signe parenthèse: \( ou si je l'isole par des guillements "(", ou si je le place d'abord dans une variable, l'interpréteur renvoie un message d'erreur comme quoi il manque une parenthèse fermante. Mes recherches compulsives dans la documentation n'ont abouti à rien. Quelqu'un connait-il la solution? Merci DM.

dc

 set a "super (parentheses)"
 regexp {(\(.*\))} $a -> b

le parenthèsage sans contre-oblique est fait pour récupérer b, celui avec contre-oblique c'est pour correspondre aux parenthèses dans a.

DM. Merci, évidemment j'avais cherché l'erreur où elle n'était pas, c'était juste un problème de double controblique !


Escaladix : 25/10/05

Bonjour à tous,

Novice en Tcl/Tk, je l'utilise sur Windows, via cygwin. Ayant besoin de gérer les images, j'essaie d'installer le package "tkimg1.3" dont j'ai récupéré les sources sur sourceforge. Utilisateur de Windows principalement, les procédures d'installation sur Cygwin sont pour moi assez nouvelles.

J'ai décompressé tkimg1.3 La commande "configure && make -mno-cygwin all && make -mno-cygwin install" semble bien se passer (pas d'erreur notable), néanmoins, le package n'est pas installé correctement puisque les fichiers de démo produise une erreur: ils sont à la recherche du package Img.

Est-ce que je me trompe dans l'installation ou dans l'utilisation du package? Ai-je oublié une procédure quelconque?

A mon avis, l'installation se passe bien mais les packages ne s'installent pas au bon endroit. Quelle option permet de les faire s'installer au bon endroit (à mon avis c:\cygwin\lib ?)?

Merci de votre aide et désolé si la question vous semble mal posée ou un peu naïve mais il faut bien apprendre!

En attendant je vais continuer à essayer...

Rainbow-Six : Salut, pour être trouvée, ta librairie doit être dans un dossier contenu dans la variable "auto_path", place la dans le dossier ou sont les librairies de ton interpréteur (c:\cygwin\lib apparament) ou ajoute le dossier où tu l'as installée: en admettant qu'elle est dans "C:/Mon dossier/", tu feras alors "lappend auto_path "C:/Mon dossier/". Bonne chance !

aricb: Si les paramètres de votre projet le permettent, il me semble que la solution la plus simple serait d'utiliser ActiveTcl, qui comprend une version binaire du package Img. C'est sans doute la distribution la plus complète pour Windows (et Linux et Unix) et la plus facile à installer.

Escaladix : 27/10/05 Merci pour votre aide mais le problème semble plus profond. L'installation du package tkimg au bon endroit se fait que partiellement. En effet, la librairie principale "tkimg13.dll" est bien créée mais les librairies dll intermédiaires pour chaque format comme "tkimgjpeg13.dll" ou "tkimgpng13.dll" ne sont pas créées. Du coup l'exécution d'un script trouve le pacquage Img mais plante lors de l'appel des librairies spécifiques.

Quelqu'un a-t-il déjà installé le package "tkimg" avec succès via cygwin (puisque cette voie semble être prise en compte par l'auteur dans ses commentaires)?

Voir Asy pour une solution (très manuelle).

Merci pour vos informations

Escaladix : 21/11/05 Merci Asy pour cette aide précieuse.

Presque toutes les dll sont installées, il ne me reste que window, xpm, png et pixmap qui produisent des erreurs que je vais essayer de résoudre.

Encore merci.


matbam : 12 Septembre 2005 Salut a tous. J'ai un petit probleme qui consiste a redimensionner mon bouton d'image sans perdre des informations sur l'image. le code aue j'ai utilise est :

# voici mon code

  image create photo img1 -height 20 -width 20
  img1 configure -file images/image1.gif -format gif
  button $w.g.b1 -image img1 -height 20 -width 20
  grid $w.g.b1 -row 0 -column 0 -sticky news

l'image s'affiche bien mais je perds des informations sur l'image.

Merci d'avance.

ulis: Contrairement à ce que (je pense) tu imagines, Tk ne redimensionne pas automatiquement les images. Aussi ton image doit être tronquée : on n'en voit que le centre.

2 solutions :

redimensionner statiquement l'image avant usage par un outil disponible sur le net (c'est le plus efficace mais le moins souple) redimensionner dynamiquement l'image au moment de l'usage. Voici le début de la piste : Rétrécir une image, http://wiki.tcl.tk/ShrinkingAnImage, http://wiki.tcl.tk/TclMagick et LRIPhoto. matbam: Merci ulis de m'avoir apporte des reponses. j'essaye de d'utiliser la solution 2 mais ton lien ne marche pas. pourrait tu me filer un exemple de code qui fait cela.

merci d'avance

Kroc : TclMagik est une vraie plaie à compiler (donc c'est pire encore à distribuer). Je te conseille d'essayer avec LRIPhoto (tu as des exemples d'utilisation dans le petit programme de démonstration sur la même page). Pour l'exemple que tu donnes ci-dessus, tu peux faire comme ça :

 image create photo img1 -file images/image1.gif -format gif
 package require LRIPhoto
 if {[image width img1] > [image height img1]} {
     ::LRI::imgtransform img1 -scale [expr 100*20/[image width img1]]
 } else {
     ::LRI::imgtransform img1 -scale [expr 100*20/[image height img1]]
 }
 button $w.g.b1 -image img1
 grid $w.g.b1 -row 0 -column 0 -sticky news

ulis : désolé Kroc, mon cerveau un peu sénile a mis du temps pour voir que LRIPhoto était une solution au problème de matbam (il arrive un âge où les nouveautés vous passent au-dessus de la tête).

Kroc : Pas de problème Maurice, moi aussi il y a beaucoup de trucs qui me passent au-dessus de la tête ;)


seb : 03 Septembre 2005 - Salut à tous je suis nouveaux dans le TCL en faite je dois créer un script en TCL (bien évidemment!) pour faire du Web CallBack et ensuite le compiler avec FastIVR (il permet de faire tourner des script tcl sous Cisco) pour ceux qui connaisse.

Voila est-ce que quelqu'un pourrait me filer un petit coup de pouce ou me passer un lien utile pour bien démarrer. Merci d'avance à tous

ulis Je ne connais pas le Web Callback ni son utilité, mais un coup de filet sur Google m'a ramené cet URL : https://store.portaone.com/product_info.php?products_id=28

C'est le seul qui répondait correctement à la question "web callback tcl" mais ça n'a pas l'air donné...

Web Callback $399.95

An indispensable package for any company wishing to launch web callback services. Includes:


Guillaume Plenier, 01 Septembre 2005 Tcl sous MacosX

Suite de mes aventures avec mon script tcl...

question 1 Grace à l'aide de Kroc je dispose d'un starpack "windows" de mon application qui marche très bien sur tous les PC que j'ai pu tester. Après quelques modifications de mon script, j'ai voulu faire un starpack "macosx" en suivant les instructions pas à pas trouvées sur le web. J'ai alors le droit à un superbe "winfo command not found". J'ai essayé de faire un starpack "macosx" de l'application fractal.kit (pour voir si cela venait de mon code) et il semblerait que le tclkit "macosx" ne contienne pas Tk. Je suis donc retourné sur le web en pensant avoir téléchargé le mauvais tclkit, mais il est bien indiqué comme contenant Tk. Quelqu'un saurait-il ce qui cloche?

XG Pour ce que j'en sais, tclkit pour macosx contient Tk pour X11. Il faut donc qu'un serveur X soit lancé.

02/09/05 GP OK merci XG, effectivement, il faut faire tourner tclkit dans un terminal x pour que cela marche. Merci pour l'astuce. Par contre je me suis retrouvé confronté à mon deuxième problème pour pouvoir double cliquer sur mon fichier executable depuis finder. En fait il suffit de creer un fichier monprog.app Voilà, en espérant que cela servira à d'autres lecteurs.

question 2 Face au problème précédent, j'ai écrit un script shell pour installer TclAqua et mon programme sous Macosx. Si je vais dans un terminal et tape "wish monprog.tcl" il s'execute sans problème, mais si je double clic dans finder sur monprog.tcl, celui-ci ouvre wish mais ne lance pas mon script. Quelqu'un a-t-il une idée de comment je pourrais surmonter ce problème? Y a-t-il des equivalents aux fichiers .bat de windows sous Mac pour pouvoir excuter wish monprog.tcl en double clickant?

XG - Ca fonctionne aussi avec un fichier .command (ne pas oublier de le rendre exécutable)


Guillaume Plenier, 28 Juillet 2005

Pour ceux qui ne sont pas encore en vacances, j'ai une question très spécifique concernant les starkits. Dans le cadre de mon travail j'ai été ammené à developper une interface graphique de programmes compilés par une collègue. Je n'ai pas de soucis pour faire tourner mon script chez moi car les programmes de ma collègue sont dans mon path. Par contre je ne n'arrive pas à indiquer à mon script où aller chercher les executables dans mon starkit. Du coup si je fais un starpack de mon starkit et que je le fais tourner sur l'ordi d'une autre collègue qui n'a pas les programmes dans son path, j'ai le droit à un message d'erreur du style: "program" command not found

J'ai essayer plusieurs trucs pour rajouter mes executables à env(PATH) où encore d'utiliser starkit::topdir mais cela echoue.

L'un d'entre vous saurait-il comment m'aider? Merci d'avance pour votre aide, en espérant que quelqu'un lira ces lignes. Bien amicalement, Guillaume

Kroc Tu n'as pas le droit d'exécuter un programme à l'intérieur du VFS de ton starpack.

Solutions possibles :

- Si ça n'est pas un problème de laisser des traces : tu copies les exécutables de ton VFS vers le répertoire contenant le starpack avec une commande dans ce genre :

 file copy -force $::starkit::topdir/program.exe [file dirname $::starkit::topdir]

et c'est ce fichier copié que tu exécutes.

- Pour ne pas laisser de traces : tu copies d'abord l'exécutable dans un répertoire temporaire, tu l'exécutes depuis ce répertoire temporaire, puis tu l'effaces.

Guillaume Plenier 01/08/05,

Merci Kroc pour cette proposition de solution, mais cela me dérange de devoir copier mes executables depuis le starkit et de devoir les effacer ensuite. Cela fait beaucoup d'appels en lecture écriture sur le disque et je préfère éviter. Je pensais quíl pouvait exister un fichier .dll du style tcl84pip.dll (ou tclpip84.dll ?) qui aurait pu me dépanner. Tant pis les starkits ne sont pas la meilleure solution dans mon cas...

Je repasserai jeter un oeil de temps en temps si quelqu'un a un autre truc qui ferai mieux l'affaire. J'ai aussi posté cette meme question sur des sites anglophones et je vous tiendrai au courant.

A+ Guillaume


Robert Abitbol, 20 Mars 2005

Salut les amis français teclers d'outre-Atlantique,

J'ai déjà posé une question similaire mais je ne l'avais pas bien posée en fait. Voici une meilleure version.

Lorsque l'usager entre dans mon éditeur, il commence à taper... Il n'a pas encore sauvegardé donc on ne connaît pas le nom du fichier...

Je voudrais mettre une boîte à différents endroits. Les conditions dans lesquelles cette boîte apparaîtrait sont les suivantes:

 Si des caractères ont été entrés dans la boîte d'édition et si on ne
 lit pas un nom de fichier, demander à l'usager de sauvegarder...

Pour la première partie (caractères entrés dans la boîte d'édition) c'est OK 1000 fois Merci Ulis:

Ulis Pour cela, il faut utiliser la commande [pathName edit modified] qui renvoie un booléen indiquant si le texte est modifié ou non. Une fois la sauvegarde effectuée, la commande [pathName edit modified 0] remet le booléen à faux.

Et pour la deuxième partie.. Fichier non lu?

Miko une variable globale du genre fichier_en_cours pourrait faire l'affaire... si sa valeur est "", le fichier n'a pas été nommé, on invite l'utilisateur à le faire:

 if [string equal $fichier_en_cours ""] {
 tk_messageBox -message "veuillez enregistrer"
 }

pour ecrire dans la variable à l'ouverture d'un fichier:

 set fichier_en_cours [ tk_getOpenFile ]

Un grand merci et joyeux printemps à tous...

Robert Abitbol Voici le module en question.. Quoi faire précisément?

 proc ask.user.to.save.unnamed.file {} {

    if {[$::main_ht edit modified] || "" eq $::data_dir || "" eq
 $::current_node} {
    set ans [tk_messageBox -type yesnocancel -icon question \
                         -message "             Save text?\n Click  on   Yes if there is text to save\n     and if there is no file name\n   otherwise click on No"]
  if { $ans == "cancel" } {
       return
     } elseif { $ans == "yes" } {
  ask.to.save.if.needed}
  }
  }

ulis Voici un exemple :

  set ::text .txt
  set ::file ""

  # called on exit
  proc quit {} \
  {
    if {[$::text edit modified]} \
    {
      # text was modified: ask
      switch [saving?] \
      {
        yes     { if {[save]} { exit } ;# exit if saving ok }
        no      { exit                 ;# exit without saving }
      }
      # cancel or saving ko
      return
    } \
    else \
    {
      # text was not modified: don't ask
      exit
    }
  }

  # called to save
  proc save {} \
  {
    # check if file name empty
    if {$::file == ""} \
    {
      # ask for a file name
      set ::file [tk_getSaveFile -title "Saving text"]
      # disallow exiting if file name empty
      if {$::file == ""} { return 0 }
    }
    # try to save
    set rc [catch \
    {
      set fp [open $::file w]
      puts -nonewline $fp [$::text get 1.0 end-1c]
      close $fp
    } errmsg]
    # check if saved
    if {$rc} \
    {
      # can't save
      tk_messageBox -message $errmsg
      # disallow exiting
      return 0
    } \
    else \
    {
      # reset modified flag
      $::text edit modified 0
      # allow exiting
      return 1
    }
  }

  # called to ask for saving
  proc saving? {} \
  {
    set type yesnocancel
    set name $::file
    if {$name == ""} { set name text }
    set msg "$name was modified.\n"
    append msg "Saving before exiting?\n\n"
    append msg "Yes to exit after saving\n"
    append msg "No to exit without saving\n"
    append msg "Cancel to stop exiting\n"
    return [tk_messageBox -type $type -message $msg -icon question]
  }

  package require Tk

  text .txt -width 30 -height 10
  button .save -width 10 -text Save -command save
  button .quit -width 10 -text Quit -command quit
  grid .txt -columnspan 2
  grid .save .quit -padx 10 -pady 10
  .txt insert end "some text to save\nbefore exiting"

Robert Abitbol, Samedi 2 Avril 2005

Ici c'est un bug affreux et très difficile à cerner qui me donne des cheveux blancs et me fait vieillir prématurément de jour en jour, me fait me ronger les ongles à un tel point que mon bras va finir par ressembler à celui de la Vénus de Milo! :-)

Lorsque j'appuie sur la clef Arrière (Backspace), le caractère qui se trouve avant le curseur est effacé et là le curseur, dément se déplace d'un espace vers la droite.

Où se situe le problème? A Mark set insert ou à uplevel #0 ... delete insert?

Voici les lignes de code du module hypertext.instance proc.

   } else {
    #.w delete/insert n.n ?n.n?
    set old_cur [${w}_orig index insert]
    ${w}_orig mark set insert $i
    set s [${w}_orig index "insert linestart"]
    if {"insert" eq $cmd} {
     uplevel #0 [concat [list ${w}_orig] insert insert [lrange $args 2 end]]
    } else {
     uplevel #0 [concat [list ${w}_orig] delete insert [lrange $args 2 end]]
    }
    set e [${w}_orig index "insert lineend"]
    ${w}_orig mark set insert $old_cur
   }

Le $args value qui cause le problème semble être: delete insert-1c

Comment résoudre ce fameux problème?

Un grand merci à l'équipe de sauveteurs TCL/TK de l'Hexagone!

ulis Je ne suis pas sûr de comprendre ton code et ton problème. Aussi voici un petit script pour expérimenter. Il permet de supprimer une suite de caractères dans un widget text. Il accepte 0, 1 ou 2 indices, à saisir dans les deux widgets entry (attention : insert-1c ne permet pas de supprimer un caractère saut de ligne). Il permet de voir ce qui se passe pour le curseur ou pour les sélections à l'intérieur du widget text quand on supprime une suite de caractères.

Tu pourras ainsi vérifier que la procédure delete fait ce que tu désires et tu pourras l'adapter à ton besoin.

Juste un conseil de programmeur : essaye de simplifier les problèmes que tu rencontres (ici en séparant la fonction d'insert de la fonction de delete).

  proc delete {w {first ""} {last ""}} \
  {
    # delete chars from first to last - 1
    # if first omitted -> insert
    # if last omitted -> first + 1
    # try: first = 2.3 & last = 3.5
    # try: first = insert-1c
    if {$first == ""} \
    {
      set first [$w index insert]
    }
    if {$last == ""} \
    {
      set index [$w index $first]
      foreach {line col} [split $index .] break
      set last $line.[incr col]
    }
    $w delete $first $last
  }

  package require Tk

  label .lfirst -text first -width 6
  entry .efirst -width 10
  label .llast -text last -width 6
  entry .elast -width 10
  text .t -width 40 -height 6
  button .b -text delete -width 10 \
    -command {delete .t [.efirst get] [.elast get]}
  foreach i {1 2 3 4 5} \
  { .t insert end "$i- example line of text\n" }
  grid .lfirst .efirst .llast .elast -pady 5
  grid .t -columnspan 4
  grid .b -columnspan 4 -pady 5

Une dernière remarque : dans la doc du widget texte il est dit d'une manière sybilline qu'il ne faut pas supprimer le dernier caractère saut de ligne. Il serait peut-être sage de le rajouter s'il est supprimé (si [$w get end] != "\n"). Eventuellement d'éviter de le supprimer mais alors là ça devient plus complexe (il faut comparer $last avec [$w index end] éventuellement en séparant la ligne et la colonne des deux index; cf. l'initialisation de last).

Un dernier conseil : rajouter [$w see insert] pour s'assurer que le curseur est toujours visible.

Miko il faut commenter:

 #${w}_orig mark set insert $old_cur

qui restaure la position du curseur antJL