簡體   English   中英

嘗試在python中拖動烏龜時內核崩潰

[英]Kernel crashes when trying to drag a turtle in python

我決定使用內置的Turtle來顯示整個程序,但是如果有更好的選擇,您也可以將其保留在此處。

因此,當我使用烏龜並將函數綁定到左鍵單擊拖動時,它最終可以正常工作,但僅適用於緩慢的鼠標速度,因此,在崩潰內核並給我致命的“堆棧”之前需要很短的時間溢出”錯誤。

碼:

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)

您的代碼有幾個問題:

  • 您沒有在事件處理程序內部禁用事件,這是導致致命的“堆棧溢出”錯誤的原因。

  • 您繞過了烏龜自身的事件機制,並使用了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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM