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

Tcl/tk-获取窗口高度和宽度,并在网格中设置相对文本高度,tcl,tk,Tcl,Tk,我想创建一个有两个文本框的窗口,一个在另一个上面,第一个占25%的高度,第二个占75%的高度 我试图计算toplevel win的相对高度/宽度并传递到文本命令,但没有成功(我猜测是因为wm geometry返回的尺寸单位与传递到文本命令时的尺寸单位不同) 以下是我的代码: toplevel .t wm geometry .t 1500x800+10+10 update proc topAspect {args} { regexp {(\d+)} $args -> relAspec

我想创建一个有两个文本框的窗口,一个在另一个上面,第一个占25%的高度,第二个占75%的高度

我试图计算toplevel win的相对高度/宽度并传递到文本命令,但没有成功(我猜测是因为wm geometry返回的尺寸单位与传递到文本命令时的尺寸单位不同)

以下是我的代码:

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

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

解决此问题的最简单方法是使用具有正确比例和统一组的权重的栅格几何体管理器。当你调整窗口大小时,它甚至可以正常工作;Tk了解策略本身并为您维护它。(在内部,
grid
是一个相当复杂的约束求解器;您可以用它来做一些非常复杂的事情。)


(如果您使用的是Tk 8.5,则需要按数字指定要配置的行,而不是行中通常更方便的小部件名称。)

是的,
文本
小部件的
-height
-width
选项以字符单位给出,而不是屏幕单位。您可以通过进一步除以字体宽度和高度(我在下面将它们设置为常量值)来解决这个问题。记住这是整数除法

哦,所有的正则表达式…我已经清理了一点,你可以接受它或离开它

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"
        }
    }
}
另外,对于
-height
-width
,您使用了
-width
作为
topAspect
的参数:我认为这是一个错误

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的解决方案

文件: , , , , , , , , , , , , , ,
在这种情况下,Place工作得最好——即使在调整尺寸时,以下各项也能很好地保持比例:

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
与网格相比,这种方法是否存在任何缺陷


谢谢

在分析几何输出时需要小心,因为在多监视器设置中,几何输出可能具有负偏移。例如:
200x200+-638+77
。因此,正确解析的
scan
语句是
[scan$geometry”%dx%d+%d+%d“]
,它能够处理负片。感谢您的更正,我误解了格式的文档。但根据我目前的理解,前缀可以是-和+,后面可能跟着数字g的符号。如果是这样,则必须通过
{%dx%d%*1[+-]%d%*1[+-]%d}
或正则表达式
{(+\d+]x(+\d+[+-])([+-]?\d++[+-]([+-]?\d+}
进行扫描。格式为WxH-x+Y>(对X偏移量使用前导减号表示位置是从屏幕的右端开始的——请参见tkWinWm.c中关于WM_NEGATIVE_X的注释。因此,我们可能得到
1x1--2+3
,我想是的。看起来需要正则表达式。扫描模式更简单,但我不会反对任何想要使用正则表达式的人xp。还有可选的前导=,大小是可选的:
{=?((\d+)x(\d+))([+-](?\d+)([+-])((?\d+)([+-])(?\d+)
。我使用了X文档来确定这个regexp。我不知道
..++456
是否有效。我猜不是。像这样使用
place
的主要问题是它不会将大小传播到包含的小部件。这可能对您来说很重要,也可能对您来说无关紧要,这取决于其他程序中的情况您的GUI。您也可以通过绑定到正确的小部件上的
事件来修复它,但这时事情会变得非常复杂。好的-我将按照您的建议使用网格,如果工作正常,我将使用相同的-再次感谢
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