我正在尝试执行其中一个Stackoverflow答案中的代码。这是一个带有2个圆圈的单一窗口应用程序,可以用鼠标移动。 当我移动圆圈时 - 我看到了文物。见Sample
程序代码:
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", "<ButtonPress-1>", self.on_token_press)
self.canvas.tag_bind("token", "<ButtonRelease-1>", self.on_token_release)
self.canvas.tag_bind("token", "<B1-Motion>", 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()
代码具有TOKENWIDTH,它在标准的Canvas.create_oval()方法中使用。
我进行了一些实验,发现当TOKENWIDTH设置为6或更高时,代码在移动对象时会在Canvas上产生伪影。如果TOKENWIDTH在1..5之内,一切都很好。
以下代码行无效:
self.canvas.update_idletasks()
如何解决这个问题?有任何想法吗? 作为一种解决方法,我考虑将两个不同颜色的圆圈放在另一个上,以产生圆形“边框”效果。