Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re^4: Perl-Tk Notebook - add a new tab to exisitng $mw

by shankar.chandra (Initiate)
on Sep 20, 2016 at 16:32 UTC ( [id://1172226]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Perl-Tk Notebook - add a new tab to exisitng $mw
in thread Perl-Tk Notebook - add a new tab to exisitng $mw

Hi, first thanks for your replies. It helps me to move ahead instead stagnant. But then, I get errors like

XStoSubCmd: Not a Tk Window Tk::die_with_trace at /perl_install/lib/Tk/Submethods.pm line 37

Tk::MainWindow=HASH(0xa56e270) is not a widget

I did a miniature of my code to get a 'hello' success:

I run this with $window->Label(-text=>"Hello 1")->pack(); and then $window->Label(-text=>"Hello 2")->pack(); to print bothe Hello 1 and 2 in the same window, but I get errors on second run.

use Tk; use Tk::Widget; #use Tk::WidgetDump; use Data::Dumper; use Storable; use B::Deparse; $Storable::Deparse=1; use Storable qw(freeze thaw); use Safe; #use strict; my $safe = new Safe; # because of opcodes used in "use strict": $safe->permit(qw(:default require)); local $Storable::Deparse = 1; local $Storable::Eval = sub { $safe->reval($_[0]) }; sub ShowLog { my $window; if(-e "mainwindow.store") {$window=retrieve("mainwindow.store");} if(!defined($window)) {$window = Tk::MainWindow->new();} if(defined($window)) { $window->Label(-text=>"Hello 1")->pack(); store \%{$window}, "mainwindow.store"; } MainLoop(); }

with trial and error , 300+ google clicks etc makes me a bit tierd. I want to give up but then quite sure this cannot be that difficult to do, but could be i am making it difficult ? help?

Replies are listed 'Best First'.
Re^5: Perl-Tk Notebook - add a new tab to exisitng $mw
by choroba (Cardinal) on Sep 20, 2016 at 17:07 UTC
    It seems you can't simply freeze a Tk window, its XS foundations don't survive. Just save a structure with all the important values, and let the script populate the window with the values if they exist.

    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
Re^5: Perl-Tk Notebook - add a new tab to exisitng $mw
by Anonymous Monk on Sep 20, 2016 at 18:13 UTC

    Um, I ... suggest coffee or a walk or something

    #!/usr/bin/perl -- use strict; use warnings; use Path::Tiny qw/ path /; use Tk; GoTk( @ARGV ); exit( 0 ); sub GoTk { my( $file ) = @_; my %vars = ( pack => [qw/ -expand 1 -fill both /], label => 'the label '.gmtime. ' ', text => 'the text '.gmtime. ' ', LoadSaved( $file ), ); my $mw = tkinit; $mw->Label( -text => $vars{label} )->pack( @{ $vars{pack} } ); $mw->Entry( -text => $vars{text} )->pack( @{ $vars{pack} } ); $mw->protocol('WM_DELETE_WINDOW', sub { eval { SaveLoaded( $file, { %vars, label => Chaild($mw, 'label')->cget(-text), text => Chaild($mw, 'Entry')->cget(-text), }); 1 } or warn $@; Tk::exit; }); $mw->MainLoop; } sub Chaild { my( $w, $class ) = @_; for my $kid ( $w->children ){ return $kid if ref($kid) =~ /\Q$class\E/i; } return; } sub SaveLoaded { my( $file , $vars ) = @_; path( $file )->spew_raw( map { my $k = $_; my $v = $vars->{$k}; $v = sprintf "qw' %s '", join ' ' , @$v if ref $v; "$k=$v\n" } keys %$vars ); } sub LoadSaved { my %stuff; local $@; for my $line ( eval { path(@_)->lines_raw } ){ $line =~ s/[\r\n]+$//; my( $key, $val ) = split /=/, $line, 2; next unless $key and $val; $val = [split ' ', $1] if $val =~ m{qw'(.*)'}; $stuff{$key}=$val; } warn $@ if $@; return %stuff; } __END__

      :P ...guru, awake now :)

      Thanks. That was super rapid!

      I ran GoTk.pm. I do a small change in $mw->Entry, then I close the first $mw, I reran and I saw the text change in the secondly created window. (understood that I closed the first mainwindow to save changes to the $file !)

      My need is, when I re-run, I should 'add' new tab to a notebook in first opened $mw itself. My need is not saving values from the first $mw on WM_DELETE_WINDOW event but updating the existing mainwindow.

      any chance for this ?

      if this is not possible, then is it possible to trigger a timer kind of thing from the GUI itself to check for updates on a file (at regular interval) and when the file is updated with a new line, the GUI adds a new tab.

      ...

        any chance for this ?

        Sure, write some code, make it happen

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1172226]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2024-04-20 00:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found