Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Relier des objets graphiques tkinter

+1 vote

Version : python3
module : tkinter

Je souhaite relier des objets graphiques (des "ronds") entre eux, c'est à dire en cliquant sur un rond, ensuite sur un deuxième, et hop un "un create_line" apparait entre les deux.
J'en suis au stade où j'ai crée un quadrillage, et je vais passer au stade de relier les points entre eux lorsque l'utilisateur clique sur un rond, puis le deuxieme,
voici le main :

import tkinter as tk
import libui_fork_test as ui

# initialisations
# Par défaut, la hauteur et la largeur du qadrillage est 2x2
h,l = 2,2 

# fenêtre principale

root = ui.create_root()

# zone graphique

my_canvas = ui.create_canvas(root)
my_canvas.pack(side = tk.LEFT) 

# configuration des bouttons

ButtonDraw, ButtonDelete, ButtonOut = ui.create_all_buttons(root,my_canvas,h,l)

hauteur_label = tk.Label(root, text = 'hauteur')
hauteur_label.pack()
hauteur_entry = tk.Entry(root)
hauteur_entry.pack() 

largeur_label = tk.Label(root, text = 'largeur')
largeur_label.pack()
largeur_entry = tk.Entry(root)
largeur_entry.pack() 

root.mainloop()

voici ma lib peso, c'est ici que je dois implémenter la fonction qui associe au clic souris le fait de relier deux ronds :

import tkinter as tk
import mainproj_fork_test as main

def create_root():
    """ creer la fenêtre principale"""
    root = tk.Tk()
    root.title('entrelaceur')
    return root

def create_canvas(root):
    """ creer la zone de dessin qui va contenir l'entrelacs ainsi que le quadrillage"""
    mycanvas = tk.Canvas(root, bg ='white')
    return mycanvas

def create_button_draw():
    BoutonDraw = tk.Button(main.root, text = 'draw', command=create_noeuds)
    return BoutonDraw

def create_button_delete(root, my_canvas):
    BoutonDelete = tk.Button(main.root, text = 'delete', command = lambda:my_canvas.delete(tk.ALL))
    return BoutonDelete

def create_button_quitter(root):
    BoutonOut = tk.Button(main.root,text="Sortir",command=main.root.destroy)
    return BoutonOut

def create_all_buttons(root, my_canvas, h, l):
    """ Créer et pack les boutons : Draw permettant de dessiner les noeuds, Delete permettant de supprimer le quadrillage, Sortir permettant de détruire la fenetre principale"""
    BoutonDraw = create_button_draw()
    BoutonDraw.pack()

    BoutonDelete = create_button_delete(root, my_canvas)
    BoutonDelete.pack()

    BoutonOut = create_button_quitter(root)
    BoutonOut.pack()

    return (BoutonDraw,BoutonDelete, BoutonOut)

def create_noeuds():
    create_noeuds1()
    create_noeuds2()

def create_noeuds1():
    """ Créer un quadrillage de noeuds en fonction de sa dimension ligne/colonne """
    h = main.hauteur_entry.get()
    l = main.largeur_entry.get()
    i, j = 0, 0 
    x0,y0,x1,y1 = 30, 30 , 50 ,50
    # création du quadrillage de dimension ligne, colonne  
    while i < int(l)-1 :
        while j < int(h)-1 :
            main.my_canvas.create_oval(x0,y0,x1,y1, fill = 'black')
            x0 ,x1 = x0 + 60 , x1 + 60
            j = j + 1
        j = 0
        i = i + 1
        y0, y1 = y0 + 60, y1 + 60
        x0, x1 = 30, 50

def create_noeuds2():
    h = main.hauteur_entry.get()
    l = main.largeur_entry.get()
    i, j = 0, 0
    x0,y0,x1,y1 = 0, 0, 20, 20 
    while i < int(l):
        while j < int(h):
            main.my_canvas.create_oval(x0,y0,x1,y1, fill = 'red')
            x0, x1 = x0 + 60, x1 + 60
            j = j+1
        j = 0
        i = i+1
        y0, y1 = y0 + 60, y1 + 60
        x0, x1 = 0, 20

def create_matrice(ligne, colonne):
    n=[0]*ligne
    m=[0]*colonne
    l=[n,m]
    print(l)
"""
def clic_listbox(event):
    i=listbox.curselection()  ## Récupération de l'index de l'élément sélectionné 
    return listbox.get(i)  ## On retourne l'élément (un string) sélectionné  
"""
#def create_listbox(root):

J'aimerai quelques conseils pour commencer à régler mon problème, ou au moins savoir comment m'y prendre, où aller, bref vos points de vue.
kiss =D

demandé 16-Mar-2015 par boblinux (3,092 points)
edité 16-Mar-2015 par boblinux

1 Réponse

+2 votes
 
Meilleure réponse

Je ferais ainsi:

Au clic, tu dessines une ligne de 1px de long sous la souris.

Ensuite, quand tu bouge la souris, tu update un des bouts de la ligne pour matcher les nouvelles coordonnées de la souris.

Quand tu laches le bouton, ça arrête la mise à jour des coordonnées, et ça change la ligne de couleur afin de matcher celle des ronds, puis ça met la ligne à en background par rapport aux ronds pour donner l'impression qu'ils sont reliés.

répondu 30-Mar-2015 par Sam (4,974 points)
sélectionné 11-Avr-2015 par boblinux
...