#!/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__
|