Ядро падает при попытке перетащить черепаху в питон - PullRequest
0 голосов
/ 24 мая 2018

Я решил использовать встроенную черепаху для отображения всей моей программы, но если есть лучший вариант, вы также можете оставить ее здесь.

Итак, когда я использовал черепаху и привязалФункция перетаскивания левой кнопкой мыши работает нормально, но только для медленных скоростей мыши и, таким образом, в течение короткого промежутка времени перед тем, как разбить мое ядро ​​и выдать мне фатальную ошибку «переполнения стека».

Код:

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)

1 Ответ

0 голосов
/ 24 мая 2018

Есть несколько проблем с вашим кодом:

  • Вы не отключили события внутри обработчика событий, что и привело к вашей фатальной ошибке «переполнение стека».

  • Вы обошли механизм событий собственной черепахи и использовали механизм поддержки 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()
...