#python #python-turtle
#python #python-turtle
Вопрос:
В моей программе есть две функции onclick, я хочу, чтобы первая запускалась 3 раза, а затем останавливалась навсегда, а затем вторая запускалась 5 раз и останавливалась навсегда. Как я мог это сделать? Я пытался использовать счетчик для подсчета количества кликов, но я не могу понять, как заставить это работать.
Вот мой код:
import turtle
import random
wn = turtle.Screen()
wn.bgcolor('lightblue')
svea = turtle.Turtle()
sample=[1,2,3]
click_count=0
def square(t,size,r,g,b,x,y,z,click_count):
if click_count==3:
quit()
else:
t.pencolor(x,y,z)
t.begin_fill()
for i in range(4):
t.forward(size)
t.right(90)
t.fillcolor(r,g,b)
t.end_fill()
def triangle(t,size,r,g,b,x,y,z):
t.pencolor(x,y,z)
t.begin_fill()
for i in range(3): # repeat four times
t.forward(size)
t.left(120)
t.fillcolor(r,g,b)
t.end_fill()
def rectangle(t,size,r,g,b,x,y,z):
t.pencolor(x,y,z)
t.begin_fill()
for i in range(2): # repeat four times
t.forward(size)
t.left(90)
t.forward(size*1.25)
t.left(90)
t.fillcolor(r,g,b)
t.end_fill()
def drawOnClick(x,y):
wn.onclick(None)
size=random.randrange(50,150)
svea.up()
svea.goto(x,y)
svea.down()
square(svea,size,random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randint(0,3))
triangle(svea,size,random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255))
svea.up()
svea.goto(x (size*0.4),y-size)
svea.down()
rectangle(svea,size/4,random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255))
svea.up()
svea.goto(x (size*0.15),y-(size*0.15))
svea.down()
square(svea,size/5,random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),2)
svea.up()
svea.goto(x (size*0.65),y-(size*0.15))
svea.down()
square(svea,size/5,random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),random.randrange(0,255),2)
wn.onclick(drawOnClick)
#click_count =1
#if click_count==3:
#quit()
def drawOnClick2(x,y):
size=random.randrange(10,20)
svea.begin_fill()
svea.up()
svea.goto(x,y)
svea.down()
svea.circle(size)
svea.right(90)
svea.forward(size*2)
svea.right(45)
svea.forward(size*2)
svea.right(180)
svea.forward(size*2)
svea.right(90)
svea.forward(size*2)
svea.right(180)
svea.forward(size*2)
svea.right(45)
svea.forward(size)
svea.right(90)
svea.forward(size*1.5)
svea.right(180)
svea.forward(size*3)
svea.right(180)
#wn.onclick(drawOnClick2)
wn.onclick(drawOnClick)
#wn.onclick(None)
# wn.exitonclick()
Ответ №1:
Я собираюсь предложить простой список функций обработчика событий, которые вы pop()
используете каждый раз, когда восстанавливаете обработчик событий в конце функции обработчика событий. Смотрите onclick_functions
в следующем переписывании вашего кода:
from turtle import Screen, Turtle
from random import randrange
def square(t, size, r, g, b, x, y, z):
t.color((x, y, z), (r, g, b))
t.begin_fill()
for _ in range(4):
t.forward(size)
t.right(90)
t.end_fill()
def triangle(t, size, r, g, b, x, y, z):
t.color((x, y, z), (r, g, b))
t.begin_fill()
for _ in range(3): # repeat three times
t.forward(size)
t.left(120)
t.end_fill()
def rectangle(t, size, r, g, b, x, y, z):
t.color((x, y, z), (r, g, b))
t.begin_fill()
for _ in range(2): # repeat two times
t.forward(size)
t.left(90)
t.forward(size * 1.25)
t.left(90)
t.end_fill()
def drawOnClick(x, y):
screen.onclick(None)
size = randrange(50, 150)
svea.up()
svea.goto(x, y)
svea.down()
square(svea, size, randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255))
triangle(svea, size, randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255))
svea.up()
svea.goto(x size * 0.4, y - size)
svea.down()
rectangle(svea, size/4, randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255))
svea.up()
svea.goto(x size * 0.15, y - size * 0.15)
svea.down()
square(svea, size/5, randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255))
svea.up()
svea.goto(x size * 0.65, y - size * 0.15)
svea.down()
square(svea, size/5, randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255), randrange(0, 255))
if onclick_functions:
screen.onclick(onclick_functions.pop(0))
def drawOnClick2(x, y):
screen.onclick(None)
size = randrange(10, 20)
svea.begin_fill()
svea.up()
svea.goto(x, y)
svea.down()
svea.circle(size)
svea.right(90)
svea.forward(size * 2)
svea.right(45)
svea.forward(size * 2)
svea.right(180)
svea.forward(size * 2)
svea.right(90)
svea.forward(size * 2)
svea.right(180)
svea.forward(size * 2)
svea.right(45)
svea.forward(size)
svea.right(90)
svea.forward(size * 1.5)
svea.right(180)
svea.forward(size * 3)
svea.right(180)
if onclick_functions:
screen.onclick(onclick_functions.pop(0))
onclick_functions = [drawOnClick] * 3 [drawOnClick2] * 5
screen = Screen()
screen.bgcolor('lightblue')
screen.colormode(255)
svea = Turtle()
if onclick_functions:
screen.onclick(onclick_functions.pop(0))
screen.mainloop()
Это должно упростить изменение количества вызовов каждой функции обработчика событий и добавление новых.