Perl Tkx モジュールは、X サーバーに直接接続するよりも、SSH トンネルを介してうまく機能します。

Perl Tkx モジュールは、X サーバーに直接接続するよりも、SSH トンネルを介してうまく機能します。

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

2つの環境の違いを報告する

SSHを介してデフォルトで-size => 9、このシステムでは-size => 0です。

だから、「DejaVu Sans」フォントがローカルにインストールされていることを確認します。

ベストアンサー1

DejaフォントはCentos 8にインストールされていますが、Tkがそのフォントにアクセスすると、サイズは0に設定されます。

システムにデフォルトのサイズを設定する方法があるかどうかはわかりませんが、解決策として、以下のようにサイズ0の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()

おすすめ記事