Here is one way, but if you want to delete from a list, you may be better off going with a Listbox widget. Do you really need a Label and Entry side by side? This example could be made to select multiple checkboxes first, then delete them all at once. OR, you could work out
a mouse binding to do the delete, instead of a checkbox.
#!/usr/bin/perl
# only moderately tested !!!!!!
use warnings;
use strict;
use Tk;
use Tk::Pane;
use Data::Dumper;
my %hash;
while (<DATA>) {
chomp;
if(length $_){
( my ( $key, $val ) = split /,/ );
$hash{$key} = $val;
}
}
#print Dumper(\%hash);
my $mw =MainWindow-> new (-title => "Demo");
$mw->geometry('340x300');
my $frame_tl= $mw->Scrolled('Pane',
-scrollbars => 'se',
)->pack(-expand => 1, -fill => 'both');
my %f;
for my $key (sort keys %hash){
$f{$key}{'frame'}= $frame_tl->Frame(-borderwidth =>2, -relief=> 'gr
+oove')
->pack(-side => 'top', -fill => 'x');
$f{$key}{'checkbox'}= $f{$key}{'frame'}->Checkbutton(
-text=> $key,
-command=> sub{ &del_it($key) },
)->pack(-side => 'left', -fill => 'y');
$f{$key}{'label'} = $f{$key}{'frame'}->Label(-relief => 'groove',-t
+ext=>" $key " )
->pack(-side => 'left', -fill => 'y');
$f{$key}{'entry'}= $f{$key}{'frame'}->Entry(-takefocus => 1,-width
+=> 60, -textvariable=> \$hash{$key})
->pack(-side => 'left', -fill => 'y');
}
MainLoop;
sub del_it{
my $key = shift;
my $frame = $f{$key}{'frame'};
my @w = $frame->packSlaves;
foreach (@w) { $_->packForget; }
$frame->packForget;
$frame_tl->update;
$mw->update;
}
__DATA__
123,ABC
345,CDE
546,MDJ
987,ASD
543,kjf
937,dhy
098,sdf
867,mnb
321,jhg
567,fgh
834,ctg
912,xcv
You might be able to use a listbox easier. A simple example.
#!/usr/bin/perl
use strict;
use Tk;
my $selected_text;
my $mw = tkinit;
my $lb = $mw->Scrolled(
"Listbox",
-scrollbars => "e",
-selectmode => "single",
)->pack;
$mw->Label( -textvariable => \$selected_text )->pack;
$lb->insert( 'end', qw/w2200 w2465 W2475 W2420/ );
$lb->bind(
'<Button-1>',
sub {
# I don't use an array because -selectmode eq 'single'
my $selection_index = $lb->curselection();
if ( $selection_index eq '' ) {
$selected_text = "Nothing selected";
}
else {
$selected_text = $lb->get($selection_index);
$lb->delete($selection_index);
}
}
);
MainLoop;
|