在或多或少地将许多旧的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中使用pack布局,这一事实有什么关系吗?
顺便说一句,如果有什么不同的话,我在Windows Vista上运行的是ActivePerl 5.10。
发布于 2009-08-07 01:44:12
几何管理器并不重要;它只控制小部件在框架中的布局方式。您需要的数据可以通过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家伙。
https://stackoverflow.com/questions/1212246
复制相似问题