或多或少地将大量旧的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,如果这有任何区别的话。
答案 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 documentation。 Tkx文档仅描述了(非常薄)转换层的工作原理。此外,usenet组comp.lang.perl.tk(或它的ptk mailing list桥接器)可能是Tkx问题的最佳资源,因为至少有一个Tkx背后的ActiveState人员可以在那里找到。