perl - 如何在运行的 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 应用程序的字体大小?
解决方案
您也可以使用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;
}
推荐阅读
- python - 如何停止/暂停嵌入在 C++ 中的 Python 脚本
- c# - 如何检查物体是否在移动/不移动?
- datetime - Pentaho PDI 日期转换使用 Select Values 为 MMM-yy 提供错误的月份值
- node.js - 基于 build ARG 有条件地在 Dockerfile 中设置 ENV vars
- sass - 考拉编译时分页
- r - getURL 是否已弃用?
- python - 通过 API 编辑 GitHub 问题
- python - Python 无法将数据插入 SQLITE3 数据库
- java - 温度转换的“if-else”或“switch”语句的逻辑问题
- typescript - Typescript:为实例方法指定类型