Как заставить это колесо вращаться? - PullRequest
0 голосов
/ 30 марта 2019

Я создал колесо, но когда я пытаюсь сделать код для вращения, оно не будет работать.

Я уже пытался сделать это с помощью цикла, но это было почти невозможно для меня.Я в основном тяну колесо.Вот код из части вращающегося колеса:

turtle.listen()
if turtle.onkeypress("space"):
    colors = ['#880000','#884400','#884400','#888800',
              '#888800','#008800','#008800','#008800',
              '#008800','#008800','#008888','#008888',
              '#008888','#008888','#008888','#000088',
              '#000088','#000088','#000088','#000088']

for color in colors:
    slice_angle = 360 / len(colors)
    heading, position = 90, (center[0] + radius, center[1])
    turtle.color(color, color)
    turtle.speed(0)
    turtle.penup()
    turtle.goto(position)
    turtle.setheading(heading)
    turtle.pendown()
    turtle.begin_fill()
    turtle.circle(radius, extent=slice_angle)
    heading, position = turtle.heading(), turtle.position()
    turtle.penup()
    turtle.goto(center)
    turtle.end_fill()
    turtle.penup()

time.sleep(0.2)
colors = ['#884400','#884400','#888800',
          '#888800','#008800','#008800','#008800',
          '#008800','#008800','#008888','#008888',
          '#008888','#008888','#008888','#000088',
          '#000088','#000088','#000088','#000088','#880000']
for color in colors:
    slice_angle = 360 / len(colors)
    heading, position = 90, (center[0] + radius, center[1])
    turtle.color(color, color)
    turtle.speed(0)
    turtle.penup()
    turtle.goto(position)
    turtle.setheading(heading)
    turtle.pendown()
    turtle.begin_fill()
    turtle.circle(radius, extent=slice_angle)
    heading, position = turtle.heading(), turtle.position()
    turtle.penup()
    turtle.goto(center)
    turtle.end_fill()
    turtle.penup()

time.sleep(0.2)

Код продолжает вращаться, чтобы колесо вращалось.

Вот что я получаю:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py", line 701, in eventfun
    fun()
TypeError: 'str' object is not callable

1 Ответ

0 голосов
/ 30 марта 2019

У меня сложилось впечатление, что вы не пытаетесь заставить колесо вращаться, а скорее заставляете его выглядеть так, как будто оно вращается, переключая его цвета. Вот мой пример того, как использовать tracer() и update(), чтобы отключить рисование и переделать круг со смещенными цветами. Он использует событие таймера для запуска перерисовок. Вместо вашего фиксированного списка цветов я собираюсь использовать непрерывные оттенки, но вы должны иметь возможность использовать любые цвета, которые пожелаете:

from turtle import Screen, Turtle
from colorsys import hsv_to_rgb

RADIUS = 100
NUMBER_OF_WEDGES = 20
SLICE_ANGLE = 360 / NUMBER_OF_WEDGES

screen = Screen()
screen.tracer(False)

turtle = Turtle(visible=False)
turtle.penup()
center = turtle.position()

turtle.sety(turtle.ycor() - RADIUS)

hues = [color / NUMBER_OF_WEDGES for color in range(NUMBER_OF_WEDGES)]  # precompute hues

index = 0

def draw_circle():
    global index

    for hue in range(NUMBER_OF_WEDGES):
        turtle.color(hsv_to_rgb(hues[(hue + index) % NUMBER_OF_WEDGES], 1.0, 1.0))

        turtle.pendown()
        turtle.begin_fill()
        turtle.circle(RADIUS, extent=SLICE_ANGLE)
        position = turtle.position()
        turtle.goto(center)
        turtle.end_fill()
        turtle.penup()

        turtle.goto(position)

    screen.update()
    index = (index + 1) % NUMBER_OF_WEDGES
    screen.ontimer(draw_circle, 40)

draw_circle()

screen.exitonclick()

Это работает, но в моей системе необъяснимо замедляется со временем.

Давайте попробуем другой подход, который не перерисовывает ничего на уровне Python во время смены цветов. Мы собираемся создать новую форму курсора "wedge" и построить наш круг из черепах! Все клинья будут выставлены и не будут ни двигаться, ни перерисовываться. Обработчик событий таймера просто попросит каждую черепаху взять цвет своего соседа:

from turtle import Screen, Turtle
from colorsys import hsv_to_rgb

RADIUS = 100
NUMBER_OF_WEDGES = 20
SLICE_ANGLE = 360 / NUMBER_OF_WEDGES

screen = Screen()
screen.tracer(False)

# create a pie wedge-shaped cursor
turtle = Turtle(visible=False)
turtle.begin_poly()
turtle.sety(turtle.ycor() - RADIUS)
turtle.circle(RADIUS, extent=SLICE_ANGLE)
turtle.home()
turtle.end_poly()

screen.register_shape("wedge", turtle.get_poly())

# create a turtle for each wedge in the pie
turtles = []

for hue in range(NUMBER_OF_WEDGES):
    turtle = Turtle("wedge")
    turtle.color(hsv_to_rgb(hue / NUMBER_OF_WEDGES, 1.0, 1.0))
    turtle.setheading(hue * SLICE_ANGLE)

    turtles.append(turtle)

def draw_circle():

    # have each turtle take on the color of its neighbor
    for index, turtle in enumerate(turtles):
        turtle.color(*turtles[(index + 1) % NUMBER_OF_WEDGES].color())

    screen.update()
    screen.ontimer(draw_circle, 40)

draw_circle()

screen.exitonclick()

Обратите внимание, насколько проще наш основной цикл, draw_circle(), и что вращение не замедляется.

...