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

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__

Replies are listed 'Best First'.
Re^6: Perl-Tk Notebook - add a new tab to exisitng $mw
by shankar.chandra (Initiate) on Sep 20, 2016 at 20:20 UTC

    :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