in reply to Re^2: Perl/TK listbox question
in thread Perl/TK listbox question

Would you believe that I wanted to give the OP some experience sorting thru lousy long variable names? :-)

To be honest, it was early, and I just pasted the first example I came across, but now that I look closer, it does have alot of fluff in it. :-)

But in my defense, I had a simple non-complicated example like yours, BUT, the OP claimed unfamiliarity with pTk, so I wanted an example that was very elementary, showing each step in excruciating newbie detail....... the adding to the listboxes, and how to get both selections with a button(or command). Also, your for() syntax is clever, but not standard, and I would hate to have a new user thinking that was a good template for setting up listboxes.

Here is how I would do a rewrite

#!/usr/bin/perl use warnings; use strict; use Tk; my $mw = MainWindow->new(); my $f = $mw->Frame( -border => 1 )->pack( -side => "left", -fill => "b +oth" ); #just manipulate arrays to change lists my @list1 = ( 'a' .. 'z' ); my @list2 = ( 1 .. 100 ); my $list1 = $f->Scrolled( "Listbox", -listvariable => \@list1, -scrollbars => "osoe", -exportselection => 0, -selectmode => "extended" )->pack( -fill => 'both' ); my $list2 = $f->Scrolled( "Listbox", -listvariable => \@list2, -scrollbars => "osoe", -exportselection => 0, -selectmode => "extended" )->pack( -fill => 'both' ); $mw->Button( -text => "Selections", -command => sub { my $selected1 = $list1->get( $list1->curselection ); my $selected2 = $list2->get( $list2->curselection ); print "selected-> $selected1 $selected2\n"; } )->pack( -side => 'left' ); $mw->Button( -text => "Exit", -command => sub { exit } )->pack; MainLoop;

I'm not really a human, but I play one on earth. Cogito ergo sum a bum

Replies are listed 'Best First'.
Re^4: Perl/TK listbox question
by tallwithblueeyes (Novice) on Jun 06, 2010 at 03:37 UTC

    Thanks for your replies. Unfortunately, for reasons beyond my control, Win32::GUI is not available for me to use. What I did was take the advice of both anonymous monk and Khen1950fx, and modify the Perl module MListbox.pm:

    First I added Control-c capabilities. Note that I need to account for lower case 'c' and upper case 'C', for when capslock is turned on:

    sub ClassInit { my ($class,$mw) = @_; $mw->bind($class,'<Configure>',['_yscrollCallback']); $mw->bind($class,'<Down>',['_upDown',1]); $mw->bind($class,'<Up>', ['_upDown',-1]); $mw->bind($class,'<Shift-Up>', ['_extendUpDown',-1]); $mw->bind($class,'<Shift-Down>',['_extendUpDown',1]); $mw->bind($class,'<Control-Home>','_cntrlHome'); $mw->bind($class,'<Control-End>','_cntrlEnd'); $mw->bind($class,'<Shift-Control-Home>',['_dataExtend',0]); $mw->bind($class,'<Shift-Control-End>',['_dataExtend',Ev('index', +'end')]); $mw->bind($class,'<Control-slash>','_selectAll'); $mw->bind($class,'<Control-backslash>','_deselectAll'); $mw->bind($class,'<Control-c>','_copyAll'); $mw->bind($class,'<Control-C>','_copyAll'); }

    Then I added the following subroutine to the MListbox.pm module. Assuming I was using Khen1950fx's example, if I wanted to be copying column #6 to the clipboard:

    sub _copyAll { my ($w) = @_; my @sel = $w->curselection; if (scalar(@sel) > 0){ $w->clipboardClear; foreach(@sel){ my ($name) = ($w->getRow($_))[6]; $w->clipboardAppend($name); } } }

    A bit clunkish, but gets the job done. Any faster ways you can think of to get the stuff copied to the clipboard without going through a loop?