有没有办法知道海龟图形中字符的宽度?

Is there a way to know the width of a character in turtle graphics?

我目前正在用乌龟图形制作打字游戏。当用户键入时,他们正在键入的句子上方的箭头会移动。这用于向用户显示他们在句子中的位置。但是,我无法让箭头停留在用户实际所在的字母上方。似乎每个字母的宽度都不是一个常数。因此,这行不通:t.forward(any number here) 有没有办法知道句子中每个字母的宽度?或者是否有某种字体类型无论字符如何都具有恒定宽度?如果这没有意义,我深表歉意。谢谢

您可以通过多种方式查看此内容:

要知道你刚刚写的字符的宽度

您可以通过在写字之前始终提起笔,并让乌龟随字移动来做到这一点。如果记录下海龟在写前后的位置,那么就可以算出和return宽度:

    import turtle
    def write_character(t: turtle, char: str, font: str = "Arial") -> float:
        """Write character and return width"""
        pen_was_down = t.isdown()
        if pen_was_down:
            t.penup()
        x_start, _ = t.position()
        t.write(char, move=True, font=(font, 50, "normal"))
        x_end, _ = t.position()
        if pen_was_down:
            t.pendown()
        return x_end - x_start

这样您就可以将箭头向前移动宽度 returned。

使用固定宽度字符

如您所见,某些字体没有固定名称。然而有些人这样做 - 这些被称为等宽。一个常用的例子是 Courier。以下代码段使用前面的方法检查 Arial 和 Courier 字体的字符宽度分布:

print("Arial", Counter(
    [write_character(turtle.Turtle(), c, "Arial") for c in string.ascii_lowercase]
))
print("Courier", Counter(
    [write_character(turtle.Turtle(), c, "Courier") for c in string.ascii_lowercase]
))

输出:

Arial Counter({27.0: 11, 24.0: 7, 11.0: 3, 13.0: 2, 41.0: 1, 16.0: 1, 36.0: 1})
Courier Counter({30.0: 26})

在这里我们可以看到Arial有7种不同的字符宽度,而Courier只有一种字符宽度。