2009-07-31 67 views
1

或多或少地將很多舊的Tk腳本轉換爲Tkx我被卡住了以下函數的端口,它重新定位傳入的窗口作爲屏幕中心的參數。在調用MainLoop之前,我習慣稱之爲Tk,因爲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的程序的窗口特定部分。對於reqwidth,reqheight,screenwidth或screenheight而言,Tkx似乎沒有可以通過cget()檢索到的內容。

難道我現在在Tkx中使用網格佈局而不是Tk中的包佈局有什麼實際意義嗎?

順便說一句我在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直接,你不能使用OO語法。

你可能已經想通了,但是在用Tkx開發時,你需要參考Tcl Tk documentationTkx文檔只是描述了(非常薄的)翻譯層如何工作。此外,usenet組comp.lang.perl.tk(或ptk mailing list與之橋接)可能是Tkx問題的最佳資源,因爲至少可以在此找到Tkx背後的ActiveState夥伴之一。