1

我对 Tcl/Tk 相对较新,但在过去几周内一直在相当成功地使用它,不间断。在大多数情况下,它似乎相当简单。但是,我最近遇到了一个障碍,这可能很简单,但我似乎无法弄清楚。

我已将相当复杂的代码减少到几行来演示问题。

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

但是,我还希望框架在调整大小时保持“粘在一起”。也就是说,当它们都调整大小时,我希望“中间”框架与“左”框架保持一致。相反,我看到两者之间的差距正在扩大。

同样,这是来自更复杂程序的简化代码。我试图避免在同一个程序中混合 grid 和 pack 命令,并且在原始更复杂的程序中,使用 grid 变得非常笨拙。因此,首选使用“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
4

2 回答 2

3

首先,在调试复杂的布局以在框架上添加花哨的颜色时,它通常会有所帮助。当然,您不会将它们留在生产环境中,但它确实使理解您正在使用的几何管理器的行为变得更加简单。

当我尝试您的代码时,我看到两个小部件在水平方向上都分配了相同数量的空间;然后.frameLeft小部件会粘在该空间的左侧,而.frameMiddle小部件正在填充它已分配的空间。所以问题不在于小部件其“空间包”中的行为,而在于空间的分配。

现在,有了pack,额外空间的分配由-expand选项控制;额外的空间在启用了扩展的数据包之间共享。这意味着要获得您想要的布局,您不应该简单设置-expand 1.frameLeft.

于 2012-07-31T21:27:38.760 回答
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
于 2012-07-31T21:26:50.553 回答