不同的字体实现不同,有等宽和非等宽,非等宽字体不同字符宽度不同,宽高比也各不相同,而且字体尺寸和像素是无法直接转换的。因此,今天介绍的方法并非完美的解决方案,只是用于粗糙估算turtle中字符的长宽,用于在字符上绘图进行绘图操作,如圈画文本等。
背景知识
write函数
turtle中用于书写文本的函数为write
1 | turtle.write(arg, move=False, align="left", font=("Arial", 8, "normal")) |
参数:
arg – 要书写到 TurtleScreen 的对象
如:”something”,123,(1,2),[1,2,3]等move – True/False
如果 move 为 True,画笔会移动到文本的右下角,这样文字就不会叠在一块了。align – 字符串 “left”, “center” 或 “right”
align 指定对齐方式 (“left”, “center” 或 right”)font – 一个三元组 (fontname, fontsize, fonttype)
font 指定字体
作用:
书写文本 arg 指定的字符串到当前海龟位置。
思路
这里有两种思路,都不精确,第一种直接估算,第二种根据宽度估算,各有优劣,仅供参考:
用fontsize近似代替宽度,然后用估测的纵横比近似估算高度,得到字符长宽参数,进而确定位置。
由于每个字宽度不同,所以可以单独绘制每个字符,将move设为True,这样在写每个字符时,画笔会跟着移动,可以记录其始末位置,作差得到每个字符的宽度。
代码
这里我们实现了在turtle中对文本部分子串进行圈画的功能,其中两种思路都有涉及。
最后选用记录的宽度作为画圈的直径。另外,因为每个字符高度差不多,所以高度统一采用估算的高度。
1 | import turtle |
Note
这里仅用于演示,因此圈画功能简单使用了circle函数,绘制的是圆形,在圈画较长或较短字符串时并不美观,实际使用时可以根据需求自己调整,比如绘制椭圆或方框等其他圈画方式。