Переполнение стека во время перетаскивания Tkinter - PullRequest
0 голосов
/ 12 апреля 2020

Этот небольшой фрагмент кода Python реализует функцию перетаскивания в Canvas НО , когда вы перемещаете элемент, не выпуская его слишком долго (на самом деле очень быстро), переполнение стека происходит. Может кто-нибудь объяснить почему?

from tkinter import *

class Pawn():

    def __init__(self, canvas, x, y):
        self.canvas = canvas
        self.oval = canvas.create_oval(x-20, y-20, x+20, y+20, fill='black')
        canvas.tag_bind(self.oval, '<Button1-Motion>', self.move)

    def move(self, event):
        x1, y1, x2, y2 = event.x-20, event.y-20, event.x+20, event.y+20
        self.canvas.coords(self.oval, x1, y1, x2, y2)
        self.canvas.update()

class Application(Tk):

    def __init__(self, size):
        Tk.__init__(self)
        canvas = Canvas(self, height=size, width=size)
        canvas.pack(side=TOP)

        Pawn(canvas, 50, 50)
        Pawn(canvas, 100, 50)

Application(400).mainloop()

Сообщение об ошибке:

Fatal Python error: Cannot recover from stack overflow. Current thread 0x000000011917bdc0 (most recent call first): File 
"/Users/attila/opt/miniconda3/lib/python3.7/tkinter/__init__.py", line 1704 in call File 
"/Users/attila/opt/miniconda3/lib/python3.7/tkinter/__init__.py", line 1177 in update File "/Users/attila/Desktop/dnd.py", line 21 in move `

1 Ответ

1 голос
/ 12 апреля 2020

На самом деле у меня есть ответ на мой вопрос: ставить canvas.update после canvas.coords бесполезно и излишне. Без этого больше нет переполнения стека. Извините за быстрый пост. Таким образом, правильный код для метода move просто:

def move(self, event):
    x1, y1, x2, y2 = event.x-20, event.y-20, event.x+20, event.y+20
    self.canvas.coords(self.oval, x1, y1, x2, y2)
...