Bonjour, et pardon me revoilà avec mes chaînes arabes
Pour simplifier je pars de l'exemple donné dans Perl/Tk de Nancy Walsh p176.
Dans la gestion des claviers sous Windows7 j'ai ajouté un clavier arabe (101) Égypte, mais peu importe lequel.
Constats :
- Lorsque je charge le fichier toto.txt :
- les chaînes utf8 sont correctes,
- la chaîne arabe est décalée vers la gauche,
- lorsque je place le focus de clavier en début de chaîne arabe (à droite) il semble y avoir des caractères intercalés, "de gestion ?"
- lorsque je clique sur la chaine arabe elle se trouve désorganisée, en cliquant en fin de chaîne (à gauche) elle retrouve sa forme correcte.
- Si je démarre avec un scrolled vide :
- lorsque je saisis des caractères avec le clavier arabe un "caractère de gestion ?" est ajouté sur la droite de la chaîne pour chaque caractère saisi,
- si je sauvegarde dans un fichier titi.txt et que je le lis avec Notepad ou Ultraedit il est correct ! pas de caractères supplémentaires !
- j'en déduis qu'il ne s'agit qu'un d'un problème d'affichage dans le scrolled.
Questions :
- existe t-il une possibilité d'afficher correctement des chaînes arabes dans un scrolled, éventuellement en gérant les indices ? mais là ce n'est pas de mon niveau, et ce doit être lourd...
ET/OU :
- est-il possible d'invalider (au moins) le clic gauche de la souris dans le scrolled ? TOUT en conservant la possibilité de scroller avec l’ascenseur vertical à tant que faire !
MERCI d'avance !
J'ai bien essayé avec çà trouvé sur le net :
C'est OK sur une Listbox : le undef est brutal -> ET plus possible de scroller!.. mais sur un Scrolled ça fait QUE DALLE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ... $mw->bind('<ButtonRelease-1>' => \&print_keysym); $t->bindtags(undef); ... MainLoop; ... sub print_keysym { my($widget) = @_; my $e = $widget->XEvent; # get event object my($keysym_text, $keysym_decimal) = ($e->K, $e->N); print "keysym=$keysym_text, numeric=$keysym_decimal\n"; # $widget->bindtags(undef); }
NB : Mon besoin est limité, je n'ai pas besoin de modifier le texte dans le scrolled. Un Scrolled en ROText ne résout aucun des deux pb. J'ai fait un essai avec une Listbox en remplacement d'un scrolled :
- là les chaînes arabes sont correctes, pas de scissions ni de caractères supplémentaires, mais :
- justification à gauche seulement
- en cas de chaînes longues il faut prévoir un scroll horizontal : pas terrible pour lire...
Voici les éléments du mini essai :
Dans un fichier toto.txt en utf8 j'ai les 3 chaînes suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 #!/usr/bin/perl # # Saisie arabe # use warnings; use strict; use utf8; use Encode; use encoding 'utf8'; use Tk; my ( $nom_fic, $t, $Ligne, $line, $texte, $info ) = (); my $Wm = MainWindow->new; my $IN_Fic = "lolo.txt"; # Crée les widgets nécessaires my $cadre =$Wm->Frame->pack( -side => 'top', -fill => 'x'); $cadre->Label( -text => "Nom du fichier : " )->pack(-side => 'left', -anchor => 'w'); $cadre->Entry( -textvariable =>\$nom_fic )->pack(-side => 'left', -anchor => 'w', -fill => 'x', -expand => 1); $cadre->Button( -text => "Fin", -command => sub { exit; } )->pack(-side => 'right'); $cadre->Button( -text => "Sauvegarder", -command => \&sauve_fic )->pack(-side => 'right', -anchor => 'e'); $cadre->Button( -text => "Charger", -command => \&lire_fic )->pack(-side => 'right', -anchor => 'e'); $cadre->Label( -textvariable =>\$info, -relief => 'ridge' )->pack(-side => 'bottom', -fill => 'x'); $texte = $Wm->Scrolled("Text" )->pack(-side => 'bottom', -fill => 'both', -expand => 1); $texte->tagConfigure('gras', -font => "{Simplified Arabic} 24 {bold}", -justify => 'right',); MainLoop; # Lire sub lire_fic { my $info = "Chargement du fichier '$IN_Fic..."; #my $texte->delete("1.0", "end"); if (!open(FIC, "$nom_fic")) { $t->insert("end", "ERREUR : Impossible d'ouvrir $nom_fic\n"); return; } while (<FIC>) { $line = $_ ; $texte->insert("end", $line ,'gras'); $texte->insert("end","\n"); } close (FIC); $info = "Fichier '$IN_Fic' charg."; } # Sauve sub sauve_fic { $info = "Sauvegarde de '$IN_Fic'..."; open (FIC, ">$IN_Fic"); binmode(FIC, ":utf8"); print FIC $texte->get("1.0", "end"); $info = "Fichier '$IN_Fic' sauvegard."; }
Farid se lève.
فَرِيد يَشْرَبُ الْمَاء
Farid boit de l'eau.
Partager