【问题标题】:How does centering of a Tk canvas text widget work?Tk 画布文本小部件的居中如何工作?
【发布时间】:2019-05-14 16:00:08
【问题描述】:

在将居中画布文本 (\u25a1) 小部件放置在具有相同 x 的居中矩形小部件上方时,我注意到了一个伪影:

使用过一次或两次字体渲染后,我意识到“居中”有多种可能的定义。现在我想知道使用哪种 Tk 画布文本。

在我之前的项目中,我使用了(pen+text.advance)/2,其中 text.advance 是每个字符的累积前进宽度。这就是我假设 Tk 基于我所经历的行为所使用的。

但是,另一种使文本居中的可能方法是使用累积的位图覆盖率进行居中,从最左边的字符位图左边缘到最右边的位图右边缘测量。我相信这更有可能是我想要的。

Q1:Tk 画布文本居中在字体指标方面应该如何工作?

Q2:我看到的行为是否存在错误,或者可能未明确说明?


编辑:更多地使用它,方形符号有时与矩形对齐,有时不是。可能是一些舍入误差。问题是它是否是一个错误。


编辑 2:将 0.5 添加到 x 似乎将正方形放在正确的位置。也许矩形和文本的像素原点定义不同?

【问题讨论】:

    标签: tcl tk


    【解决方案1】:

    Tk 使用字体的逻辑属性来确定给文本的空间。特别是,它要求字体引擎测量一段文本的长度(通常是一种字体,没有换行符或制表符)以确定该文本的边界框。然后它决定边界框应该在哪里(还取决于锚定规则、其他线条的大小、对齐规则、画布上的旋转设置等),最后要求字体引擎在其中绘制文本盒子,即,从盒子内的原点开始(这不是 IIRC 的左上角,但实际上可能是基线上最左边的点——老实说,我让 Tk 处理这个细节)。

    从那里开始,这取决于字体引擎(它关心累积错误的细节,当文本处于任何角度不平行于窗口边缘时,这是一个不平凡的问题),只要它保持不变在边界框内 Tk 很高兴。

    Tk 的画布适用于浮点坐标,但在大多数平台上,它在渲染时会将其四舍五入为整数。 (在 macOS 上例外,其中平台绘图引擎本身接受浮点坐标,并且画布上的所有图形输出都受到良好的亚像素渲染。这可能会导致画布在该平台上的外观发生一些变化,即使没有模型的变化;可以说,这也更接近于它们的外观,如果将画布的显示转换为嵌入式 postscript,您最终会得到同样的结果。)

    【讨论】:

    • 有趣。你是说这个字体引擎是由平台提供的,而不是Tk吗?试图在这里确定行动方案
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2019-07-26
    相关资源
    最近更新 更多