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()
обработчик внутри реализации обработчика, поэтому пользователь не может щелкнуть, пока предыдущий квадрат все еще рисуется, так как это приводит к грязным результатам.