2017-03-03 3 views
0

Voici donc le code d'un programme où l'utilisateur peut cliquer sur un point et il dessine un point, puis les clics suivants dessinent plus de lignes attachées à la ligne précédente. Comment éditerais-je ce programme pour laisser l'utilisateur appuyer sur le bouton et avoir comme (xp1, yp1) et ensuite glisser où et relâcher à (xp2, yp2) puis tracer une ligne entre (xp1, yp1) et (xp2 , yp2). Enfin, il permettrait à l'utilisateur de créer de nombreuses lignes différentes, puis finalement être en mesure d'effacer l'écran de toile en appuyant sur "c". Comme je sais que la dernière chose devrait lier une fonction à "c" mais je ne sais pas ce que c'est.utilisateur de ligne non continu dessiner 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() 

Merci beaucoup pour votre temps! J'apprécie vraiment cela!

Répondre

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

C'est à peu près ce que vous avez demandé sur votre commentaire, mais avec des clés différentes.

1

Pour la partie de ligne de dessin, j'utilise une variable de liste globale pour stocker les points de ligne. Si la liste est vide, alors je stocke les coordonnées du point de départ de la ligne dans la liste. Sinon, je dessine la ligne entre le point de départ et la position actuelle du curseur et je réinitialise la liste.

Pour la partie nettoyage, vous devez associer la méthode canvas.delete à la touche "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

Oh désolé j'ai mal formulé ma question, et si je voulais cliquer deux points et faire une ligne entre eux? Non cliquez sur glisser et relâcher ... Le clair a fonctionné fantastique, merci –