2017-06-16 27 views
0

手書きテキスト認識プロジェクトの手書きテキストをキャプチャした画像を保存しようとしています。この目的のために、私はパイソンカメを使用しています。私はマウスを動かしてキャンバス上のカメの座標を変更し、マウスの左ボタンを押しながらマウスを動かすことでペンの位置を書き込むようにします。私はこれを実装することができません。ここに私のコードです。マウスポインターでpython turtleを移動する

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

「これを実装することができません。問題。まさにあなたが望むように何が起こっていないのですか?エラーがある場合、完全なトレースバックは何ですか? [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 –

+0

マウスでタートルをドラッグしたい場合にコードが機能します – eyllanesc

+0

@eyllanesc、彼の説明を再読します。彼はマウスを常に追跡して、マウスの左ボタンが押されたときにしか軌跡を残さないようにしたい。提供されるコードはドラッグアンドドローを行いますが、マウスボタンが押されていないときは追跡しません。 – cdlane

答えて

0

以下は、私があなたの説明を実装したものです。私はそれをTkの外に移動させ、正にカメに移しました。しかし、私は低レベルのTkコールを導入して、亀の欠如を実装する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になったのと同じように、あなたがまだ持っていなければそれをアップアップしてください。)

+0

この実装は、私のマウスの動きがペン・ダウン位置で遅いときには完全に機能しますが、(誰かの書いたように)不安定なときは、バグがあります。時々、カメは痕跡を残さず、ドラグの最初と最後の位置の間に直線のみを描くこともあります。 – TheBeginner

+0

@ TheBeginner、私はコードを計測し、予期せぬ動きイベントを生成したので、明示的な状態変数を追加してそのような障害を除外しました。それはたくさんのクリーナーを描画します。あなたが完璧である必要があれば、セマフォーとロックを調べるかもしれません。 – cdlane

関連する問題