Tcl/Tk:帧在调整大小时行为不正常。
我对Tcl/Tk比较陌生,但在过去的几周里,我一直非常成功地使用它。在大多数情况下,这似乎相当简单。然而,我最近遇到了一个障碍,可能很简单,但我似乎无法解决 我已将相当复杂的代码缩减为几行,以演示该问题 我的简单示例生成两个LabelFrame,每个LabelFrame中都有一个简单的标签小部件。当我调整主窗口的大小(即展开)时,我希望“左”框只在y方向调整大小,我希望“中间”框在x和y方向调整大小。那些部件很好用 但是,我也希望调整大小时帧彼此保持“固定”。也就是说,当它们都调整大小时,我希望“中间”帧与“左”帧保持垂直。相反,我看到两者之间的差距在扩大 同样,这是来自更复杂程序的简化代码。我试图避免在同一个程序中混合使用grid和pack命令,而在原来更复杂的程序中,使用grid变得非常笨拙。因此,首选使用“包装”的解决方案。但正确的解释将是一个良好的开端 我的小例子是:Tcl/Tk:帧在调整大小时行为不正常。,tcl,tk,Tcl,Tk,我对Tcl/Tk比较陌生,但在过去的几周里,我一直非常成功地使用它。在大多数情况下,这似乎相当简单。然而,我最近遇到了一个障碍,可能很简单,但我似乎无法解决 我已将相当复杂的代码缩减为几行,以演示该问题 我的简单示例生成两个LabelFrame,每个LabelFrame中都有一个简单的标签小部件。当我调整主窗口的大小(即展开)时,我希望“左”框只在y方向调整大小,我希望“中间”框在x和y方向调整大小。那些部件很好用 但是,我也希望调整大小时帧彼此保持“固定”。也就是说,当它们都调整大小时,我希望
#!/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
更好地解决(有一些狡猾的技巧),并尝试让您的真实用户界面对您的用户来说足够简单。我期望“网格”更合适,但它开始给我带来更多的麻烦,因为我正在从单独的组件构建复杂的布局。也许我的经验不足仍然表现出来。现在我有了我想要的,我将用网格重构,看看我学到了什么。谢谢。