Onclick не работает, когда помещается в If - PullRequest
0 голосов
/ 25 февраля 2019

Мне был назначен проект в классе:

"Создайте сетку 5x5. Разрешите пользователю нажимать на пространство между двумя точками и рисовать линию между этими двумя точками. Для этогоЯ ищу две характеристики из вашей программы: способность допускать легкое отключение при щелчке между точками и возможность справляться с неоднозначностью при щелчке по пробелу, который может находиться вблизи 2 или более пробелов между точками."

Так что я новичок и не знаю, как эффективно это сделать, поэтому я просто написал длинную серию операторов IF, используя координаты каждой точки (я включил только4 в этом коде).Моя проблема в том, что я не могу понять, как заставить Onclick работать, так как ничего не происходит, когда я нажимаю на экран.

Любая помощь с этим или совет о лучшем способе кодирования, это очень ценится!

import turtle
screen = turtle.Screen()
t = turtle.Turtle()
t.hideturtle()
t.speed(0)

def makeGrid():
  def dotLine():
    for i in range(5):
      t.begin_fill()
      t.fillcolor("black")
      t.circle(4)
      t.end_fill()
      t.penup()
      t.forward(50)
      t.pendown

  dotLine()

  t.penup()
  t.goto(0,0)
  t.setheading(90)
  t.forward(50)
  t.setheading(0)

  dotLine()

  t.penup()
  t.goto(0,0)
  t.setheading(90)
  t.forward(100)
  t.setheading(0)

  dotLine()

  t.penup()
  t.goto(0,0)
  t.setheading(90)
  t.forward(150)
  t.setheading(0)

  dotLine()

  t.penup()
  t.goto(0,0)
  t.setheading(90)
  t.forward(200)
  t.setheading(0)

  dotLine()

makeGrid()

ty = t.ycor()
tx = t.xcor()

t.goto(0,1)

#point 1
if screen.onclick == (ty == 0 and 0 < tx < 50):
  t.pendown()
  t.forward(50)
#point 2
if screen.onclick == (ty == 0 and 50 < tx < 100):
  t.pendown()
  t.forward(50)
#point 3
if screen.onclick == (ty == 0 and 100 < tx < 150):
  t.pendown()
  t.forward(50)
#point 4
if screen.onclick == (ty == 0 and 150 < tx < 200):
  t.pendown()
  t.forward(50)

1 Ответ

0 голосов
/ 25 февраля 2019

Метод screen.onclick() не работает таким образом:

if screen.onclick == (ty == 0 and 0 < tx < 50):

Есть ли у вас документация по черепахе?Метод onclick() берет имя функции, вызываемой при щелчке, он ничего не возвращает.Кроме того, в одном из ваших вызовов turtle.pendown() отсутствуют круглые скобки.

Наконец, пользователи не могут точно щелкнуть это:

if screen.onclick == (ty == 0 and ...):

Вероятность попадания 0 точно очень мала.Я переработал ваш код ниже, чтобы заставить его работать.Очевидно, у вас есть больше точек, чтобы сделать активными:

from turtle import Screen, Turtle, mainloop

def dotLine():
    for _ in range(5):
        t.fillcolor("black")

        t.begin_fill()
        t.circle(4)
        t.end_fill()

        t.penup()
        t.forward(50)
        t.pendown()

def makeGrid():

    dotLine()

    t.penup()
    t.home()
    t.setheading(90)
    t.forward(50)
    t.setheading(0)

    dotLine()

    t.penup()
    t.home()
    t.setheading(90)
    t.forward(100)
    t.setheading(0)

    dotLine()

    t.penup()
    t.home()
    t.setheading(90)
    t.forward(150)
    t.setheading(0)

    dotLine()

    t.penup()
    t.home()
    t.setheading(90)
    t.forward(200)
    t.setheading(0)

    dotLine()

def onclick_handler(x, y):
    t.penup()

    # point 1
    if 0 < x < 50 and 0 < y < 50:
        t.goto(0, 0)
        t.pendown()
        t.forward(50)

    # point 2
    elif 50 < x < 100 and 0 < y < 50:
        t.goto(50, 0)
        t.pendown()
        t.forward(50)

    # point 3
    elif 100 < x < 150 and 0 < y < 50:
        t.goto(100, 0)
        t.pendown()
        t.forward(50)

    # point 4
    elif 150 < x < 200 and 0 < y < 50:
        t.goto(150, 0)
        t.pendown()
        t.forward(50)

    # point 5
    elif 200 < x < 250 and 0 < y < 50:
        t.goto(200, 0)
        t.pendown()
        t.forward(50)

screen = Screen()
t = Turtle(visible=False)
t.speed('fastest')

makeGrid()

screen.onclick(onclick_handler)

t.showturtle()

mainloop()

Если пользователь должен щелкнуть больше точек, чем в настоящее время включено в вашу программу, то я бы поступил по-другому.Я бы сделал каждую точку своей черепахой, а затем обработчик событий onclick() на экране опрашивал всех черепах методом turtle.distance(), чтобы найти двух ближайших к нажатой точке.Тогда вам не нужно выполнять какие-либо математические операции по расшифровке, поскольку черепахи справятся с этим.

...