[Tk] Largeur d'un Text box

Largeur d'un Text box [Tk] - Perl - Programmation

Marsh Posté le 26-05-2006 à 23:07:38    

Bonjour  :)  
 
Je suis en train de developper une sorte de "Crypto" notpad, un editeur de base pour resoudre des cryptogrammes.
 
Je souhait afficher dans un text box une ligne de texte chiffrer et en dessou un "-" pour chaque caractere encore non deviné, ou sinon la lettre qui lui correspond.
 
Pour cela, je dois recuperer la largeur du textbox en caracteres, pour afficher la ligne de text puis la ligne du genre "---e-- --e-".
 
je sai comment recuperer la largeur en pixel, mais je n'est rien trouver pour transformer les pixels en unites de caracteres, ni avec google, ni dans la doc de Tk.
 
Je vous remercie d'avance


Message édité par etranger le 26-05-2006 à 23:25:40
Reply

Marsh Posté le 26-05-2006 à 23:07:38   

Reply

Marsh Posté le 26-05-2006 à 23:51:23    

tu peux recuperer le string lui meme, et utiliser length() pour avoir sa longueur

Reply

Marsh Posté le 27-05-2006 à 00:07:55    

j'y est penser, mais malheureusement, la ligne 1 ne designe pas la premiere ligne afficher sur mon Text box, mais plutot la premiere ligne qui se termine par un "\n", c'est a dire que si tout le text ne contient aucun retour a la ligne, tout le texte est la ligne 1  :pt1cable:


Message édité par etranger le 27-05-2006 à 00:09:19
Reply

Marsh Posté le 27-05-2006 à 16:08:54    

il me semble que tu a de quoi mesurer en pixel la largeur d'une chaine donnée avec une font donnée dans Tk::Font, donc tu pourrais retomber sur tes pieds avec ca

Reply

Marsh Posté le 27-05-2006 à 19:09:45    

Merci pour ta reponce  :)  
 
J'ai tanté cette solution :

Code :
  1. sub mesureL{
  2.              my ($t,$i);
  3.              $i=1;
  4.              $t=substr($text,$i,1);  #$text contient le text du TextBox
  5.              while($text_box->fontMeasure($text_box->Font,$t) < $text_box->Width)
  6.              {
  7.                   $i++;
  8.                   $t.=substr($text,$i,1);
  9.              }
  10.              #print length($t);
  11.              return length($t);
  12.            }


 
mais malheureusement, la valeur de retour est toujour inferieure (la difference varie d'apres la largeur du text box)  :pt1cable:  
 
je me demande si je ne devrait pas recommancer mon projet en Java .


Message édité par etranger le 27-05-2006 à 19:10:17
Reply

Marsh Posté le 27-05-2006 à 20:02:13    

Si tu veux rester en perl tu a d'autre GUI: GTK2 (mal documenté, il faut utiliser la doc de la lib C), WxWidget, Win32 GUI, etc.
 
Mais explique exactement ce que tu veux faire, car je ne comprend pas tout: tu dis vouloir afficher une ligne mais tu a des \n ?
Si c'est juste une ligne pouquoi ne pas utiliser en simple entry?
Esque le fait d'utiliser une font à espacement constant pourrait t'aider?

Reply

Marsh Posté le 27-05-2006 à 20:34:33    

Voila en fait ce que je veut faire : http://etranger.webspace4free.biz/Capture01.jpg
 
pour faire cet effet, je commance par recuperer le texte d'un fichier, puis j'enleve tout les \n, les retoures a la lignes se font donc automatiquement lorce que le texte attaint la largeur maximale du text box.
 
Donc pour pouvoir afficher le texte comme dans l'image du haut, il me faut la largeure du text box , suposont que ce soit 40 caracteres.
 
je prend les premieres 40 caracteres de mon texte et je creer une autre chaine de caracteres formees de '-' pour chaques lettre du texte originale, ou d'un espace pour les espaces. Ensuite, pour resoudre un cryptogramme, si je veux echanger les E par des n, j'echangerait les '-' sous les E par des n.
 
mais pour que le texte ne soit pas decaller, il faut que je sache la largeur du text box, sinon les n (par exemple) ne seront pas sous les E.
 
un peu difficille a expliquer mais j'espert que tu aura compris, en tout cas merci  :)
 
PS: j'utilise Tk parce que je la connait deja, et surtout parcequ'elle est installer par defaut sur la plupart des distributions de perl (ActiveState et ma distrib standard sur mandriva 10).


Message édité par etranger le 27-05-2006 à 21:22:18
Reply

Marsh Posté le 27-05-2006 à 21:05:13    

je ne peux pas voir ton image (visiblement il faut etre membre de developpez.net)


Message édité par pospos le 27-05-2006 à 21:05:28
Reply

Marsh Posté le 27-05-2006 à 21:24:24    

ou encore http://www.speedsurf.to/etranger/Capture01.jpg

Reply

Marsh Posté le 27-05-2006 à 21:37:48    

ok je vois
 
tu dis que fontMeasure te retourne toujours un truc un peu inferieur, mais pourquoi ne pas forcer le retour ligne en ajoutant un petit \n, en gardant quelques characteres de marge sur la droite de ta textbox ?

Reply

Marsh Posté le 27-05-2006 à 21:37:48   

Reply

Marsh Posté le 27-05-2006 à 21:39:14    

en plus comme ca ca te permet de garder tes groupes de 5 lettres sur une meme ligne

Reply

Marsh Posté le 27-05-2006 à 23:00:49    

effectivement, sa me semble une bonne option.
 
en tout cas merci beaucoup pour ton aide  :)  :hello:
 
PS: apres avoir tester sous linux, je croi que je vais opter pour java, car le resulta est totalement faux.


Message édité par etranger le 27-05-2006 à 23:19:20
Reply

Marsh Posté le 28-05-2006 à 00:45:14    

ca marche sous windows et non sous linux?
A mon avis c'est du à des versions differentes de Tk

Reply

Marsh Posté le 28-05-2006 à 00:53:05    

oui surement

Reply

Marsh Posté le 28-05-2006 à 01:07:23    

ce genre de truc peut aussi arriver si la machine windows est configurée en "grandes polices" (comme c'est souvent le cas des portables)

Reply

Marsh Posté le 05-06-2006 à 19:35:20    

Une personne a fini par me trouver une solution sur un news groupe, je la poste afin que tout le monde puisse en béneficier :

Code :
  1. use Tk;
  2. use Tk::Dialog;
  3. use Tk::Text;
  4. use Tk::Font;
  5. my $mw = MainWindow->new(-title => "Essai" );
  6. my $text = $mw->Text(-height => 20,
  7.      -width => 40,
  8.      -wrap => 'char',
  9.      -font => "courier"
  10.      )->pack(qw/-expand 1 -fill both/);
  11. my $font = $text->cget('-font');
  12. my $bw = $text->cget('-borderwidth');
  13. my $padx = $text->cget('-padx');
  14. $mw->Button(-text => "Show",
  15.     -command => sub {
  16.       print "Width: ", $text->width, "\n";
  17.       my $size = 0;
  18.       my $cont = 1;
  19.       while ($cont) {
  20. $size++;
  21. my $twi = $font->measure("0" x $size);
  22. $cont = ($twi < $text->width - 2 * $bw - 2 * $padx);
  23.       }
  24.       $size--;
  25.       print "Largeur: $size\n";
  26.     })->pack;
  27. $mw->Button(-text => "Quit", -command => sub { exit })->pack;
  28. MainLoop;


 
Merci a toi propos pour t'etre pancher sur mon probleme  :)


Message édité par etranger le 05-06-2006 à 19:36:05
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed