用鼠标指针移动蟒蛇 [英] Move python turtle with mouse pointer

查看:32
本文介绍了用鼠标指针移动蟒蛇的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试为我的手写文本识别项目保存捕获手写文本的图像.为此,我使用了蟒蛇龟.我想通过移动鼠标来更改画布上海龟的坐标(在笔向上的位置),并通过在按住鼠标左键的同时移动鼠标来使其书写(在笔向下的位置).我无法实现这一点.这是我的代码.

I have been trying to save images capturing handwritten text for my handwritten text recognition project. For this purpose I am using the python turtle. I want to change the coordinates of the turtle (in pen up position) on the canvas by moving my mouse, and make it write (in pen down position) by moving the mouse while holding on the left mouse button. I am not able to implement this. Here is my code.

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 中移出来,直接变成了乌龟.但是,我引入了低级 Tk 调用来实现缺失的海龟 onmove() 事件处理程序.一旦到位,它就变成了管理运动、点击、释放和拖动的问题.确保首先单击窗口的标题栏以使其处于活动状态:

Below's my implementation of what you describe. I've moved it out of Tk and squarely into turtle. However, I introduce low level Tk calls to implement the missing turtle onmove() event handler. Once that's in place, it becomes a matter of managing motion, clicks, releases and drags. Make sure to click first on the window's title bar to make it active:

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() 事件实现来自我对在 Python 海龟中查找光标的当前位置的回答,请在访问时随意给它点赞.(就像你的 drag_handler() 来自我对海龟手绘的回答,请随意如果你还没有,请给一个点赞.)

The onmove() event implementation is from my answer to 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, feel free to give that one an upvote if you haven't already.)

这篇关于用鼠标指针移动蟒蛇的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆