gpt4 book ai didi

tcl - 允许 panedwindow 垂直滚动和水平拉伸(stretch)

转载 作者:行者123 更新时间:2023-12-04 18:07:02 27 4
gpt4 key购买 nike

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

尝试使窗口垂直滚动没有正常工作。不幸的是,Tk 对它允许我将滚动条附加到什么位置非常挑剔,所以我不能只在主 ttk::panedwindow 上放一个。我尝试了 wiki.tcl.tk 上列出的各种 hack,但其中大多数使用 Canvas 小部件并在两个方向上滚动。如果我删除水平滚动条,它将不再存在,但小部件仍会超出窗口边缘或停止在窗口边缘之前。

我也试过 BWidget,但我不明白我被告知一起使用的 ScrolledWindowScrollableFrame 小部件之间的关系。当我按照示例进行操作时,它们遇到了与 Canvas 版本相同的问题。我怀疑他们实际上在内部使用 Canvas ,而不是实现真正的可滚动框架。

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

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

enter image description here

消失的滚动条是可选的,它就是那样发生的。不断变化的涂鸦表示根据可用空间调整的文本行。

最佳答案

那么……您希望内容在垂直方向“自然”,但在水平方向拉伸(stretch)?棘手。

您的基本方法是放置一个 frame (或 ttk::frame )在 canvas 内, 把你“有趣”的内容放在frame里面并向 canvas 添加滚动条.然而,这不是棘手的一点。棘手的部分是您需要注意 Canvas 尺寸和框架尺寸的变化;对框架的更改应引起 Canvas 边界框的调整,而对 Canvas 的更改应引起对框架请求宽度的调整。

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

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]
}

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

关于tcl - 允许 panedwindow 垂直滚动和水平拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937850/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com