Tcl / Tk:调整大小时框架行为不正常。

时间:2012-07-31 20:18:13

标签: tcl tk

我对Tcl / Tk比较陌生,但过去几周一直在不停地使用它。在大多数情况下,它似乎相当简单。然而,我最近遇到了一个障碍,这可能很简单,但我似乎无法弄明白。

我已将相当复杂的代码缩减为几行以证明问题。

我的简单示例生成了两个labelframe,每个labelframe都有一个简单的标签小部件。当我调整主窗口的大小(即,展开)时,我希望“左”框仅在y方向上调整大小,我希望“中间”框架在x和y中调整大小。这些部分工作正常。

但是,我还希望帧在调整大小时保持“卡住”状态。也就是说,我希望“中间”框架在它们都调整大小时保持与“左”框架相连。相反,我看到两者之间存在差距扩大。

同样,这是来自更复杂程序的简化代码。我试图避免在同一个程序中混合网格和打包命令,在原来更复杂的程序中,使用网格变得非常笨重。所以使用“pack”的解决方案将是首选。但正确的解释将是一个良好的开端。

我的小例子:

 #!/usr/bin/wish

 ## Set up two main frames
 set frameLeft [labelframe .frameLeft]
 set frameMiddle [labelframe .frameMiddle]

 pack $frameLeft -fill y -expand 1
 pack $frameMiddle  -fill both -expand 1 
 pack $frameLeft $frameMiddle -side left -anchor nw

 ## Instead of the previous 3 lines, I also tried:
 #pack $frameLeft -fill y -expand 1 -side left -anchor nw
 #pack $frameMiddle  -fill both -expand 1 -side left -anchor nw

 ## Set up component in LEFT frame
 set frameOne [labelframe $frameLeft.frameOne]
 set labelOne [label $frameOne.labelOne -text "Label One:"]

 pack $labelOne -anchor nw
 pack $frameOne -anchor nw

 ## Set up component in MIDDLE frame
 set frameTwo [labelframe $frameMiddle.frameTwo]
 set labelTwo [label $frameTwo.labelTwo -text "Label Two:"]

 pack $labelTwo -side left
 pack $frameTwo -anchor nw

2 个答案:

答案 0 :(得分:3)

首先,它通常有助于调试复杂的布局以在帧上添加花哨的颜色。当然,您不会将它们留在生产中,但它确实使您理解几何管理器的行为更加简单。

当我尝试你的代码时,我看到这两个小部件在水平方向上被分配了相同的空间量;然后.frameLeft窗口小部件将粘贴到该空间的左侧,而.frameMiddle窗口小部件将填充已分配的空间。所以问题不在于 中的小部件的行为,而是空间的分配。

现在,使用pack,额外空间的分配由-expand选项控制;额外的空间在为其启用扩展的数据包之间共享。这意味着要获得所需的布局,您只需-expand 1设置.frameLeft

答案 1 :(得分:0)

我知道您更喜欢“打包”答案,但网格通常更容易处理,因为“粘性”选项以更易于处理的语义处理填充和扩展。你有点麻烦我有点惊讶。不幸的是,我陷入了“网格”的困境。那么以下“网格”解决方案是否可以满足您的需求?

#!/usr/bin/env wish

## Set up two main frames
set frameLeft [labelframe .frameLeft]
set frameMiddle [labelframe .frameMiddle]

grid $frameLeft -row 0 -column 0 -sticky nse
grid $frameMiddle -row 0 -column 1 -sticky nsew
grid columnconfigure . {0 1} -weight 1
grid rowconfigure . 0 -weight 1

## Set up component in LEFT frame
set frameOne [labelframe $frameLeft.frameOne]
set labelOne [label $frameOne.labelOne -text "Label One:"]

grid $frameOne -sticky nw
grid $labelOne -sticky nw

## Set up component in MIDDLE frame
set frameTwo [labelframe $frameMiddle.frameTwo]
set labelTwo [label $frameTwo.labelTwo -text "Label Two:"]

grid $frameTwo -sticky nw
grid $labelTwo -sticky nw