There are a few ways to do it, and it usually depends on what widget you are working with. Often some widgets have built-in bindings for Button-1, so you need to use a Button-2 or Button-3 binding. Basically, you just pop a menu at the pointerx, pointery location. There are so many ways to do it, that you need to show what code you are using. As a last resort, you can open a small toplevel window at the pointer location, and load it with whatever you desire.
#!/usr/bin/perl
use warnings;
use strict;
use Tk;
my $mw = MainWindow->new;
$mw->title("Listbox");
# For example purposes, we will use one word for each letter
my @choices = qw/alpha beta charlie delta echo foxtrot golf hotel
india juliet kilo lima motel nancy oscar papa quebec radio sierra
tango uniform victor whiskey xray yankee zulu/;
#Create the text box and insert the list of choices in to it
my $lb = $mw->Scrolled("Listbox", -scrollbars => "osoe",
-height => 20,
-selectmode => "multiple")
->pack(-side => "left");
$lb->insert("end", sort @choices);
my $m = $lb->Menu(-tearoff => 0,-title=>'None',
-menuitems =>
[
[Button => "Delete", -command => \&do1],
[Button => "Rename", -command => \&do2],
]
);
$lb->bind("<Button-3>" => [ sub {
$lb->focus; # focus on listbox widget
my($w, $x, $y) = @_;
$m->post($x, $y);
}, Ev('X'), Ev('Y') ] );
$mw->Button(-text => "Exit",
-command => sub{exit; })->pack(-side => "bottom");
$mw->Button(-text=>"View", -command => sub {
foreach ($lb->curselection()) {
print "$choices[$_]\n";
}
})->pack(-side => "bottom");
MainLoop;
# Popup menu actions.
sub do1{
my @sels = $lb->curselection();
print "@sels\n";
@sels = map $choices[$_],@sels;
print "action do1->@sels\n";
}
sub do2{
my @sels = $lb->curselection();
print "@sels\n";
@sels = map $choices[$_],@sels;
print "action do2->@sels\n";
}
| [reply] [d/l] |
| [reply] |