2017-03-03 1 views
0

사용자가 점을 클릭하고 점을 그려 후 다음 선이 이전 선에 추가 된 선을 더 많이 그려주는 프로그램의 코드는 다음과 같습니다. 어떻게하면이 프로그램을 편집하여 사용자가 버튼을 누르고 (xp1, yp1)와 같은 위치로 드래그 한 다음 (xp2, yp2)를 놓은 다음 끌어서 (xp1, yp1)과 (xp2) 사이에 선을 그립니다. , yp2). 마지막으로 사용자가 여러 가지 다른 선을 만들고 "c"를 눌러 캔버스 화면을 지울 수있게합니다. 내가 아는 것처럼 마지막 기능은 "c"에 일부 기능을 바인딩해야하지만 그 기능이 무엇인지 알지 못합니다.비 연속 선 사용자 tkinter python

from Tkinter import Canvas, Tk, mainloop 
import Tkinter as tk 

# Image dimensions 
w,h = 640,480 

# Create canvas 
root = Tk() 
canvas = Canvas(root, width = w, height = h, bg = 'white') 
canvas.pack() 

# Create poly line 
class PolyLine(object): 
    def __init__(x, canvas): 
     x.canvas = canvas 
     x.start_coords = None # first click 
     x.end_coords = None # subsequent clicks 
    def __call__(x, event): 
     coords = event.x, event.y # coordinates of the click 
     if not x.start_coords: 
      x.start_coords = coords 
      return 
     x.end_coords = coords # last click 
     x.canvas.create_line(x.start_coords[0], # first dot x 
           x.start_coords[1], # first dot y 
           x.end_coords[0], # next location x 
           x.end_coords[1]) # next location y 
     x.start_coords = x.end_coords 

canvas.bind("<Button-1>", PolyLine(canvas)) # left click is used 
mainloop() 

감사합니다. 정말 감사!

답변

1
import tkinter as tk 
from time import sleep 

def getpoint1(event): 
    global x, y 
    x, y = event.x, event.y 

def getpoint2(event): 
    global x1, y1 
    x1, y1 = event.x, event.y 

def drawline(event): 
    canvas.create_line(x, y, x1, y1) 



root = tk.Tk() 

canvas = tk.Canvas(root, width=400, height=400) 
canvas.pack() 

root.bind('q', getpoint1) 
root.bind('w', getpoint2) 
root.bind('<Button-1>', drawline) 


root.mainloop() 

이것은하지만 서로 다른 키를 사용하여, 당신의 의견에 대한 질문 무엇을 꽤 많이 있습니다.

1

드로잉 라인 부분에 대해서는 글로벌리스트 변수를 사용하여 라인 포인트를 저장합니다. 목록이 비어 있으면 목록 안의 선 시작점 좌표를 저장합니다. 그렇지 않으면 시작점과 현재 커서 위치 사이에 선을 그립니다. 목록을 다시 설정합니다.

지우기 부분의 경우 canvas.delete 메서드를 "c"키 누르기로 바인딩하면됩니다.

from Tkinter import Canvas, Tk 

line = [] 

def on_click(event): 
    global line 
    if len(line) == 2: 
     # starting point has been defined 
     line.extend([event.x, event.y]) 
     canvas.create_line(*line) 
     line = [] # reset variable 
    else: 
     # define line starting point 
     line = [event.x, event.y] 

def clear_canvas(event): 
    canvas.delete('all') 

root = Tk() 
canvas = Canvas(root, bg='white') 
canvas.pack() 

canvas.bind("<Button-1>", on_click) 
root.bind("<Key-c>", clear_canvas) 

root.mainloop() 
+0

오, 죄송합니다. 내 질문에 잘못 대답했습니다. 두 점을 클릭하고 그 사이에 선을 그려 넣기를 원한다면 어떻게해야합니까? 클릭 끌기 및 놓기 누르기 ... 명확한 것은 환상적 일했다, 고맙다 –