Tkinter Tk如何计算小部件大小? 我想知道计算小部件的 合身的尺寸

Tkinter Tk如何计算小部件大小? 我想知道计算小部件的 合身的尺寸,tkinter,tcl,tk,Tkinter,Tcl,Tk,我想将这些知识应用于根据小部件的大小动态调整小部件文本字体的大小。Tk GUI通常反过来工作;这些小部件会重新调整形状以适应其内容以及定义的任何边距和边框空间。(在Ttk窗口小部件中,该样式指定了其中许多值。)然后将请求的一般大小作为建议输入几何体管理引擎。一个小部件的实际大小取决于它的其他小部件的环境以及它直接想要什么,而规则取决于所使用的几何体管理器grid、pack和place在内部都有完全不同的规则引擎(事实上,grid是一个复杂的约束满足解算器) 从另一个方向工作更容易。如果你知道你有

我想将这些知识应用于根据小部件的大小动态调整小部件文本字体的大小。

Tk GUI通常反过来工作;这些小部件会重新调整形状以适应其内容以及定义的任何边距和边框空间。(在Ttk窗口小部件中,该样式指定了其中许多值。)然后将请求的一般大小作为建议输入几何体管理引擎。一个小部件的实际大小取决于它的其他小部件的环境以及它直接想要什么,而规则取决于所使用的几何体管理器
grid
pack
place
在内部都有完全不同的规则引擎(事实上,
grid
是一个复杂的约束满足解算器)

从另一个方向工作更容易。如果你知道你有多少空间,你可以使用
font-measure
来计算你的文本在特定字体和大小下是否适合水平放置;对于多行(您不说这是否是您的场景),您需要单独测量每一行。在垂直方向上,您通常只需从
字体度量中获取总体高度,然后乘以所涉及的文本行数;不管怎样,字体渲染引擎在内部有效地做到了这一点

下面是一个帮助程序,演示如何在单行情况下执行此操作

proc findFontForLine {basefont maxX maxY text} {
    for {set size 2} {$size < 72} {incr size} {
        set testfont [lreplace $basefont 1 1 $size]
        if {[font measure $testfont $text] > $maxX} break
        if {[font metrics $testfont -linespace] > $maxY} break
        set font $testfont
    }
    if {[info exists font]} {
        return $font
    }
    error "could not find reasonable matching font"
}

set sample "This is some sample text"
set maxX 120
set maxY 30
set font [findFontForLine {Arial 5 bold} $maxX $maxY $sample]
puts "Chosen font is '$font'"
proc findFontForLine{basefont maxX maxY text}{
对于{set size 2}{$size<72}{incr size}{
设置testfont[lreplace$basefont 1$size]
如果{[font measure$testfont$text]>$maxX}中断
如果{[font metrics$testfont-linespace]>$maxY}中断
设置字体$testfont
}
如果{[info exists font]}{
返回$font
}
错误“找不到合理的匹配字体”
}
设置示例“这是一些示例文本”
设置maxX 120
设置maxY 30
设置字体[findFontForLine{Arial 5 bold}$maxX$maxY$sample]
放置“所选字体为“$font”

运行代码时,我的系统打印的
所选字体为“Arial 9 bold”
,但字体和显示可能会略有不同,因此您的里程数可能会有所不同。

如果您想要精确的公式,请查看源代码。它是公开的。@BryanOakley这是一个有效的帮助,但我在阅读这样的源代码方面非常缺乏经验。我的意思是,如果我真的知道该看哪个文件,那会有很大帮助。现在我在想,也许我应该试着找到一个名称中包含grid或pack的文件。你可能找不到一个函数。小部件的大小取决于其配置、字体、系统分辨率以及提供给
pack
place
grid
的选项。您不需要知道公式。您可以使用
winfo width
winfo reqwidth
函数确定小部件(或包含小部件)的大小。然后根据需要设置字体大小。重新计算字体大小将是在
事件中执行的操作,该事件在小部件更改大小时发送。如果要这样做,必须注意确保更改字体大小不会使小部件调整大小,否则可能会出现令人讨厌的循环情况……此外,将上述代码转换为Python只是一个练习。我为Python编写了一个方法,但在某些示例中,它的行为会出人意料,请参阅。