Perl Tkx 模块通过 SSH 隧道比直接连接到 X 服务器工作得更好

Perl Tkx 模块通过 SSH 隧道比直接连接到 X 服务器工作得更好

尝试将 ActivePerl(在 Windows 上)移植到 CENTOS Linux 环境。我惊讶地发现 perl Tkx 模块在 ActivePerl 之外并不常见,必须从 CPAN 安装,而且它确实没有通过那里的测试

不管怎样,我做了一个qemu虚拟机并在上面安装了Centos 8。然后我查看是否可以让 Tkx 模块在其上运行。

根据以下人士的建议这个博客,我通过 yum 安装了一些东西,还通过 cpan 程序从 CPAN 加载了 Tcl 和 Tkx perl 模块。 (PERL_DL_NONLAZY环境问题激发了他在博客中发表他的解决方案。)

然后为了测试它我尝试了这个程序

#


BEGIN {
    $ENV{PERL_DL_NONLAZY} = 1;
}

    use Tkx;

    Tkx::button(".b",
        -text => "Hello, world",
        -command => sub { Tkx::destroy("."); },
    );
    Tkx::pack(".b");

    Tkx::MainLoop()

但运行该程序会出现一些意想不到的行为。当 mobaxterm 运行 ssh 会话并通过其转发 X11 时,它似乎可以工作。但是,在模拟显示器中打开外壳并运行该程序(它应该出现在模拟显示器上),却在虚拟显示器的右上角放置了一个几乎为零大小的小部件。您可以更好地将其拖到桌面上,然后拖动窗口两侧以使其更大。这会在窗口的标题栏中显示一个标题。但是按钮所在的位置只是一个点,这显然是按钮,因为如果单击它,程序就会结束,就像单击“HELLO WORLD”按钮应该起作用一样

我无法解释为什么这个小部件在直接 X11 上显示的大小不正确,而它在隧道 X11 上似乎工作正常

附录:从调试器运行此行

 x Tkx::font_actual('TkTextFont')

报告两个环境中的差异

通过 ssh 基本上是 -size=>9 ,在本机下它是 -size=>0

所以我会检查本地是否安装了字体“DejaVu Sans”

答案1

Deja 字体安装在 Centos 8 中,但当 Tk 访问它们时,它们的大小设置为零。

我不知道系统是否有某种方法可以为它们设置默认大小,但作为解决方法,我创建了一些代码,可以将零大小的 Tk 字体更改为一些合理的值,如下所示

#


BEGIN {
    $ENV{PERL_DL_NONLAZY} = 1;
}

        use Tkx;

        # Get the names of Tk's fonts
        my @fontnames = Tkx::SplitList( Tkx::font_names() );
    
        # resize zero sized Tk fonts to 9 points
        foreach( @fontnames)
        {
            my %actual = Tkx::SplitList(  Tkx::font_actual($_) );
    
            if ( $actual{-size} == 0 )
            {
                Tkx::font_configure( $_, -size=>9 );
            }
        }
    
        Tkx::button(".b",
            -text => "Hello, world",
            -command => sub { Tkx::destroy("."); },
        );

        Tkx::pack(".b");
        
        Tkx::MainLoop()

相关内容