我正在尝试编写一个简单的GUI来编辑TCL + Tk中的键值对。它基于垂直ttk::panedwindow
窗口小部件,其中包含任意数量的水平ttk::panedwindow
窗口小部件,每个窗口小部件的左侧为ttk::entry
,右侧为text
窗口小部件。主ttk::panedwindow
下方是一个框架,其中包含用于执行保存和加载文件以及添加新行等操作的按钮。这样可以正常工作,所有小部件都按照我的预期进行缩放,但是当添加更多行时,它们会挤压在一起或拉伸窗口。
尝试使窗口垂直滚动不能正常工作。不幸的是,Tk非常挑剔它会让我附上滚动条,因此我无法将其放在主ttk::panedwindow
上。我尝试了wiki.tcl.tk上列出的各种黑客,但大多数都使用画布小部件并向两个方向滚动。如果我删除了水平滚动条,它就不再存在了,但小部件仍会延伸到窗口边缘或停在窗口边缘之前。
我也试过了BWidget,但是我并没有理解我被告知要一起使用的ScrolledWindow
和ScrollableFrame
小部件之间的关系。当我按照示例时,他们遇到了与canvas版本相同的问题。我怀疑它们实际上是在内部使用画布而不是实现真正的可滚动框架。
如何使主界面缩放到窗口的尺寸,同时还允许垂直滚动?我使用的是Linux,如果有帮助的话。
我做了一个GIF来展示我想要的东西:
消失滚动条是可选的,它就是这样发生的。更改的涂鸦表示调整到可用空间的文本行。
答案 0 :(得分:0)
所以...你希望内容在垂直方向上“自然”,但在水平方向上伸展?调皮。
您的基本方法是将frame
(或ttk::frame
)放入canvas
,将您的“有趣”内容放入frame
并添加滚动条到canvas
。然而,这不是一个棘手的问题。棘手的部分是你需要注意画布尺寸和框架尺寸的变化;对框架的更改应该导致调整画布的边界框,并且对画布的更改应该调整到所请求的框架宽度。
要注意更改任何窗口小部件的大小,您bind
发送到该窗口小部件的<Configure>
事件并使用%w
和%h
获取宽度和窗口小部件设置的高度。 (实际上,像grid
和pack
这样的几何管理器的工作方式与内部完全相同,除了它们使用的是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]
}
或类似的东西。这是未经测试的代码(假设您将框架放在画布上等),但应该向您展示前进的方向。