1

多かれ少なかれ、多くの古い Tk スクリプトを Tkx に変換したので、パラメータとして渡されたウィンドウを画面の中央に再配置する次の関数のポートが必要です。MainLoop を呼び出す直前にこれを呼び出していましたが、その時点で Tk は明らかに reqwidth と reqheight の値を決定していました。

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::update() に変更できますが、この古い Tk ルーチンのウィンドウ固有の部分の明白な翻訳を見つけることができません。Tkx には、cget() で取得できる reqwidth、reqheight、screenwidth、または screenheight に相当するものがないようです。

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

ところで、違いがあれば、Windows Vista で ActivePerl 5.10 を実行しています。

4

1 に答える 1

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直接呼び出す必要があり、OO 構文は使用できません。

おそらくすでにこれを理解していると思いますが、Tkx で開発する場合は、Tcl Tk documentationを参照する必要があります。Tkxのドキュメントでは、(非常に薄い) 変換レイヤーがどのように機能するかを説明しているだけです。また、usenet グループのcomp.lang.perl.tk (またはそこへのptk メーリング リストブリッジ) は、Tkx の背後にいる ActiveState 関係者の少なくとも 1 人がそこにいるため、おそらく Tkx に関する質問に最適なリソースです。

于 2009-08-07T01:44:12.380 に答える