【问题标题】:turtle defined function not executing all code at once乌龟定义的函数没有一次执行所有代码
【发布时间】:2021-11-17 18:48:27
【问题描述】:

我正在尝试编写一个程序,允许我使用 turtle 模块绘制一些简单的坐标,并使其更加用户友好,我希望每次用户按下鼠标左键绘制一个点时都显示一个十字。由于某种原因,cross() 函数的最后一位,即。在再次按下鼠标左键之前,十字的最后一行不会绘制或出现。我真的很困惑为什么会发生这种情况,因为代码肯定正在执行。任何帮助将不胜感激!


wn = t.Screen()
wn.title("graph")
wn.setup(width=600, height=600)
wn.tracer(0)
wn.update()

pen = t.Turtle()
pen.color("black")
pen.shape("classic")
pen.goto(0, 0)
pen.ht()

x = 10
y = 10

def cross(x, y):
    print(x, y)
    pen.pensize(2.5)
    pen.pu()
    pen.goto(x, y)
    pen.pd()
    pen.seth(225)
    pen.color("red")
    pen.fd(50)
    pen.color("black")

    pen.pu()
    pen.goto(x, y)
    pen.pd()
    pen.left(180)
    pen.fd(50)

    pen.pu()
    pen.goto(x, y)
    pen.seth(315)
    pen.pd()
    pen.color("green")
    pen.fd(50)

    pen.pu()
    pen.goto(x, y)
    pen.left(180)
    pen.pd()
    pen.color("yellow")
    pen.fd(50) #for some reason this is not being done
    print("now")

cross(x, y)

while True:
    wn.update()
    wn.onscreenclick(cross)
    wn.mainloop()

【问题讨论】:

    标签: python turtle-graphics python-turtle


    【解决方案1】:

    此代码表明对onscreenclick()mainloop() 所做的事情的基本误解:

    while True:
        wn.update()
        wn.onscreenclick(cross)
        wn.mainloop()
    

    让我们重新编写代码以正确使用这些方法,并修复问题:

    from turtle import Screen, Pen
    
    def cross(x, y):
        screen.onclick(None)  # disable handler inside handler
    
        pen.penup()
        pen.goto(x, y)
        pen.pendown()
        pen.setheading(225)
        pen.color('red')
        pen.forward(50)
    
        pen.penup()
        pen.goto(x, y)
        pen.pendown()
        pen.left(180)
        pen.color('black')
        pen.forward(50)
    
        pen.penup()
        pen.goto(x, y)
        pen.seth(315)
        pen.pendown()
        pen.color('green')
        pen.forward(50)
    
        pen.penup()
        pen.goto(x, y)
        pen.left(180)
        pen.pendown()
        pen.color('yellow')
        pen.forward(50)
    
        screen.update()
        screen.onclick(cross)  # reenable handler on exit
    
    screen = Screen()
    screen.title("graph")
    screen.setup(width=600, height=600)
    screen.tracer(0)
    
    pen = Pen()
    pen.hideturtle()
    pen.color('black')
    pen.pensize(2.5)
    
    x, y = 10, 10
    
    screen.onclick(cross)
    
    cross(x, y)
    
    screen.mainloop()
    

    一般来说,我会避免使用tracer()update(),直到您的代码基本正常工作。从一开始就加入它们会使您的代码更难调试。

    【讨论】:

    • 您好,感谢您抽出宝贵时间帮助我!该解决方案有效,但如果您不介意,我有几个问题。在开始时禁用处理程序并在函数结束时启用它有什么作用?在函数之后定义像“屏幕”这样的对象是否有特殊原因?最后,我的印象是程序不能自行循环,即。它运行一次代码并完成。这就是我添加“while True”循环的原因。不是这样吗?你能解释一下它是如何在没有特定循环的情况下循环的。再次感谢您最初的帮助!
    • @ineedpythonhelppls,在开始时禁用处理程序并在结束时重新启用它,防止用户在您仍在绘制前一个十字架时开始新的十字架(即积极的点击者)。防止虚假递归和混乱的图形。
    • @ineedpythonhelppls,我通常以特定顺序定义 Python 实体。首先导入,然后是常量,然后是函数,最后是使用上述所有内容的代码。也有例外。
    • @ineedpythonhelppls,当海龟程序调用mainloop() 时,它会将控制权交给 tkinter 事件循环,该循环不断循环并检查传入事件。通过使用while True:,您可能会错过传入事件。
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多