如何知道 python 中海龟图形上特定文本的像素大小?

How to know the pixel size of a specific text on turtle graphics in python?

如题,当我执行下面的代码时


import turtle
turtle.write("some text")

我想知道海龟图形canvas上的字符串some text的整个大小(包括高和宽)。
我该怎么做?

turtle.write 的默认字体是 'Arial',字体大小为 8px,如文档 https://docs.python.org/3/library/turtle.html#turtle.write 中所述。

文本的高度和宽度取决于 font 参数。

虽然 Brandon 几乎给出了答案,但让我举个例子:

>>>>import turtle
>>>>turtle.write('hey hello this is DSP',font=('consolas',8,'bold'))

这样就可以了,Consolas 是字体类型,8 是字体大小,bold 是字体类型。除了粗体,您还可以选择斜体或普通体。

字体大小只告诉您一半,即高度:

The size of a font is typically taken to be the distance from the top of the highest character to the bottom of the lowest character.

来自FontSize.html

但是我们可以通过将turtle.write()move=选项设置为True来获取宽度。这是一个示例,我想在刚刚绘制的文本周围绘制一个框:

from turtle import Turtle, Screen
from tkinter.font import Font

TEXT = "Penny for your thoughts"  # arbitrary text
POSITION = (150, 150)  # arbitrary position

FONT_SIZE = 36  # arbitrary font size
FONT = ('Arial', FONT_SIZE, 'normal')  # arbitrary font

X, Y = 0, 1

def box(turtle, lower_left, upper_right):
    """ Draw a box but clean up after ourselves """

    position = turtle.position()
    isdown = turtle.isdown()

    if isdown:
        turtle.penup()

    turtle.goto(lower_left)
    turtle.pendown()
    turtle.goto(upper_right[X], lower_left[Y])
    turtle.goto(upper_right)
    turtle.goto(lower_left[X], upper_right[Y])
    turtle.goto(lower_left)

    turtle.penup()
    turtle.setposition(position)

    if isdown:
        turtle.pendown()

screen = Screen()

marker = Turtle(visible=False)
marker.penup()
marker.goto(POSITION)

start = marker.position()
marker.write(TEXT, align='center', move=True, font=FONT)
end = marker.position()

font_config = Font(font=FONT)
font_ascent = font_config.metrics('ascent')
buffer = (font_config.metrics('linespace') - font_ascent) / 2

# Since it's centered, the end[X] - start[X] represents 1/2 the width
box(marker, (2 * start[X] - end[X], start[Y] - buffer), (end[X], start[Y] + font_ascent + buffer))

screen.exitonclick()

现在,这是一个先绘制框,填充它,然后将文本绘制到其中的示例:

from turtle import Turtle, Screen
from tkinter.font import Font

TEXT = "Penny for your thoughts"  # arbitrary text
POSITION = (150, 150)  # arbitrary position

FONT_SIZE = 36  # arbitrary font size
FONT = ('Arial', FONT_SIZE, 'normal')  # arbitrary font

X, Y = 0, 1

# def box(turtle, lower_left, upper_right):
#     """ same as above example """
def box(turtle, lower_left, upper_right):
    """ Draw a box but clean up after ourselves """

    position = turtle.position()
    isdown = turtle.isdown()

    if isdown:
        turtle.penup()

    turtle.goto(lower_left)
    turtle.pendown()
    turtle.goto(upper_right[X], lower_left[Y])
    turtle.goto(upper_right)
    turtle.goto(lower_left[X], upper_right[Y])
    turtle.goto(lower_left)

    turtle.penup()
    turtle.setposition(position)

    if isdown:
        turtle.pendown()

screen = Screen()

font_config = Font(font=FONT)
font_ascent = font_config.metrics('ascent')
buffer = (font_config.metrics('linespace') - font_ascent) / 2
text_width = font_config.measure(TEXT)

marker = Turtle(visible=False)
marker.penup()
marker.fillcolor('pink')
marker.goto(POSITION)

# Since it's centered, we need to work with half widths
half_width = text_width / 2
marker.begin_fill()
box(marker, (POSITION[X] - half_width, POSITION[Y] - buffer), (POSITION[X] + half_width, POSITION[Y] + font_ascent + buffer))
marker.end_fill()

marker.write(TEXT, align='center', font=FONT)

screen.exitonclick()