Python делает графику черепахи используя цвета списка

Я пытаюсь сделать квадраты с изменением цвета каждый раз, когда я нажимаю. но когда я запускаю это, он заполняет только красный цвет. Как я могу изменить цвет каждый раз?

import turtle
t= turtle.Turtle()
s=turtle.Screen()
colors = ["red","orange","yellow","green","blue","indigo","purple"]
n=0

def square(x,y):
    t.penup()
    t.goto(x,y)
    t.pendown()
    t.color(colors[n])
    t.begin_fill()   
    for i in range(4):
        t.fd(90)
        t.lt(90)
    t.end_fill()
    t.penup()
if s.onscreenclick(square) == True:
    n+=1

2 ответа

Вы пропускаете звонок s.mainloop(), А вы хотите n изменить с каждым кликом, объявить его глобальным square() функции, и увеличивайте его после завершения рисования. Не забудьте сбросить n к нулю, если он становится больше, чем len(colors),

Призыв к s.onscreenclick() говорит черепахе "как справиться с кликом" (позвонив square() в этом случае), поэтому вам не нужно помещать в if заявление.

import turtle
t= turtle.Turtle()
s=turtle.Screen()
colors = ["red","orange","yellow","green","blue","indigo","purple"]
n=0

def square(x,y): # draw a square at (x,y)
    global n # use the global variable n
    t.penup()
    t.goto(x,y)
    t.pendown()
    t.color(colors[n])
    t.begin_fill()
    for i in range(4):
        t.fd(90)
        t.lt(90)
    t.end_fill()
    t.penup()
    n = (n+1) % len(colors) # change the colour after each square

s.onscreenclick(square) # whenever there's a click, call square()

s.mainloop() # start looping

Наконец, обязательно прочитайте это, так как вы впервые пользуетесь Stackru.

Вместо глобальной операции счетчика и модуля я предпочитаю использовать cycle() из itertools, который просто повторяет список:

from turtle import Turtle, Screen
from itertools import cycle

colors = cycle(["red", "orange", "yellow", "green", "blue", "indigo", "purple"])

def square(x, y):
    screen.onscreenclick(None)  # disable handler inside handler

    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()

    turtle.color(next(colors))

    turtle.begin_fill()
    for _ in range(4):
        turtle.forward(75)
        turtle.left(90)
    turtle.end_fill()

    turtle.penup()

    screen.onscreenclick(square)

screen = Screen()
turtle = Turtle()

screen.onscreenclick(square)

screen.mainloop()

Также обратите внимание, что я отключил onscreenclick() обработчик внутри реализации обработчика, поэтому пользователь не может щелкнуть, пока предыдущий квадрат все еще рисуется, так как это приводит к грязным результатам.

Другие вопросы по тегам