2016-11-29 45 views
0

現在、私は折り紙アーティストがこのプログラムを使用して自分のコンピュータ上に折り目パターンを作成できるようにするプログラムに取り組んでいます。これまで私はキャンバス上にグリッドを描き、フリーフォームの線を描画するプログラムを用意していましたが、ユーザーには直線を描画する必要がありますが、このコードをどのように適応させるかはわかりません直線的に線を引いて、自由に揺れません。ここに私のコードは、これまでです:マウスを使ってPython上のGridでtkinterキャンバス上に直線を描く

from tkinter import * 

Mouse = "up" 
xold, yold = None, None 
def DrawGrid(drawing_area, line_distance): 

    for x in range(line_distance,600,line_distance): 
     drawing_area.create_line(x, 0, x, 600, fill="#d3d3d3") 

    for y in range(line_distance,600,line_distance): 
     drawing_area.create_line(0, y, 600, y, fill="#d3d3d3") 

def main(): 
    root = Tk() 
    drawing_area = Canvas(root, width=600, height=600, bg='white') 
    drawing_area.pack() 
    DrawGrid(drawing_area, 10) 
    drawing_area.bind("<Motion>", motion) 
    drawing_area.bind("<ButtonPress-1>", Mousedown) 
    drawing_area.bind("<ButtonRelease-1>", Mouseup) 

    root.mainloop() 

def Mousedown(event): 
    global Mouse 
    Mouse = "down"   

def Mouseup(event): 
    global Mouse, xold, yold 
    Mouse = "up" 
    xold = None   
    yold = None 

def motion(event): 
    if Mouse == "down": 
     global xold, yold 

    if xold is not None and yold is not None: 
     event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE) 

    xold = event.x 
    yold = event.y 


main() 

は、 Mistry27

答えて

0

をありがとう私のソリューションは、ユーザーが一度に一つの線を引くようにすることです。つまり、マウスを動かすと、新しい行を作成し続けることはありません。代わりに、既存の行を変更します。

たとえば、ユーザーがクリックしてマウスを移動したときに、マウスがどこにあっても、クリックした場所から1行だけが描画されるようにすることができます。それは常に線が常に真っ直ぐになるようにします。

私はあなたのコードから始めて、これがどのように機能するかを示すためにできるだけ少数の変更を加えました。クリック、ドラッグ、クリック、ドラッグ、クリックなどをすると、クリックごとに1つの線分だけが描画されます。現在の行から完全に切断された新しい行を開始する場合は、キーを押します。

このコードでは、変数currentには、現在描画されている行のIDが含まれています。 を押してをエスケープすると、Noneにリセットされます。マウスをクリックするたびに、currentの末尾または現在のマウスの位置から新しい行が開始されます。モーション中に、現在の行の終点をリセットするだけです。

from tkinter import * 

current = None 

def DrawGrid(drawing_area, line_distance): 

    for x in range(line_distance,600,line_distance): 
     drawing_area.create_line(x, 0, x, 600, fill="#d3d3d3") 

    for y in range(line_distance,600,line_distance): 
     drawing_area.create_line(0, y, 600, y, fill="#d3d3d3") 

def main(): 
    root = Tk() 
    drawing_area = Canvas(root, width=600, height=600, bg='white') 
    drawing_area.pack() 
    DrawGrid(drawing_area, 10) 
    drawing_area.bind("<Escape>", reset) 
    drawing_area.bind("<Motion>", motion) 
    drawing_area.bind("<ButtonPress-1>", Mousedown) 

    root.mainloop() 

def reset(event): 
    global current 
    current = None 

def Mousedown(event): 
    global current 

    event.widget.focus_set() # so escape key will work 

    if current is None: 
     # the new line starts where the user clicked 
     x0 = event.x 
     y0 = event.y 

    else: 
     # the new line starts at the end of the previously 
     # drawn line 
     coords = event.widget.coords(current) 
     x0 = coords[2] 
     y0 = coords[3] 

    # create the new line 
    current = event.widget.create_line(x0, y0, event.x, event.y) 

def motion(event): 
    if current: 
     # modify the current line by changing the end coordinates 
     # to be the current mouse position 
     coords = event.widget.coords(current) 
     coords[2] = event.x 
     coords[3] = event.y 

     event.widget.coords(current, *coords) 

main() 
+0

私のプログラムでは、ユーザーがクリックを解除した後に線を引く必要があります。前の行の最後から行を続けるオプションはありませんが、できるはずですあなたの例を使ってこれを理解する。 –

関連する問題