in reply to Can't call method "curselection" on an undefined value

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

Replies are listed 'Best First'.
Re^2: Can't call method "curselection" on an undefined value
by lamprecht (Friar) on Apr 13, 2011 at 09:17 UTC
    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