![Perl Tkx 模块通过 SSH 隧道比直接连接到 X 服务器工作得更好](https://linux22.com/image/184124/Perl%20Tkx%20%E6%A8%A1%E5%9D%97%E9%80%9A%E8%BF%87%20SSH%20%E9%9A%A7%E9%81%93%E6%AF%94%E7%9B%B4%E6%8E%A5%E8%BF%9E%E6%8E%A5%E5%88%B0%20X%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B7%A5%E4%BD%9C%E5%BE%97%E6%9B%B4%E5%A5%BD.png)
尝试将 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()