in reply to Modifying Tk widgets via references

Being lazy, I placed the widget creation, update and destroy routines into a module and access it from other modules. The reference to the Toplevel widget is returned and saved in a variable. When using only one widget, everything is fine. But when creating two, I am running into problems. Creating the widgets is no problem, but when I update one widget (using its unique reference), both Toplevel widgets are updated at the same time, overwriting the content of the first with the content of the second.

Well in addition to what my_nihilist said, about reusing toplevel windows, you can extend that to reuse all widgets. Don't try to create/destroy widgets....at best you will get a memory gain for each cycle. Withdraw or packForget them, reconfigure them, then re-pack them.

As far as why the 2 toplevels get the same information, you probably have the module setup wrong and you are not returning a blessed object ( usually called $self in the module). Here is the basics of a Tk module/package

#!/usr/bin/perl use warnings; use strict; use Tk; package ZCanTree; #without Tk::Derived the option -dooda will fail use base qw(Tk::Derived Tk::Canvas); Tk::Widget->Construct('ZCanTree'); sub ClassInit { my ($class, $mw) = @_; #set the $mw as parent $class->SUPER::ClassInit($mw); } # end ClassInit sub Populate { my ( $self, $args ) = @_; #------------------------------------------------------------------- #take care of args which don't belong to the SUPER, see Tk::Derived my $xtra_arg = delete $args->{-dooda}; #delete and read same time if( defined $xtra_arg ) { $self->{'dooda'} = $xtra_arg } #----------------------------------------------------------------- $self->SUPER::Populate($args); $self->{'can'} = $self->Canvas( )->pack(-expand=>1,-fill=>'both'); $self->Advertise( Canvas => $self->{'can'} ); print "2\n"; } sub get_dooda{ my $self = shift; return $self->{'dooda'}; } 1; package main; use Tk; my $mw = MainWindow->new; $mw->geometry("400x400"); my $canf = $mw->ZCanTree( -bg => 'black', -dooda => 42, )->pack(-fill=>'both',-expand=>1); my $button = $mw->Button( -text=>'Dooda', -command=> sub{ print $canf->get_dooda(),"\n" } )->pack(); my $button1 = $mw->Button( -text=>'Exit', -command=> sub{exit} )->pack +(); Tk::MainLoop;

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