Как запустить две функции onclick независимо (Python с черепахой)

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

Это должно упростить изменение количества вызовов каждой функции обработчика событий и добавление новых.