有没有办法知道海龟图形中字符的宽度?
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只有一种字符宽度。
我目前正在用乌龟图形制作打字游戏。当用户键入时,他们正在键入的句子上方的箭头会移动。这用于向用户显示他们在句子中的位置。但是,我无法让箭头停留在用户实际所在的字母上方。似乎每个字母的宽度都不是一个常数。因此,这行不通: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只有一种字符宽度。