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을 전달하면 작동하는 것 같습니다. 그러나 셸을 열고 시뮬레이션된 디스플레이(표시되어야 하는 위치)에서 프로그램을 실행하면 가상 디스플레이의 오른쪽 상단 모서리에 거의 크기가 0인 위젯이 배치되었습니다. 바탕화면으로 드래그한 다음 창 측면을 드래그하여 더 크게 만들 수 있습니다. 그러면 창의 제목 표시줄에 제목이 표시됩니다. 하지만 버튼이 있는 곳은 점입니다. 버튼을 클릭하면 "HELLO WORLD" 버튼을 클릭하는 것처럼 프로그램이 종료되기 때문에 분명히 버튼입니다.

이 위젯이 터널링된 X11에서는 제대로 작동하는 것처럼 보이지만 직접 X11에서는 잘못된 크기를 표시하는 이유를 설명할 수 없습니다.

부록: 디버거에서 이 줄을 실행하세요.

 x Tkx::font_actual('TkTextFont')

두 환경의 차이점 보고

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

관련 정보