Tcl / tk - 获取窗口高度和宽度,并在网格中设置相对文本高度

时间:2016-07-07 08:05:51

标签: tcl tk

我想创建一个窗口,其中两个文本框一个在另一个上面,第一个占据高度的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

但我想使用相对选项。如何使它工作?

3 个答案:

答案 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窗口小部件的-widthtext选项以字符为单位,而不是屏幕单位。您可以通过进一步除以字体宽度和高度来解决这个问题(我将它们设置为下面的常量值)。请记住,这是整数除法!

噢,所有那些正则表达式...我已经清理了一下,你可以把它拿走或留下它。

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)exprforgridprocreturnscansetstringswitchtext (widget)wmSyntax 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

与网格相比,这种方法中是否有人发现任何陷阱。

谢谢