Araviz has asked for the wisdom of the Perl Monks concerning the following question:

I have a listbox with several entries. An operation will be performed on the selected entry when a button is pushed. I'd like to know if the user has in fact selected an entry before I try to execute the operation. All my attempts have continued to generate the above error. Is there a way to compare the return of the curselection function without this error?

#!/usr/bin/perl -w use warnings; use strict; use Tk; my @lst_files = (0...10); my $file; my $mw = new MainWindow; my $frm1 = $mw -> Frame(-bg=>'LightSkyBlue1') -> pack(-fill => 'x'); my $frm11 = $frm1 -> Frame(-bg=>'LightSkyBlue1')->pack(-fill => 'x'); my $lst = $frm11 -> Scrolled('Listbox', -width => 50, -height => 5, -scrollbars => 'oe', -selectmode => 'single' ) -> pack(-side => 'bottom'); $frm1 -> Button(-width => 15, -text => "fill", -command =>\&fill_boxes +) -> pack(-side => 'top'); $frm1 -> Button(-width => 15, -text => "print", -command =>\&sample) - +> pack(-side => 'top'); MainLoop; sub fill_boxes { $lst -> delete ('0.0', 'end'); $lst -> insert('end', @lst_files); } sub sample { if($lst->curselection ne '') # <- Error msg points here { #Extract Application File Selection $file = $lst -> get($lst -> curselection); print "$file\n"; } # and then more happens }

Replies are listed 'Best First'.
Re: Can't call method "curselection" on an undefined value
by GrandFather (Saint) on Apr 13, 2011 at 02:48 UTC

    If no selection is made $lst->curselection is undefined. Adding:

    return if ! defined $lst->curselection;

    as the first line of sample will avoid the problem. However I strongly recommend that you refactor your code to completely avoid global variables. Consider:

    #!/usr/bin/perl -w use warnings; use strict; use Tk; main(); sub main { my @lst_files = (0 ... 10); my $file; my $mw = new MainWindow; my $frm1 = $mw->Frame(-bg => 'LightSkyBlue1')->pack(-fill => 'x') +; my $frm11 = $frm1->Frame(-bg => 'LightSkyBlue1')->pack(-fill => 'x +'); my $lst = $frm11->Scrolled( 'Listbox', -width => 50, -height => 5, -scrollbars => 'oe', -selectmode => 'single' )->pack(-side => 'bottom'); $frm1->Button( -width => 15, -text => "fill", -command => sub {fill_boxes($lst, \@lst_files, @_)} )->pack(-side => 'top'); $frm1->Button( -width => 15, -text => "print", -command => sub {sample($lst, @_)} )->pack(-side => 'top'); MainLoop; } sub fill_boxes { my ($lst, $lst_files) = @_; $lst->delete('0.0', 'end'); $lst->insert('end', @$lst_files); } sub sample { my ($lst) = @_; return if ! defined $lst->curselection; if ($lst->curselection ne '') { #Extract Application File Selection my $file = $lst->get($lst->curselection); print "$file\n"; } # and then more happens }

    You can achieve similar results using OO techniques, but the important part is to ensure you pass the correct variables through to your callback routines.

    True laziness is hard work
      If no selection is made $lst->curselection is undefined

      According to the posts title the problem of the OP seems to be, that $lst is undefined rather than the returnvalue of the curselection() call. His code example does not show that behavior, so it's hard to guess what's going on."


      Cheers, CHristoph

        The warning I highlighted is the only issue of that sort that the OP's sample code generates. My suspicion is that what we've been shown is a cleaned up version of the OP's real code and that the actual bug has been cleaned up in the process. Most likely that bug is related to using $lst as a global and is a result of it being altered somewhere in the code we're not shown. There is a reasonable chance that using the call back technique I demonstrated may solve the OP's problem.

        Quite likely the curselection undefined warning is a red herring, but avoiding globals may well fix the actual problem regardless.

        True laziness is hard work
Re: Can't call method "curselection" on an undefined value
by Eliya (Vicar) on Apr 12, 2011 at 19:22 UTC

    I can't replicate your error message (tried with Tk version 804.028 and 804.027).

    Without a selected entry I get "Use of uninitialized value in string ne at ./899028.pl line 30.", which could be fixed by testing

    if(defined $lst->curselection) { ...