3

As title, when I execute the following code


import turtle
turtle.write("some text")

I want to know the whole size (including height and width) of the string some text on the canvas of the turtle graphics.
How can I do that?

LessonWang
  • 65
  • 5
  • I do not think this is possible. `turtle` is a toy module and has very limited functionality. – DYZ Aug 05 '17 at 02:07

3 Answers3

4

The font size only tells you half of what you need to know, i.e. the height:

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.

From FontSize.html

But we can get the width via setting the move= option of turtle.write() to True. Here's a example where I want to draw a box around the text I've just drawn:

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()

enter image description here

Now, here's an example that draws the box first, fills it, and then draws the text into it:

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()

enter image description here

cdlane
  • 40,441
  • 5
  • 32
  • 81
  • Wow, what you have done is my final goal. Thank you very much. I want to use turtle graphics to layout text such like latex. – LessonWang Aug 06 '17 at 02:13
-1

The default font for turtle.write is 'Arial' with a font-size of 8px as described in the documentation https://docs.python.org/3/library/turtle.html#turtle.write.

The height and width of the text is dependent on the font parameter.

-1

Though Brandon pretty much gave the answer, let me give you an example:

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

This would do your job, Consolas is the font type, 8 is the font's size, and bold is the font type. Other than bold you can go for italic or normal as well.

Ubdus Samad
  • 1,218
  • 1
  • 15
  • 27