2010-09-01 3 views
2

Par exemple, dans le script suivant:Comment activer un élément de menu contextuel désactivé lorsque la sélection se produit dans un Perl Tk gui?

use Tk; 

my $mw = new MainWindow; 
my $t = $mw->Scrolled("Text")->pack; 

my $popup = $mw->Menu(
    -menuitems => [ 
     [ 
      Button => 'Copy Selected', 
      -state => "disabled", 
      -command => sub {$t->clipboardColumnCopy} 
     ], 
    ] 
); 
$t->menu($popup); 

MainLoop; 

Comment puis-je dire lorsque la sélection se trouve que je peux utiliser le code suivant

$popup->entryconfigure(1, -state=>'normal'); 

changer l'état de l'élément de menu?

MISE À JOUR:

Un grand merci à @Chas et @gbacon :)

Je pense que je peux peut-être combiner les deux bonnes réponses:

$t->bind(
    "<Button1-ButtonRelease>", 
    sub { 
     local [email protected]; 
     my $state = defined eval { $t->SelectionGet } ? 
      "normal" : "disable"; 
     $popup->entryconfigure(1, -state => $state) 
    } 
); 

Répondre

2

Je ne sais pas très Tk bien, mais c'est une réponse (mais peut-être pas la bonne réponse):

#!/usr/bin/perl 

use strict; 
use warnings; 

use Tk; 

my $mw = new MainWindow; 
my $t = $mw->Text->pack; 


my $popup = $mw->Menu(
    -menuitems => [ 
     [ Button => 'Copy Selected', -state => "disabled", -command => sub {$t->clipboardColumnCopy} ], 
    ] 
); 
$t->menu($popup); 

$t->bind(
    "<Button1-ButtonRelease>", 
    sub { 
     my $text = $t->getSelected; 
     if (length $text) { 
      $popup->entryconfigure(1, -state => 'normal'); 
     } else { 
      $popup->entryconfigure(1, -state => 'disabled'); 
     } 
    } 
); 

MainLoop; 
+0

Owens, merci beaucoup! Je n'ai jamais pensé utiliser la liaison d'événement, mais cela fait très bien l'affaire. Merci :) – Mike

2

Quelques ch anges produisent le comportement que vous voulez. Le code ci-dessous montres <ButtonPress-1> qui peut effacer la sélection et si c'est le cas, désactive la copie sélectionnée. Pour <ButtonPress-3>, il active l'élément de menu si une sélection est présente.

my $copySelectedLabel = "Copy Selected"; 
my $popup = $mw->Menu(
    -menuitems => [ 
     [ 
      Button => $copySelectedLabel, 
      -state => "disabled", 
      -command => sub {$t->clipboardColumnCopy} 
     ], 
    ] 
); 

sub maybeEnableCopySelected { 
    local [email protected]; 
    $popup->entryconfigure($copySelectedLabel, -state => "normal") 
    if defined eval { $t->SelectionGet }; 
} 

sub maybeDisableCopySelected { 
    local [email protected]; 
    $popup->entryconfigure($copySelectedLabel, -state => "disabled") 
    unless defined eval { $t->SelectionGet }; 
} 

$t->bind('<ButtonPress-1>' => \&maybeDisableCopySelected); 
$t->bind('<ButtonPress-3>' => \&maybeEnableCopySelected); 
$t->menu($popup); 
+0

Je vois le point de vérifier si SelectionGet est défini. Merci beaucoup! Mais il y a quelque chose de bizarre. Même une fois la sélection terminée, ButtonPress-3 n'activera pas Copy Selected immédiatement. Je vais devoir bouger la souris un petit peu et BUttonPress-3 à nouveau pour finalement activer Copy Selected. Je n'ai aucune idée de pourquoi cela se passe. Ou peut-être parce que je cours ActivePerl sur Windows? Merci quand même :) – Mike

+0

@Mike J'ai testé sur Linux, pas Windows, et il s'est comporté correctement. C'est une incompatibilité frustrante, mais il semble que vous ayez une solution qui fonctionne, alors allez-y! –

Questions connexes