如何在Perl Tkx下重新定位主窗口?

时间:2009-07-31 12:21:31

标签: perl tk tkx

或多或少地将大量旧的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似乎没有等效的cq()可以检索的reqwidth,reqheight,screenwidth或screenheight。

我现在在Tkx中使用网格布局而不是Tk中的包布局是否具有任何相关性?

BTW我在Windows Vista上运行ActivePerl 5.10,如果这有任何区别的话。

1 个答案:

答案 0 :(得分: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人员可以在那里找到。