放入If语句时,Onclick无法正常工作

时间:2019-02-25 15:08:10

标签: python turtle-graphics

我在课堂上被分配了一个项目:

  

“创建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 :(得分:1)

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()方法询问所有乌龟,以找到最接近单击点的两只乌龟。然后,您无需进行任何解码数学运算,因为海龟会处理它。