用鼠标指针移动 python 只乌龟
Move python turtle with mouse pointer
我一直在尝试为我的手写文本识别项目保存捕获手写文本的图像。为此,我使用了 python 乌龟。我想通过移动鼠标来更改 canvas 上乌龟的坐标(在笔向上位置),并通过在按住鼠标左键的同时移动鼠标使其写入(在笔向下位置)。我无法实现这一点。这是我的代码。
import tkinter
import turtle
sc = tkinter.Tk()
sc.geometry("1000x1000+100+100")
fr4 = tkinter.Frame(sc, height=500, width=600, bd=4, bg="light green", takefocus="", relief=tkinter.SUNKEN)
fr4.grid(row=2, column=2, sticky=(tkinter.N, tkinter.E, tkinter.W, tkinter.S))
# Canvas
canvas = tkinter.Canvas(fr4, width=1920, height=1080)
canvas.pack()
# Turtle
turtle1 = turtle.RawTurtle(canvas)
turtle1.color("black")
turtle1.shape("turtle")
turtle1.speed(100000)
def drag_handler(x, y):
turtle1.ondrag(None) # disable event inside event handler
turtle1.goto(x, y)
turtle1.ondrag(drag_handler) # reenable event on event handler exit
turtle1.ondrag(drag_handler)
sc.mainloop()
以下是我对您所描述内容的实施。我已经将它从 Tk 中移出并直接放入 turtle 中。但是,我引入了低级 Tk 调用来实现缺少的 turtle onmove()
事件处理程序。一旦到位,它就变成了管理运动、点击、释放和拖动的问题。请务必先单击 window 的标题栏以将其激活:
from turtle import Turtle, Screen
MOVING, DRAGGING = range(2) # states
def move_handler(x, y):
if state != MOVING: # ignore stray events
return
onmove(screen, None) # avoid overlapping events
yertle.penup()
yertle.setheading(yertle.towards(x, y))
yertle.goto(x, y)
onmove(screen, move_handler)
def click_handler(x, y):
global state
yertle.onclick(None) # disable until release
onmove(screen, None) # disable competing handler
yertle.onrelease(release_handler) # watch for release event
yertle.ondrag(drag_handler) # motion is now dragging until release
state = DRAGGING
def release_handler(x, y):
global state
yertle.onrelease(None) # disable until click
yertle.ondrag(None) # disable competing handler
yertle.onclick(click_handler) # watch for click event
onmove(screen, move_handler) # dragging is now motion until click
state = MOVING
def drag_handler(x, y):
if state != DRAGGING: # ignore stray events
return
yertle.ondrag(None) # disable event inside event handler
yertle.pendown()
yertle.setheading(yertle.towards(x, y))
yertle.goto(x, y)
yertle.ondrag(drag_handler) # reenable event on event handler exit
def onmove(self, fun, add=None):
"""
Bind fun to mouse-motion event on screen.
Arguments:
self -- the singular screen instance
fun -- a function with two arguments, the coordinates
of the mouse cursor on the canvas.
Example:
>>> onmove(turtle.Screen(), lambda x, y: print(x, y))
>>> # Subsequently moving the cursor on the screen will
>>> # print the cursor position to the console
>>> screen.onmove(None)
"""
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)
screen = Screen()
screen.setup(500, 600)
screen.screensize(1920, 1080)
yertle = Turtle('turtle')
yertle.speed('fastest')
state = MOVING
# Initially we track the turtle's motion and left button clicks
onmove(screen, move_handler) # a la screen.onmove(move_handler)
yertle.onclick(click_handler) # a click will turn motion into drag
screen.mainloop()
onmove()
事件的实现来自我对 Find the cursor's current position in Python turtle, feel free to give it an upvote when you visit. (Just as your drag_handler()
is from my answer to Turtle freehand drawing 的回答,如果您还没有,请随时给它一个赞。)
我一直在尝试为我的手写文本识别项目保存捕获手写文本的图像。为此,我使用了 python 乌龟。我想通过移动鼠标来更改 canvas 上乌龟的坐标(在笔向上位置),并通过在按住鼠标左键的同时移动鼠标使其写入(在笔向下位置)。我无法实现这一点。这是我的代码。
import tkinter
import turtle
sc = tkinter.Tk()
sc.geometry("1000x1000+100+100")
fr4 = tkinter.Frame(sc, height=500, width=600, bd=4, bg="light green", takefocus="", relief=tkinter.SUNKEN)
fr4.grid(row=2, column=2, sticky=(tkinter.N, tkinter.E, tkinter.W, tkinter.S))
# Canvas
canvas = tkinter.Canvas(fr4, width=1920, height=1080)
canvas.pack()
# Turtle
turtle1 = turtle.RawTurtle(canvas)
turtle1.color("black")
turtle1.shape("turtle")
turtle1.speed(100000)
def drag_handler(x, y):
turtle1.ondrag(None) # disable event inside event handler
turtle1.goto(x, y)
turtle1.ondrag(drag_handler) # reenable event on event handler exit
turtle1.ondrag(drag_handler)
sc.mainloop()
以下是我对您所描述内容的实施。我已经将它从 Tk 中移出并直接放入 turtle 中。但是,我引入了低级 Tk 调用来实现缺少的 turtle onmove()
事件处理程序。一旦到位,它就变成了管理运动、点击、释放和拖动的问题。请务必先单击 window 的标题栏以将其激活:
from turtle import Turtle, Screen
MOVING, DRAGGING = range(2) # states
def move_handler(x, y):
if state != MOVING: # ignore stray events
return
onmove(screen, None) # avoid overlapping events
yertle.penup()
yertle.setheading(yertle.towards(x, y))
yertle.goto(x, y)
onmove(screen, move_handler)
def click_handler(x, y):
global state
yertle.onclick(None) # disable until release
onmove(screen, None) # disable competing handler
yertle.onrelease(release_handler) # watch for release event
yertle.ondrag(drag_handler) # motion is now dragging until release
state = DRAGGING
def release_handler(x, y):
global state
yertle.onrelease(None) # disable until click
yertle.ondrag(None) # disable competing handler
yertle.onclick(click_handler) # watch for click event
onmove(screen, move_handler) # dragging is now motion until click
state = MOVING
def drag_handler(x, y):
if state != DRAGGING: # ignore stray events
return
yertle.ondrag(None) # disable event inside event handler
yertle.pendown()
yertle.setheading(yertle.towards(x, y))
yertle.goto(x, y)
yertle.ondrag(drag_handler) # reenable event on event handler exit
def onmove(self, fun, add=None):
"""
Bind fun to mouse-motion event on screen.
Arguments:
self -- the singular screen instance
fun -- a function with two arguments, the coordinates
of the mouse cursor on the canvas.
Example:
>>> onmove(turtle.Screen(), lambda x, y: print(x, y))
>>> # Subsequently moving the cursor on the screen will
>>> # print the cursor position to the console
>>> screen.onmove(None)
"""
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)
screen = Screen()
screen.setup(500, 600)
screen.screensize(1920, 1080)
yertle = Turtle('turtle')
yertle.speed('fastest')
state = MOVING
# Initially we track the turtle's motion and left button clicks
onmove(screen, move_handler) # a la screen.onmove(move_handler)
yertle.onclick(click_handler) # a click will turn motion into drag
screen.mainloop()
onmove()
事件的实现来自我对 Find the cursor's current position in Python turtle, feel free to give it an upvote when you visit. (Just as your drag_handler()
is from my answer to Turtle freehand drawing 的回答,如果您还没有,请随时给它一个赞。)