首页 文章

用鼠标指针移动python龟

提问于
浏览
0

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

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()

1 回答

  • 0

    低于's my implementation of what you describe. I' ve将它从Tk移出并直接进入乌龟 . 但是,我引入了低级别的Tk调用来实现丢失的turtle onmove() 事件处理程序 . 一旦's in place, it becomes a matter of managing motion, clicks, releases and drags. Make sure to click first on the window' Headers 栏激活它:

    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的回答一样,如果你还没有,请随意给它一个upvote . )

相关问题