Turtle Graphics: Как сдвинуть метку вверх?

Я изучаю Python и пытаюсь отредактировать код со следующей ошибкой:

Каждая метка высоты частично закрыта верхним сегментом ее полосы. Можете ли вы изменить код drawBar, немного переместив метку вверх, но не меняя полосу? Подсказка: метка не может быть нарисована во время заполнения полигона.

Я попытался def создать новую функцию, но это не сработало. Можете ли вы найти ошибку / изменить?

def drawBar(t, height):
    """ Get turtle t to draw one bar, of height. """
    t.begin_fill()               # start filling this shape
    t.left(90)
    t.forward(height)
    t.write(str(height))
    t.right(90)
    t.forward(40)
    t.right(90)
    t.forward(height)
    t.left(90)
    t.end_fill()                 # stop filling this shape

xs = [48, 117, 200, 240, 160, 260, 220]  # here is the data
maxheight = max(xs)
numbars = len(xs)
border = 10

wn = turtle.Screen()             # Set up the window and its attributes
wn.setworldcoordinates(0-border, 0-border, 40*numbars+border, maxheight+border)
wn.bgcolor("lightgreen")

tess = turtle.Turtle()           # create tess and set some attributes
tess.color("blue")
tess.fillcolor("red")
tess.pensize(3)

for a in xs:
    drawBar(tess, a)

wn.exitonclick()

person debiday    schedule 28.01.2021    source источник
comment
вы пытались использовать t.write() после t.end_fill() ?   -  person furas    schedule 28.01.2021


Ответы (2)


Если вы хотите двигаться вверх, то установите ручку вверх, двигайтесь вперед, пишите текст, двигайтесь назад, опускайте животное.

t.penup()
t.forward(2)
t.write(str(height))
t.forward(-2)
t.pendown() 

Минимальный рабочий код

import turtle

def drawBar(t, height):
    """ Get turtle t to draw one bar, of height. """
    t.begin_fill()               # start filling this shape
    t.left(90)
    t.forward(height)
    
    t.penup()
    t.forward(2)
    t.write(str(height))
    t.forward(-2)
    t.pendown()

    t.right(90)
    t.forward(40)
    t.right(90)
    t.forward(height)
    t.left(90)
    t.end_fill()              # stop filling this shape

xs = [48, 117, 200, 240, 160, 260, 220]  # here is the data
maxheight = max(xs)
numbars = len(xs)
border = 10

wn = turtle.Screen()             # Set up the window and its attributes
wn.setworldcoordinates(0-border, 0-border, 40*numbars+border, maxheight+border)
wn.bgcolor("lightgreen")

tess = turtle.Turtle()           # create tess and set some attributes
tess.color("blue")
tess.fillcolor("red")
tess.pensize(3)

for a in xs:
    drawBar(tess, a)

wn.exitonclick()

ИЗМЕНИТЬ:

Если вы хотите двигаться вверх и вправо

t.penup()

t.forward(2)
t.right(90)
t.forward(3)

t.write(str(height))

t.forward(-3)
t.right(-90)
t.forward(-2)

t.pendown()

введите здесь описание изображения

person furas    schedule 28.01.2021
comment
Это было просто следовать спасибо! Я не знал, что вы можете t.write(str(height)) в то время как t.penup() - person debiday; 28.01.2021
comment
если он не может write, когда penup, вы можете использовать pendown непосредственно перед write и penup сразу после write. - person furas; 28.01.2021

Вы можете сделать это, сохранив состояние (ее положение и направление) черепашки, переместив ее немного вправо перед рисованием метки, а затем восстановив ее состояние после этого.

Вот что я имею в виду:

def drawBar(t, height):
    """ Get turtle t to draw one bar, of height. """
    t.begin_fill()               # start filling this shape
    t.left(90)
    t.forward(height)

    posn = t.position()          # Save position.
    heading = t.heading()        # Save heading.
    t.right(90)                  # Point to the right.
    t.forward(1)                 # Move over a little.
    t.write(height)              # Display the label.
    t.goto(posn)                 # Restore position.
    t.setheading(heading)        # Restore heading.

    t.right(90)
    t.forward(40)
    t.right(90)
    t.forward(height)
    t.left(90)
    t.end_fill()                 # stop filling this shape
person martineau    schedule 28.01.2021