Gráfico de criação das tartarugas em Python usando as cores das listas

Estou a tentar fazer quadrados com mudança de cor sempre que clicar. mas quando dirijo isto, só preenche a cor vermelha. Como posso mudar de cor de cada vez?

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
Author: ziggystar, 2018-06-28

2 answers

Estás a perder uma chamada para o s.mainloop(). E de você quer que n Mude com cada clique, declare-o como global dentro da função square(), e aumente-o depois de terminar o desenho. Não se esqueça de reiniciar n para zero se ficar maior que len(colors).

A chamada para s.onscreenclick() está dizendo à tartaruga 'como lidar com um clique' (chamando square() neste caso), então você não precisa colocar em uma declaração 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
Finalmente, não te esqueças de ler isto, pois é a tua primeira vez. no StackOverflow.
 0
Author: Richard Inglis, 2018-06-28 08:20:22

Em vez de um contador global e operação de Módulo, prefiro usar cycle() de itertools que simplesmente continua a repetir a lista:

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

Note também que desactivei o onscreenclick() manipulador dentro da implementação do manipulador para que o utilizador não possa carregar enquanto o quadrado anterior ainda está a ser desenhado, dado que isso leva a resultados confusos.

 0
Author: cdlane, 2018-06-28 18:51:44