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 的等价物。

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

顺便说一句,如果这有什么不同的话,我正在 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 文档Tkx文档只是描述了(非常薄的)翻译层是如何工作的。此外,usenet 组comp.lang.perl.tk(或到它的ptk 邮件列表桥)可能是 Tkx 问题的最佳资源,因为至少可以找到 Tkx 背后的 ActiveState 人员之一。

于 2009-08-07T01:44:12.380 回答