尝试在 python 中拖动乌龟时内核崩溃

Kernel crashes when trying to drag a turtle in python

我决定使用内置的乌龟来显示我的整个程序,但如果有更好的选择,你也可以把它留在这里。

所以,当我使用 turtle 并将一个函数绑定到左键单击拖动时,它最终工作正常,但仅适用于较慢的鼠标速度,因此,在崩溃我的内核并给出之前的短时间内我遇到了致命的 "stack overflow" 错误。

代码:

from turtle import *
screen = Screen()
t1 = Turtle()
t1.shape("circle")
t1.pu()
bi = 1
ni = 1
screen.tracer(None, 0)
t1.speed(0)
screen.screensize(1000,1000)
def grow(ke):
    t1.goto(ke.x - 475,-ke.y + 400)
    global bi, ni
    t1.shapesize(bi,ni)
    bi += .004
    ni += .004
s2 = getcanvas()
s2.bind("<B1-Motion>", grow)
s2.bind("<Button-1>", grow)

您的代码存在几个问题:

  • 您没有在事件处理程序中禁用事件,这导致 到你的致命 "stack overflow" 错误。

  • 你绕过了turtle自己的事件机制,使用了tkinter的 支撑。有时这是必要的,但它不是该去的地方 开始。

  • 您不需要关闭 tracer(),因为您没有画任何东西。

下面是我对您的代码进行的修改,我相信它可以实现您的基本目标。你可以干净利落地在屏幕上拖动乌龟,它会随着你的成长而成长。你可以点击屏幕上的任何地方,乌龟会来找你长大:

from turtle import Turtle, Screen

def grow(x, y):
    global bi, ni

    turtle.ondrag(None)  # disable events when inside handler
    screen.onclick(None)

    turtle.goto(x, y)
    turtle.shapesize(bi, ni)

    bi += 0.04
    ni += 0.04

    turtle.ondrag(grow)
    screen.onclick(grow)

screen = Screen()
screen.screensize(1000, 1000)

turtle = Turtle('circle')
turtle.speed('fastest')
turtle.penup()

bi = ni = 1

turtle.ondrag(grow)
screen.onclick(grow)

screen.mainloop()