我一直在尝试为我的手写文本识别项目保存捕获手写文本的图像。为此我使用的是蟒蛇龟。我想通过移动鼠标在画布上更改乌龟的坐标(在笔上位置),并通过在按住鼠标左键的同时移动鼠标来使其写入(在笔下位置)。我无法实现这一点。这是我的代码。
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()
答案 0 :(得分:0)
下面是我对你描述的内容的实现。我已将它从Tk中移出并直接进入乌龟。但是,我引入了低级别的Tk调用来实现丢失的turtle onmove()
事件处理程序。一旦到位,就会成为管理动作,点击,发布和拖动的问题。确保先在窗口的标题栏上单击以激活它:
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的回答,请您在访问时给它一个upvote。 (正如您的drag_handler()
来自我对Turtle freehand drawing的回答一样,如果您还没有,请随意给予该投票。)