我猜您只是导入 pynput,因为海龟屏幕对象缺少其 tkinter 基础的 'Motion' 事件。如果是这样,我们可以将缺失的事件安装到 turtle 中来实现您的数字化器:
from turtle import Turtle, Screen, Vec2D
from functools import partial
class MyException(Exception):
pass
def onscreenmove(self, fun, add=None):
''' Event method missing from turtle '''
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 on_left_click(x, y):
raise MyException(Vec2D(x, y))
def on_move(x, y):
screen.onmove(None) # disable events inside handler
print('Pointer: {0}'.format(Vec2D(x, y)))
turtle.setheading(turtle.towards(x, y))
turtle.goto(x, y)
screen.onmove(on_move) # reenable handler
turtle = Turtle()
turtle.speed('fastest')
screen = Screen()
screen.onmove = partial(onscreenmove, screen) # install missing method
screen.onmove(on_move)
screen.onclick(on_left_click, btn=1) # btn=1 is the default
screen.mainloop()
屏幕
控制台
> python3 test.py
Pointer: (336.00,-73.00)
Pointer: (289.00,-56.00)
Pointer: (256.00,-43.00)
Pointer: (233.00,-35.00)
Pointer: (220.00,-31.00)
Pointer: (216.00,-30.00)
...
Pointer: (139.00,-37.00)
Pointer: (131.00,-35.00)
Pointer: (117.00,-25.00)
Pointer: (165.00,-24.00)
Pointer: (275.00,-28.00)
Pointer: (337.00,-29.00)
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
return self.func(*args)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py", line 675, in eventfun
fun(x, y)
File "test.py", line 20, in on_left_click
raise MyException(Vec2D(x, y))
MyException: (151.00,334.00)
Pointer: (150.00,334.00)
Pointer: (147.00,334.00)
Pointer: (143.00,334.00)
...
Pointer: (20.00,273.00)
Pointer: (-46.00,306.00)
Pointer: (-141.00,360.00)
>