2009-07-31 27 views
1

多かれ少なかれ古いTkスクリプトをTkxに変換していますが、画面中央にパラメータとして渡されたウィンドウの位置を変更する次の関数用のポートが残っています。私はこれをMainLoopを呼び出す直前に呼びましたが、Tkがreqwidthとreqheightの値を明らかに決めていました。必要に応じてPerl Tkxのメインウィンドウの位置を変更するにはどうすればよいですか?

sub CenterWindow 
{ 
    # Args: (0) window to center 
    # (1) [optional] desired width 
    # (2) [optional] desired height 

    my($window, $width, $height) = @_; 

    $window->idletasks; 
    $width = $window->reqwidth unless $width; 
    $height = $window->reqheight unless $height; 

    my $x = int(($window->screenwidth/2) - ($width/2)); 
    my $y = int(($window->screenheight/2) - ($height/2)); 

    $window->geometry($width . "x" . $height . "+" . $x . "+" . $y); 
} 

idletasksは)(TKX ::更新に変更することができますが、私はこの古いTkのルーチンの窓特定の部分のための任意の明白な翻訳を見つけるために、途方に暮れています。 Tkxはreqwidth、reqheight、screenwidth、またはcget()で取り出せるスクリーン高さに相当するようには見えません。

Tkのパックレイアウトではなく、Tkxでグリッドレイアウトを使用していますか?関連性はありますか?

私はWindows Vista上でActivePerl 5.10を実行しています。

答えて

1

ジオメトリマネージャは関係ありません。フレーム内でウィジェットがどのように配置されるかを制御するだけです。あなたは後にしているデータはwinfoコマンドを経由して提供されています:私の知る限り

sub CenterWindow { 
    # Args: (0) window to center 
    # (1) [optional] desired width 
    # (2) [optional] desired height 

    my ($window, $width, $height) = @_; 

    Tkx::update('idletasks'); 
    $width ||= Tkx::winfo('reqwidth', $window); 
    $height ||= Tkx::winfo('reqheight', $window); 

    my $x = int((Tkx::winfo('screenwidth', $window)/2) - ($width/2)); 
    my $y = int((Tkx::winfo('screenheight', $window)/2) - ($height/2)); 

    $window->g_wm_geometry($width . "x" . $height . "+" . $x . "+" . $y); 
} 

、あなたがオブジェクト指向の構文を使用することはできません、直接winfoを起動する必要があります。

Tkxで開発する場合は、Tcl Tk documentationを参照する必要があります。 Tkxのドキュメントでは、(非常に薄い)変換レイヤの仕組みについて説明しています。また、Usenetグループcomp.lang.perl.tk(またはptk mailing listへの橋渡し)は、Tkxの背後にあるActiveStateの人の少なくとも1人がそこに見つかる可能性があるため、おそらくTkxの質問のための最良のリソースです。

関連する問題