Tk如何计算小部件大小?

时间:2017-10-27 20:22:38

标签: tkinter tcl tk

  • 我想知道计算小部件的确切等式是什么 适合大小。

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

1 个答案:

答案 0 :(得分:1)

Tk GUI通常以相反的方式工作;小部件重塑以适应其内容以及定义的边距和边框空间。 (在Ttk小部件中,样式指定了许多这些值。)然后,将一般请求的大小作为建议提供给几何管理引擎。小部件实际获得的大小取决于其他小部件的环境以及它直接需要的内容,其规则取决于所使用的几何管理器; gridpackplace内部都有完全不同的规则引擎(事实上,grid是一个复杂的约束满足求解器。)

从反方向工作更容易。如果您知道自己有多少空间,可以使用font measure计算出特定字体和大小的文字是否适合水平放置;有多行(你不说这是否是你的情景)你需要单独测量每一行。在垂直方向上,您通常只需从font metrics获得总高度,然后乘以所涉及的文本行数;无论如何,这就是字体渲染引擎在内部的有效作用。

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

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'"

我的系统在运行代码时打印Chosen font is 'Arial 9 bold',但字体和显示可能略有不同,因此您的里程可能会有所不同。