<p>你有一个不是你自己造成的问题。乌龟一般在画布上使用的方法是乌龟。但是turtle没有固有的“Motion”事件类型,所以您尝试使用原始的<code>Canvas</code>事件类型作为替代。这就是冲突。在</p>
<p>你自己做的一个问题是,当你在一个快速移动的事件处理程序中时,你需要首先禁用事件处理程序,在退出时重新启用。否则,事件重叠,坏事就会发生。(不谨慎的递归和其他错误。)</p>
<p>我已经重新编写了你的程序如下,我相信你的意图。修复方法是添加missing turtle方法,这样我们就可以留在turtle域内:</p>
<pre><code>import tkinter as tk
from turtle import RawTurtle, TurtleScreen
from functools import partial
def onscreenmove(self, fun, add=None): # method missing from turtle.py
if fun is None:
self.cv.unbind('<Motion>')
else:
def eventfun(event):
fun(self.cv.canvasx(event.x) / self.xscale, -self.cv.canvasy(event.y) / self.yscale)
self.cv.bind('<Motion>', eventfun, add)
def getPosition(x, y):
screen.onscreenmove(None) # disable events inside handler
pen.setheading(pen.towards(x, y))
pen.goto(x, y)
screen.onscreenmove(getPosition) # reenable handler on exit
root = tk.Tk()
root.title("Draw!")
cv = tk.Canvas(root, width=500, height=500)
cv.focus_set()
cv.pack(side=tk.LEFT)
screen = TurtleScreen(cv)
screen.onscreenmove = partial(onscreenmove, screen) # install missing method
pen = RawTurtle(screen)
frame = tk.Frame(root)
frame.pack(side=tk.RIGHT, fill=tk.BOTH)
tk.Label(frame, text="Width").pack()
screen.onscreenmove(getPosition)
screen.mainloop()
</code></pre>