IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Perl Discussion :

messageBox fait disparaître la sélection


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut messageBox fait disparaître la sélection
    Bonjour.
    Si une partie d'un widget Text est sélectionnée et qu'un messageBox s'affiche, la sélection est inapparente pendant l'affichage du messageBox.
    Dans l'exemple qui suit, ce n'est pas bien grave, parce que l'utilisateur n'a pas de choix à faire, mais dans un programme un peu plus complexe, le messageBox ou un autre pop-up pourrait présenter à l'itilisateur des choix à faire compte tenu de ce qui est sélectionné.
    Noter que, dans le programme qui suit, l'option exportselection du widget Text est mise sur zéro, mais cela n'empêche pas la sélection d'être perdue par le widget Text tant que le messageBox est affiché.
    Quelqu'un a-t-il une idée ? Merci d'avance.

    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
     
    use Tk;
    use strict;
    use warnings;
     
    my $mw = MainWindow->new;
     
    my $hauteurEcran = $mw->screenheight();
    my $largeurEcran = $mw->screenwidth();
     
    $mw->configure(
                   -width => $largeurEcran,
                   -height => $hauteurEcran,
    );
     
     
    $mw->title("Test selection");
    $mw->geometry(sprintf("%d",$largeurEcran) . "x" . sprintf("%d", $hauteurEcran) . "+0+0");
    $mw->raise();
     
    my $zoneTexte = $mw->Scrolled('Text',
                               -scrollbars => 'se',
                               -wrap => 'word',
                               -exportselection => 0,
                             )->place(
                               -anchor => 'nw',
                               -width => $largeurEcran,
                               -relheight => 0.95,
                               -relx => 0.0,
                               -rely => 0.05,
                              );
     
    $zoneTexte->insert('end', "abc");
    $zoneTexte->tagAdd('sel', '1.0', 'end');
    $zoneTexte->focus;
     
    $zoneTexte->messageBox(-title => 'Test Selection',
                                        -message => "Do you see the selection ?",
                                        -type => 'OK',
                               );
     
     
    MainLoop;

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Le comportement est normal, car ta boite de dialogue a le focus. Et ton widget texte perd le focus et le bleu de sélection tant qu'il ne le retrouve pas.

    Faudrait donc opter pour une autre logique, si tu souhaites que l'utilisateur visualise le texte à modifier. ou voir si quelque chose est à activer (fouiller le CPAN).

    Pour contrer ce comportement, j'utilise la méthode bind.

    Je t'ai fait un exemple en manipulant les marqueurs et ça marche très bien.

    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
    use Tk;
    use strict;
    use warnings;
     
    my $mw = MainWindow->new;
     
    my $hauteurEcran = $mw->screenheight();
    my $largeurEcran = $mw->screenwidth();
     
    $mw->configure(
                   -width => $largeurEcran,
                   -height => $hauteurEcran,
    );
     
     
    $mw->title("Test selection");
    $mw->geometry(sprintf("%d",$largeurEcran) . "x" . sprintf("%d", $hauteurEcran) . "+0+0");
    $mw->raise();
     
    my $zoneTexte = $mw->Scrolled('Text',
                               -scrollbars => 'se',
                               -wrap => 'word',
                               -exportselection => 0,
                             )->place(
                               -anchor => 'nw',
                               -width => $largeurEcran,
                               -relheight => 0.95,
                               -relx => 0.0,
                               -rely => 0.05,
                              );
     
    $zoneTexte->insert('end', "abc");
    $zoneTexte->tagAdd('sel', '1.0', '1.0 lineend');
    $zoneTexte->focus;
     
    TagsTexteSelection($zoneTexte);
     
    $zoneTexte->messageBox(-title => 'Test Selection',
                                        -message => "Do you see the selection ?",
                                        -type => 'OK',
                               );
     
     
    MainLoop;
     
    sub TagsTexteSelection {
      my $WidgetText = shift;
     
      # Creation des tags pour les textes sélectionnés ou non
      $zoneTexte->tagConfigure('TextSelectionne', 
        -background => "red",   # blue
        -foreground => "green", # white
      );
      $zoneTexte->tagConfigure('TextNonSelectionne', 
        -background => $zoneTexte->cget( -background ),
        -foreground => $zoneTexte->cget( -foreground ),
      );
     
     
      # Si ma zone de texte obtient le focus
      $zoneTexte->bind("<FocusIn>", 
        sub { 
          my @Listes = $zoneTexte->tagRanges('TextSelectionne');
          # On enleve le tag aux textes sélectionnés
          $zoneTexte->tagRemove('TextSelectionne', @Listes);
        }   
      );
     
      # Si ma zone de texte perd le focus
      $zoneTexte->bind("<FocusOut>", 
        sub { 
          # On attribut le tag aux textes sélectionnés
          if ( $zoneTexte->tagRanges('sel') ) {
            $zoneTexte->tagAdd('TextSelectionne', 'sel.first', 'sel.last');
          }
        }   
      );
    return;
    }
    Dans la procédure, tu peux changer les couleurs comme tu le souhaites, c'était juste pour te montrer le comportement. Tu peux d'ailleurs attribuer les mêmes couleurs de celui de la sélection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      $zoneTexte->tagConfigure('TextSelectionne', 
        -background => "red",   # blue
        -foreground => "green", # white
      );

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Merci beaucoup. Cela marche très bien, en effet.

    Ce qui m'étonne, c'est que si on met l'option exportselection d'une ListBox sur 0, un item sélectionné de cette Listbox reste sélectionné même si l'utilisateur donne le focus à un widget Text de la même application (alors que l'item de la Listbox ne reste pas sélectionné dans ce cas si l'option exportselection de la Listbox est sur 1). Pourquoi "exportselection => 0" n'a-t-il pas le même effet avec un widget Text qu'avec une ListBox ?

    En tout cas, je crois que je vais adopter ta solution. Elle me réconcilie avec Perl Tk.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    C'est vrai que je ne comprends pas le comportement de exportselection avec les texte, est ce dû au fait que l'on utilise Scrolled !!!

    A creuser

Discussions similaires

  1. Réponses: 12
    Dernier message: 06/09/2013, 10h06
  2. Réponses: 2
    Dernier message: 06/11/2009, 09h36
  3. Tween fait disparaître le text
    Par julien.63 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 04/10/2009, 13h59
  4. suppression d'un tablespace le fait disparaître de la sauvegarde
    Par sara_sihem dans le forum Administration
    Réponses: 4
    Dernier message: 30/03/2009, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo