El método tkinter.Canvas.move () de Python3 crea artefactos en la pantalla

Estoy intentando ejecutar el código que se encuentra en una de las respuestas de Stackoverflow. Es una aplicación de una sola ventana con 2 círculos que se pueden mover con el mouse. Cuando muevo círculos – veo artefactos. Ver muestra

Código de progtwig:

import tkinter as tk TOKENWIDTH = 10 class Example(tk.Frame): '''Illustrate how to drag items on a Tkinter canvas''' def __init__(self, parent): tk.Frame.__init__(self, parent) # create a canvas self.canvas = tk.Canvas(width=400, height=400, bg="white") self.canvas.pack(fill="both", expand=True) # this data is used to keep track of an # item being dragged self._drag_data = {"x": 0, "y": 0, "item": None} # create a couple of movable objects self._create_token((100, 100), "red") self._create_token((200, 100), "black") # add bindings for clicking, dragging and releasing over # any object with the "token" tag self.canvas.tag_bind("token", "", self.on_token_press) self.canvas.tag_bind("token", "", self.on_token_release) self.canvas.tag_bind("token", "", self.on_token_motion) def _create_token(self, coord, color): '''Create a token at the given coordinate in the given color''' (x,y) = coord self.canvas.create_oval(x-25, y-25, x+25, y+25, outline="blue", fill=color, tags="token", width = TOKENWIDTH) def on_token_press(self, event): '''Begining drag of an object''' # record the item and its location self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0] self._drag_data["x"] = event.x self._drag_data["y"] = event.y self.canvas.update_idletasks() def on_token_release(self, event): '''End drag of an object''' # reset the drag information self._drag_data["item"] = None self._drag_data["x"] = 0 self._drag_data["y"] = 0 self.canvas.update_idletasks() def on_token_motion(self, event): '''Handle dragging of an object''' # compute how much the mouse has moved delta_x = event.x - self._drag_data["x"] delta_y = event.y - self._drag_data["y"] # move the object the appropriate amount self.canvas.move(self._drag_data["item"], delta_x, delta_y) # record the new position self._drag_data["x"] = event.x self._drag_data["y"] = event.y self.canvas.update_idletasks() if __name__ == "__main__": root = tk.Tk() Example(root).pack(fill="both", expand=True) root.mainloop() 

El código tiene TOKENWIDTH que se usa en el método estándar de Canvas.create_oval ().

Experimenté un poco y descubrí que cuando TOKENWIDTH se establece en 6 o más, el código produce artefactos en el canvas cuando se mueve un objeto. Si TOKENWIDTH está dentro de 1..5 todo funciona muy bien.

La siguiente línea de código no ayuda:

self.canvas.update_idletasks ()

¿Cómo se pueden solucionar estos problemas? ¿Algunas ideas? Como solución alternativa, pienso en poner dos círculos de diferente color uno sobre otro para hacer un efecto de “borde” redondo.