我想创建一个窗口,其中两个文本框一个在另一个上面,第一个占据高度的25%,然后占据75%的高度。
我试图计算toplevel win的相对高度/宽度并传入text命令但是没有工作(我猜是因为wm几何返回的维度单位与传递给text命令时的单位不同)
以下是我的代码:
toplevel .t
wm geometry .t 1500x800+10+10
update
proc topAspect {args} {
regexp {(\d+)} $args -> relAspect
regexp {([^\d|%]+)} $args -> aspect
regexp {(.*)x(.*)[+-](.*)[+-](.*)} [wm geometry .t] -> width height x y
puts "width->$width height->$height x->$x y->$y"
switch -regexp [string tolower $aspect] {
x {
return [expr $x + $relAspect]
}
y {
return [expr $y + $relAspect]
}
w {
return [expr $width * $relAspect / 100]
}
h {
return [expr $height * $relAspect / 100]
}
default {
log::log error "Unsupported relative aspect $aspect cannot be determined for top level window"
}
}
}
text .t.text1 -height [topAspect -width 25%] -width [topAspect -width 99%]
grid .t.text1 -sticky news
text .t.text2 -height [topAspect -width 75%] -width [topAspect -width 99%]
grid .t.text2 -sticky news
当我尝试跟随时 - 它确实给了我一些不错的GUI:
text .t.text1 -height 20 -width [topAspect -width 99%]
grid .t.text1 -sticky news
text .t.text2 -height 20 -width [topAspect -width 99%]
grid .t.text2 -sticky news
但我想使用相对选项。如何使它工作?
答案 0 :(得分:2)
解决此问题的最简单方法是使用网格几何管理器,其权重与正确的比例和统一组。调整窗口大小时,它甚至可以正常工作; Tk知道政策本身并为您维护。 (在内部,grid
是一个相当复杂的约束求解器;你可以用它做一些真正复杂的东西。)
toplevel .t
grid [text .t.text1 -bg red] -sticky news
grid [text .t.text2 -bg green] -sticky news
# The group name is just an arbitrary non-empty string.
# So long as it is the same on the two rows it will work as desired.
# The weights give a ratio of 1:3, i.e., 25% to one and 75% to the other.
grid rowconfigure .t .t.text1 -weight 1 -uniform group1
grid rowconfigure .t .t.text2 -weight 3 -uniform group1
(如果您使用的是Tk 8.5,则需要按行号指定行rowconfigure
,而不是行中小部件的常用名称。)< / p>
答案 1 :(得分:1)
是的,-height
窗口小部件的-width
和text
选项以字符为单位,而不是屏幕单位。您可以通过进一步除以字体宽度和高度来解决这个问题(我将它们设置为下面的常量值)。请记住,这是整数除法!
proc topAspect {aspect relAspect} {
set relAspect [string trimright $relAspect %]
scan [wm geometry .t] "%dx%d%d%d" width height x y
set fontWidth 15
set fontHeight 15
switch -regexp [string tolower $aspect] {
x {
return [expr {$x + $relAspect}]
}
y {
return [expr {$y + $relAspect}]
}
w {
return [expr {($width * $relAspect / 100) / $fontWidth}]
}
h {
return [expr {($height * $relAspect / 100) / $fontHeight}]
}
default {
log::log error "Unsupported relative aspect $aspect cannot be determined for top level window"
}
}
}
此外,您使用-width
作为topAspect
和-height
-width
的参数:我认为这是一个错误。
text .t.text1 -height [topAspect -height 25%] -width [topAspect -width 99%]
grid .t.text1 -sticky news
text .t.text2 -height [topAspect -height 75%] -width [topAspect -width 99%]
grid .t.text2 -sticky news
否则,我推荐Donal Fellows的解决方案。
文档: * (operator), + (operator), / (operator), expr, for, grid, proc, return, scan, set, string, switch, text (widget), wm, Syntax of Tcl regular expressions
答案 2 :(得分:0)
在这种情况下,地方效果最好 - 即使在调整以下尺寸的大小时也是如此:
place .t.text1 -in .t -relheight .25 -relwidth .98 -relx .003 -rely .003
place .t.text2 -in .t -relheight .75 -relwidth .98 -relx .003 -rely .254
与网格相比,这种方法中是否有人发现任何陷阱。
谢谢