允许窗口垂直滚动并水平拉伸

时间:2014-05-29 16:10:54

标签: tcl tk

我正在尝试编写一个简单的GUI来编辑TCL + Tk中的键值对。它基于垂直ttk::panedwindow窗口小部件,其中包含任意数量的水平ttk::panedwindow窗口小部件,每个窗口小部件的左侧为ttk::entry,右侧为text窗口小部件。主ttk::panedwindow下方是一个框架,其中包含用于执行保存和加载文件以及添加新行等操作的按钮。这样可以正常工作,所有小部件都按照我的预期进行缩放,但是当添加更多行时,它们会挤压在一起或拉伸窗口。

尝试使窗口垂直滚动不能正常工作。不幸的是,Tk非常挑剔它会让我附上滚动条,因此我无法将其放在主ttk::panedwindow上。我尝试了wiki.tcl.tk上列出的各种黑客,但大多数都使用画布小部件并向两个方向滚动。如果我删除了水平滚动条,它就不再存在了,但小部件仍会延伸到窗口边缘或停在窗口边缘之前。

我也试过了BWidget,但是我并没有理解我被告知要一起使用的ScrolledWindowScrollableFrame小部件之间的关系。当我按照示例时,他们遇到了与canvas版本相同的问题。我怀疑它们实际上是在内部使用画布而不是实现真正的可滚动框架。

如何使主界面缩放到窗口的尺寸,同时还允许垂直滚动?我使用的是Linux,如果有帮助的话。

我做了一个GIF来展示我想要的东西:

enter image description here

消失滚动条是可选的,它就是这样发生的。更改的涂鸦表示调整到可用空间的文本行。

1 个答案:

答案 0 :(得分:0)

所以...你希望内容在垂直方向上“自然”,但在水平方向上伸展?调皮。

您的基本方法是将frame(或ttk::frame)放入canvas,将您的“有趣”内容放入frame并添加滚动条到canvas。然而,这不是一个棘手的问题。棘手的部分是你需要注意画布尺寸和框架尺寸的变化;对框架的更改应该导致调整画布的边界框,并且对画布的更改应该调整到所请求的框架宽度。

要注意更改任何窗口小部件的大小,您bind发送到该窗口小部件的<Configure>事件并使用%w%h获取宽度和窗口小部件设置的高度。 (实际上,像gridpack这样的几何管理器的工作方式与内部完全相同,除了它们使用的是C级绑定而不是脚本级绑定。)

bind $canvas <Configure> {adjustCanvasDimensions %W %w %h}
bind $frame <Configure {adjustFrameDimensions %W %w %h}

proc adjustCanvasDimensions {theCanvas width height} {
    set theFrame $theCanvas.frame
    set oldwidth [$theFrame cget -width]
    if {$width != $oldwidth} {
        $theFrame configure -width $width
    }
    # Consider adjusting the frame height if canvas height greater
}
proc adjustFrameDimensions {theFrame width height} {
    set theCanvas [winfo parent $theFrame]
    $theCanvas configure -bbox [list 0 0 $width $height]
}

或类似的东西。这是未经测试的代码(假设您将框架放在画布上等),但应该向您展示前进的方向。