Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re: perl tk frame packing question

by stefbv (Deacon)
on Aug 17, 2013 at 15:41 UTC ( #1049849=note: print w/replies, xml ) Need Help??

in reply to perl tk frame packing question

Here is my solution. The main differences are:
  • add minimum size for the main window
  • top and bottom frame have expand = 0 and fill = 'x'
  • Add height = -1 to HList
use strict; use warnings; use Tk; use Tk::HList; use Tk::ItemStyle; use Tk::BrowseEntry; use Tk::FontDialog; my $mw = MainWindow->new; $mw->title("View"); $mw->minsize(560, 180); my ($user, $sec, $selectfile) = ('user', 30, 'file'); my %url; my $userframe = $mw->Frame()->pack( -side => 'top', -fill => 'both', -expand => +0 ); my $hlistframe = $mw->Frame()->pack( -side => 'top', -fill => 'both', -expand => +1 ); my $bottomframe = $mw->Frame()->pack( -fill => 'x', -expand => 0 ); my $menubutton = $userframe->Menubutton( -text => "Font", )->pack( -side => 'left +' ); $menubutton->command( -label => "Change", -command => sub { my $font = $mw->FontDialog->Show; $mw->RefontTree( -font => $font ) if defined $font; } ); $userframe->Label( -text => "USER: $user" ) ->pack( -side => 'left', -anchor => 'w', -padx => 10 ); $userframe->Label( -text => "Set time(sec)" ) ->pack( -side => 'left', -anchor => 'w', -padx => 10 ); my $frequency = $userframe->Entry( -width => 5, -textvariable => \$sec + ) ->pack( -side => 'left', -anchor => 'nw', -padx => 10 ); $userframe->Label( -text => "Select File" ) ->pack( -side => 'left', -anchor => 'w', -padx => 10 ); $userframe->BrowseEntry( -state => 'normal', -choices => [ keys %url ], -variable => \$selectfile, -browsecmd => \&read_file, )->pack( -side => 'left', -anchor => 'w' ); my $hl = $hlistframe->Scrolled( 'HList', -scrollbars => 'ose', -columns => 7, -header => 1, -height => -1, -command => sub { print "AAA\n"; }, )->pack( -fill => 'both', -expand => 1 ); my $label1 = $hl->Label( -text => "Tool", -anchor => 'w' ); $hl->headerCreate( 0, -itemtype => 'window', -widget => $label1 ); my $label2 = $hl->Label( -text => "Vendor", -anchor => 'w' ); $hl->headerCreate( 1, -itemtype => 'window', -widget => $label2 ); my $label3 = $hl->Label( -text => "Available", -anchor => 'w' ); $hl->headerCreate( 2, -itemtype => 'window', -widget => $label3 ); my $label4 = $hl->Label( -text => "num.", -anchor => 'w' ); $hl->headerCreate( 3, -itemtype => 'window', -widget => $label4 ); my $label5 = $hl->Label( -text => "usage%", -anchor => 'w' ); $hl->headerCreate( 4, -itemtype => 'window', -widget => $label5 ); my $label6 = $hl->Label( -text => "user", -anchor => 'w' ); $hl->headerCreate( 5, -itemtype => 'window', -widget => $label6 ); my $label7 = $hl->Label( -text => "user%", -anchor => 'w' ); $hl->headerCreate( 6, -itemtype => 'window', -widget => $label7 ); $bottomframe->Button( -text => "Display File", -command => \&dumpOnTer +minal ) ->pack( -side => 'right', -anchor => 'ne', -fill => 'x' ); MainLoop;

This answers also to your other question regarding the font and window dimensions change.

Update: Changed the intro paragraph. The dimension of the window doesn't always change, only when it accommodates to bigger contents.

Update2: Updated the update :-)

Replies are listed 'Best First'.
Re^2: perl tk frame packing question
by ghosh123 (Monk) on Aug 20, 2013 at 03:24 UTC

    One problem that I am getting is , the font is always set to Helvetica and size as 9. Even if I change it to something else it is again getting resetted to that Helvetica,9.
    Also since my gui is getting refeshed after few seconds, that is resulting in giving the old font back. The ItemStyles inside the hlistframe is changing back to the old font.

      One problem that I am getting is , the font is always set to Helvetica and size as 9.

      That happens when you close and restart the application, right? The "old font" is the default font, in this case probably Helvetica,9. If you restart the application the default font will be used. Use a configuration file to save the desired font and apply it at the application start.

      The same for the HList, if you destroy and recreate it you have to reapply the desired font.

        Tk::Style might help with that (I havent tried it)

        Yes,this is certainly happening when I restart the application. Even when my gui is getting refreshed by $mw->after() every 10 secs , the selected font is also getting lost from the itemstyles.
        Please let me know how can I apply the desired font on HList effectively, I am applying it in the callback on the entire mainwindow widget as $mw->RefontTree(-font => $font) , is not that enough ?

        In reply to your comment
        "It's not enough because you don't call RefontTree again after destroing the HList. ItemStyle has a font option, make $font global and use it to set the font when the HList is recreated (-font => $font). "
        While seleceting the fonts from the FontDialog, I was also printing the $font and its descripttive name. For example for 'courier 10 pinch' and font size 5 , the $font which we pass to -font is coming as font30.
        I created a global variable at the top of my program as $font and assigned font30 to it. Then using that $font to RefontTree for $mw and $hlistframe. Even after destroying the hlistframes i am calling the RefontTree on $hlistframe and passing $font to -font. But it does not seem to be taking that font while the gui is launched.
        Can you please show me a working example.

        Thanks for your reply.
        The fonts are working.
        But the frame packing problem has surfaced again. I made the following 3 changes you mentioned
        1.Minsize for main window and bottom frame expand=>0 and fill=>x
        3.height=>-1 to HList
        Doing the above things, frames are getting packed as I want and the 'Display' button on bottomframe is visible at the minimum size of the window. But this works only if I have 2-3 rows of data under the columns.

        If I have some 6+ rows , then the gui window is launched with a bigger size and as I contract it to a smaller size the Display button on the bottomframe starts disappearing. Hence the problem still persists. Also the vertical scrollbar on the right hand side has no use if the gui always has to be kept so long to view some 6+ rows. It should stay as small as (380x160) irrespective of the row numbers and one can make use of the scrollbar and yet see all the frames.

        One more thing : Clicking on the 'Display file' button opens a scrolled ROText widget. Hence the default font or the selected font if I choose any from the FontDialog later, is getting applied on the ROText widget as well. I think since I am applying RefontTree on the mainwindow ($mw->RefontTree) so it is happening. But can I prevent that anyway ? By that I mean, on the ROText I want the normal Tk font that happens if I do not hard-code any default font or so by RefontTree .
        To consolidate, the default font or the selected font from FontDialog will still be applied on $mw but not on the ROText window.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1049849]
and the radiator hisses contentedly...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (9)
As of 2017-02-22 20:42 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (335 votes). Check out past polls.