X11

Perl Tkx 模組通過 SSH 隧道比直接連接到 X 伺服器效果更好

  • November 28, 2020

嘗試將 ActivePerl(在 Windows 上)移植到 CENTOS Linux 環境。我驚訝地發現 perl Tkx 模組在 ActivePerl 之外並不常見,必須從 CPAN 安裝,而且它確實沒有通過那裡的測試

無論如何,我做了一個 qemu VM 並在上面安裝了 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’是否安裝在本地

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()

引用自:https://unix.stackexchange.com/questions/621864