Создание нескольких черепашек в одном окне

#python #turtle-graphics

#python #черепаха-графика

Вопрос:

Я хочу создать более двух черепашек при запуске модулей. Итак, я объявил две переменные в turtle, но я вижу только одну черепаху. Что не так с моим кодом?

 import turtle
t1=turtle.Turtle()
t2=turtle.Turtle()

colors = ["red", "blue", "green"]
turtle.bgcolor("yellow")
t1.speed(3)
t1.width(5)
length1 = 10
t2.speed(3)
t2.width(5)
length2 = 10

while length1 < 500:
    t1.fd(length1)
    t1.pencolor(colors[length1%3])
    t1.right (89)
    length1  = 3 #length1 = length1   3

while length2 < 500:
    t2.fd(length2)
    t2.pencolor(pink)
    t2.left (89)
    length2  = 4 #length2 = length2   4

input()
  

Комментарии:

1. Python и Turtle не являются многозадачными. Чтобы делать две вещи одновременно (т. Е. запустите две черепашки одновременно) вам пришлось бы использовать модульную потоковую обработку. Но я не уверен, что Turtle «потокобезопасен». Вы могли бы попробовать turtle.ontimer() имитировать многозадачность. Или поместите обе черепашки в один while цикл и сделайте один шаг с помощью t1 , затем один шаг с помощью t2 , затем снова один шаг с помощью t1 и снова один шаг с `t2 и т.д.

Ответ №1:

Ваши черепашки перемещаются одна за другой. Первый while цикл выполняет работу с t1 , и когда это будет сделано, второй while позаботится об t2 . Это как « t1 , сделай свой первый шаг. Затем, t1 создайте свое второе. (и повторяйте это до тех пор, пока length1 не станет меньше 500.) Теперь t1 готово, так что t2 сделайте свой первый шаг. t2 , ваш второй шаг. (и это продолжается.)»

Вместо этого вы хотите, чтобы они по очереди выполняли каждый из своих шагов. Это как « t1 , сделай свой первый шаг. Затем, t2 , сделайте свой первый. t1 , сделайте свой второй шаг. t2 , ваша очередь для вашего второго шага. (и это продолжается.)»

Итак, ваш while цикл должен выглядеть следующим образом:

 t1.pencolor(colors[length1 % 3])
t2.pencolor("pink")

while length1 < 500 or length2 < 500:
    if length1 < 500:
        t1.fd(length1)
        t1.right(89)
        length1  = 3  # length1 = length1   3
    if length2 < 500:
        t2.fd(length2)
        t2.left(89)
        length2  = 4  # length2 = length2   4
  

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

Ответ №2:

я вижу только одну черепаху

Существует ли буквально только одна черепашка, или у вас заканчивается терпение, ожидая завершения первой черепашки до того, как начнется вторая черепашка (и прерывается из-за «pink» без кавычек)? Если речь идет о желании увидеть обеих черепашек в действии одновременно, как заключили люди, вот мой подход:

Помимо использования потоков, я использую генераторы, позволяющие двум черепашкам работать в режиме, подобном сопрограмме. Преимущество заключается в том, что черепашки могут совместно использовать точно один и тот же код, если захотят, или они могут использовать совершенно разный код. Но это позволяет избежать дублирования кода или поддержания несвязанного кода в одном while цикле:

 from turtle import Screen, Turtle

screen = Screen()
screen.bgcolor("yellow")

t1 = Turtle()
t1.pencolor('blue')

t2 = Turtle()
t2.pencolor('pink')

def pattern(turtle, increment, angle):
    turtle.speed('fast')
    turtle.width(5)
    length = 10

    while length < 500:
        turtle.forward(length)
        turtle.right(angle)
        length  = increment
        yield 0

generator1 = pattern(t1, 3, 89)
generator2 = pattern(t2, 4, -89)

while next(generator1, 1)   next(generator2, 1) < 2:
    pass

screen.exitonclick()