首页 > 解决方案 > Tk 画布文本小部件的居中如何工作?

问题描述

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

方形字符未与灰色矩形对齐

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

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

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

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

Q2:我看到的行为是错误,还是可能未指定?


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


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

标签: tcltk

解决方案


Tk uses the logical properties of the font to determine what space to give text. In particular, it asks the font engine to measure the length of a piece of text (typically in one font and without newlines or tabs) to determine the bounding box of that text. It then decides where that bounding box should be (depending also on the anchoring rules, the sizes of other lines, the justification rules, the rotation setting when on a canvas, and so on) and finally asks the font engine to draw the text within the box, i.e., from the origin point within the box (which isn't the top-left point IIRC, but might actually be the leftmost point on the baseline — I let Tk handle the details of this to be honest).

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

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


推荐阅读