Tk canvas文本小部件的居中如何工作?

时间:2019-05-13 14:10:20

标签: tcl tk

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

Square character is not aligned with gray rectangle

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

在我以前的项目中,我使用过(pen+text.advance)/2,其中text.advance是每个字符的累计前进宽度。这就是我根据我所遇到的行为假定Tk正在使用的东西。

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

Q1:Tk canvas文本居中应该如何按照字体度量标准工作?

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


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


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

1 个答案:

答案 0 :(得分:1)

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

从那里开始,取决于字体引擎(它会关注累积错误的详细信息,当文本与窗口边缘不平行的任何角度时,这都是不小的关注),只要它停留在边界框内Tk很高兴。

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