Tcl/Tk:帧在调整大小时行为不正常。

Tcl/Tk:帧在调整大小时行为不正常。,tcl,tk,Tcl,Tk,我对Tcl/Tk比较陌生,但在过去的几周里,我一直非常成功地使用它。在大多数情况下,这似乎相当简单。然而,我最近遇到了一个障碍,可能很简单,但我似乎无法解决 我已将相当复杂的代码缩减为几行,以演示该问题 我的简单示例生成两个LabelFrame,每个LabelFrame中都有一个简单的标签小部件。当我调整主窗口的大小(即展开)时,我希望“左”框只在y方向调整大小,我希望“中间”框在x和y方向调整大小。那些部件很好用 但是,我也希望调整大小时帧彼此保持“固定”。也就是说,当它们都调整大小时,我希望

我对Tcl/Tk比较陌生,但在过去的几周里,我一直非常成功地使用它。在大多数情况下,这似乎相当简单。然而,我最近遇到了一个障碍,可能很简单,但我似乎无法解决

我已将相当复杂的代码缩减为几行,以演示该问题

我的简单示例生成两个LabelFrame,每个LabelFrame中都有一个简单的标签小部件。当我调整主窗口的大小(即展开)时,我希望“左”框只在y方向调整大小,我希望“中间”框在x和y方向调整大小。那些部件很好用

但是,我也希望调整大小时帧彼此保持“固定”。也就是说,当它们都调整大小时,我希望“中间”帧与“左”帧保持垂直。相反,我看到两者之间的差距在扩大

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

我的小例子是:

 #!/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

我知道您更喜欢“pack”答案,但网格通常更容易处理,因为“sticky”选项以更易于处理的语义处理填充和扩展。我有点惊讶你在这方面遇到了麻烦。不幸的是,我被困在“网格”里——想想看。那么下面的“网格”解决方案是否符合您的要求

#!/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

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

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


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

还有一种算法,可以在空间不足时处理问题,但这总是让我感到困惑。我更喜欢使用
网格
,它更复杂,但更容易用于复杂的布局。(还有,为什么要使用没有
-text
标签的
labelframe
小部件?)!我明白我错在哪里了。再一次,我的例子是一个复杂问题的简化,所以我的实际问题并不像看上去的那么简单,但是通过你的解释,我能够解决它。正如我所说,我对这一点还是有点陌生,显然我还没有达到我所认为的舒适程度。@user1074069我只能建议进行实验,记住一些问题确实可以通过
grid
更好地解决(有一些狡猾的技巧),并尝试让您的真实用户界面对您的用户来说足够简单。我期望“网格”更合适,但它开始给我带来更多的麻烦,因为我正在从单独的组件构建复杂的布局。也许我的经验不足仍然表现出来。现在我有了我想要的,我将用网格重构,看看我学到了什么。谢谢。