in reply to Perl Tk , MainLoop, destroy function problem
It is very bad to use a while loop and/or sleep() in any GUI program, as it interferes with the GUI's event loop. That is why you get a window only when you comment the outer while loop.
Your code is seriously messed up, and needs a pretty major rewrite to get it working. As a start, you need to remove your while loops and use timers to get your 1 second and 5 second intervals to work with the GUI.
Finally, the Hlist has an internal path counter, and instead of destroying the existing Hlist for the next update, you should reconfigure the existing Hlist paths. Your idea to destroy and recreate the Hlist for updates will almost certainly lead to unwanted memory gains in the process.
So, without me wasting all fff'ing morning on this, here is a general guide as to setup your program. I left out the rebuilding of the HList for now, until you can load your data successfully.... as you can see from the $1 $2 $3 printouts, your regex is broken.
See ztkdb for how to handle an Hlist.
#!/usr/bin/perl use Tk; use Tk::HList; use Tk::ItemStyle; use Data::Dumper; my $user = $ARGV[0] || 'alex'; my $hash = {}; my ($tool,$issued,$use,$vendor,$feature); #gui variables my ($hl,$ok,$alert); # Making the Gui my $mw = new MainWindow; $mw->geometry("500x200"); my $userframe = $mw->Frame(-width=>5,-height=>10)->pack(-side=>'top',- +anchor=>'nw'); $userframe->Label(-text => "USER: $user")->pack(-anchor => 'nw',-padx +=> 0); my $hlistframe = $mw->Frame()->pack(-fill => 'both', -expand => 1); $hl = $hlistframe->Scrolled('HList', -scrollbars => 'ose', -columns =>4 , -header => 1, -width => 100, -command => sub {print "AAA\n";}, -selectmode => 'browse', )->pack(-fill => 'both',-expand =>1 ); my $label1 = $hl->Label(-text => "Tool", -anchor => 'w'); $hl->headerCreate(0,-itemtype => 'window',-widget => $label1); my $label3 = $hl->Label(-text => "Available", -anchor => 'w'); $hl->headerCreate(1,-itemtype => 'window',-widget => $label3); my $label4 = $hl->Label(-text => "checkedout", -anchor => 'w'); $hl->headerCreate(2,-itemtype => 'window',-widget => $label4); my $label5 = $hl->Label(-text => "checkedout%", -anchor => 'w'); $hl->headerCreate(3,-itemtype => 'window',-widget => $label5); $ok = $hl->ItemStyle('text', -selectforeground =>'black', -anchor => +'center',-background =>'green'); $alert = $hl->ItemStyle('text', -selectforeground =>'black', -anchor + =>'center',-background =>'red'); open_report(); my $timer = $mw->repeat(1000, \&open_report); # my $timer1 = $mw->repeat(5000, \&clear_data); MainLoop; sub clear_data{ # fix your loading data problem first, before # worrying about clearing out the Hlist # you will probably get a memory gain unless you # reuse the Hlist, so don't try to destroy the Hlist # but just reconfigure the existing paths } sub open_report{ open(FP, "< 1report"); while(<FP>){ if(/^Users of (\w+):\s+\(Total of ([0-9]+) licenses issued;\s+Total +of ([0-9]+) (licenses|license) in use/) { ($tool,$issued,$use) = ($1,$2,$3); print "$1 $2 $3\n"; } if (/^\s+$user(.*)/){ $hash->{$user}->{$tool}->{tool} = $tool; $hash->{$user}->{$tool}->{issued} = $issued; $hash->{$user}->{$tool}->{inuse} = $use; print "2\n"; } } print "3\n"; close(FP); print Dumper($hash); my $path = 0; for my $toolkey (sort keys %{$hash->{$user}}){ _insertData($path,$toolkey); $path++; } # sleep 5; #not working # NEVER USE SLEEP IN A GUI !!!!!! # $hl->destroy; #not working #} } sub _insertData { my $path = shift; my $tool = shift; my $availbl = $hash->{$user}->{$tool}->{issued}; my $chk = $hash->{$user}->{$tool}->{inuse}; $hl->add($path); $hl->itemCreate($path,0,-text=> $hash->{$user}->{$tool}->{tool}); $hl->itemCreate($path,1,-text=> $hash->{$user}->{$tool}->{issued}) +; $hl->itemCreate($path,2,-text=> $hash->{$user}->{$tool}->{inuse}); my ($percent_lic_co,$color)= calculate_percent($availbl,$chk); $hl->itemCreate($path,3,-text=> $hash->{$user}->{$tool}->{inuse}, +-style => $color); } sub calculate_percent { my $avail = shift; my $co = shift; my $percent = ($co * 100)/$avail ; $percent = sprintf "%.2f", $percent; my $color; if($percent > 90) { $color = $alert; } else { $color = $ok; } return ($percent,$color); }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Perl Tk , MainLoop, destroy function problem
by ghosh123 (Monk) on Feb 19, 2013 at 14:15 UTC | |
|
Re^2: Perl Tk , MainLoop, destroy function problem
by ghosh123 (Monk) on Feb 20, 2013 at 13:29 UTC | |
by zentara (Cardinal) on Feb 21, 2013 at 12:18 UTC | |
by ghosh123 (Monk) on Feb 22, 2013 at 07:18 UTC | |
by zentara (Cardinal) on Feb 22, 2013 at 11:07 UTC | |
by ghosh123 (Monk) on Feb 22, 2013 at 13:21 UTC | |
|