首页 > 解决方案 > 如何在运行的 Gtk3 应用程序中修改字体大小?

问题描述

我正在尝试找到一种方法(正确的方法)来使用 Ctrl 键加鼠标滚轮在正在运行的 Gtk3 Perl 应用程序中修改字体大小。我可以使用下面的代码来修改字体大小,但你真的必须使用提供者和样式来实现这一点吗?

#! /usr/bin/env perl

use 5.26.1;

use local::lib;

use warnings;
use strict;
use utf8;
use constant MAX_FONT_SIZE => 200;
use constant MIN_FONT_SIZE => 12;

use Glib qw(TRUE FALSE);
use Gtk3 qw(init);

my $str = "label {font-size: ".MIN_FONT_SIZE."px;}";

sub getWheel {
    my ($object, $event, $sp) = @_;
    my ($ctrl, $mod) = @{$event->state};
    my ($style, $provider) = @{$sp};

    state $font_size = MIN_FONT_SIZE;

    if ($ctrl eq q<control-mask> && $mod eq q<mod2-mask>) {
        if ($event->direction eq q<up>) {
            if ($font_size < MAX_FONT_SIZE) {
                $font_size += 4;
                $str = "label {font-size: ${font_size}px;}";
                $provider->load_from_data ($str, length($str));
                $style->add_provider($provider, 600);
            }
        }elsif ($event->direction eq q<down>){
            if ($font_size > MIN_FONT_SIZE) {
                $font_size -= 4;
                $str = "label {font-size: ${font_size}px;}";
                $provider->load_from_data ($str, length($str));
                $style->add_provider($provider, 600);
            }
        }
    }

    FALSE;
}


my $window = Gtk3::Window->new(q<toplevel>);
my $label = Gtk3::Label->new(q<Hello>);
my $provider = Gtk3::CssProvider->new();

$provider->load_from_data ($str, length($str));
my $style = $label->get_style_context();
$style->add_provider($provider, 600);

$window->add_events(q<GDK_SCROLL_MASK>);

$window->signal_connect(delete_event => sub{Gtk3->main_quit; FALSE});
$window->signal_connect(scroll_event => \&getWheel, [$style, $provider]);

$window->set_default_size(500, 300);

$window->add($label);

$window->show_all();

Gtk3->main;

是否有另一种方法可以修改正在运行的 Gtk3 应用程序的字体大小?

标签: perlgtk3

解决方案


您也可以使用pango_font_description_set_absolute_size(). 例如:

use feature qw(say state);
use strict;
use warnings;
use constant MAX_FONT_SIZE => 200;
use constant MIN_FONT_SIZE => 12;

use Glib qw(TRUE FALSE);
use Gtk3 qw(init);
use Pango;

{
    my $window = Gtk3::Window->new(q<toplevel>);
    my $label = Gtk3::Label->new(q<Hello>);
    set_label_font_size( $label, MIN_FONT_SIZE );
    $window->add_events(q<GDK_SCROLL_MASK>);
    $window->signal_connect(delete_event => sub{Gtk3->main_quit; FALSE});
    $window->signal_connect(scroll_event => sub { get_wheel( $label, @_ ) } );
    $window->set_default_size(500, 300);
    $window->add($label);
    $window->show_all();
    Gtk3->main;
}

sub set_label_font_size {
    my ( $label, $size ) = @_;

    my $context = $label->get_pango_context();
    my $font_description = $context->get_font_description();
    $font_description->set_absolute_size($size * Pango::SCALE);
    $context->set_font_description($font_description);

    # A bug or am I missing somthing?? But for now I had to modify the label text in order
    #   for the fontsize to show up.
    $label->set_text( $label->get_text() );
}

sub get_wheel {
    my ($label, $widget, $event ) = @_;
    my ($ctrl, $mod) = @{$event->state};

    state $font_size = MIN_FONT_SIZE;

    if ($ctrl eq q<control-mask> && $mod eq q<mod2-mask>) {
        if ($event->direction eq q<up>) {
            if ($font_size < MAX_FONT_SIZE) {
                $font_size += 4;
            }
        }
        elsif ($event->direction eq q<down>){
            if ($font_size > MIN_FONT_SIZE) {
                $font_size -= 4;
            }
        }
        else {
            return FALSE;
        }
        set_label_font_size( $label, $font_size );
    }
    return FALSE;
}

推荐阅读