我对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
答案 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