http://qs321.pair.com?node_id=1050348


in reply to Re^4: perl tk frame packing question
in thread perl tk frame packing question

It seems that despite what the docs say, you have to use the descriptive name to set the font.

Anyhow a better way than destroying and recreating the HList widget, is to clear the contents and than add new contents like in the following example:

use strict; use warnings; use Tk; use Tk::HList; use Tk::ItemStyle; use Tk::FontDialog; my $mw = MainWindow->new; $mw->title("View"); $mw->minsize(560, 180); my $font = '{Architects Daughter} -12 bold'; # have to use descriptive + name my $top = $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 = $top->Menubutton( -text => "Font", )->pack( -side => 'left' ); $menubutton->command( -label => "Change", -command => sub { $font = $mw->FontDialog->Show; $mw->RefontTree( -font => $font ) if defined $font; print "Font changed: $font\n"; } ); my $hl = $hlistframe->Scrolled( 'HList', -scrollbars => 'ose', -columns => 2, -header => 1, -height => -1, )->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 ); #... $bottomframe->Button( -text => "Add item", -command => \&add_item ) ->pack( -side => 'right', -anchor => 'ne', -fill => 'x' ); $bottomframe->Button( -text => "Clear", -command => \&clear ) ->pack( -side => 'right', -anchor => 'ne', -fill => 'x' ); $mw->RefontTree( -font => $font ) if defined $font; # set default font my $style = $hl->ItemStyle( 'text', -background => 'light green', -font => $font, ); add_item(); sub add_item { my $e = $hl->addchild(''); if (defined $font) { my $font_descriptive = $mw->GetDescriptiveFontName($font); $style->configure( -font => $font ); print $font_descriptive, "\n"; } $hl->itemCreate( $e, 0, -text => 'Col0', -style => $style ); $hl->itemCreate( $e, 1, -text => 'Col1' ); } sub clear { $hl->delete('all'); } MainLoop;

This way changing the font of the widget is not needed anymore.