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. |