IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Problème de bind


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 7
    Points : 11
    Points
    11
    Par défaut Problème de bind
    Bonsoir à tous,
    J'aimerais créer un programme qui, à partir d'une certaine liste 'x', créé des labels et des canvas, et à ces canvas rattacher une fonction bind créant un ou plusieurs carrés dans ce canvas.
    Seulement la finalité du programme serait de pouvoir créer autant de canvas et de labels que souhaite l'utilisateur, donc je suis obligé de créer des dictionnaires de canvas et de labels, ainsi que de rentrer le bind dans une fonction, voici le programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    from Tkinter import *
     
    #definition des fonctions gestionnaires d'evenements
    def creationdiagdeprod():
        for i in nomposte:
            listelabel['lab'+str(i)]=Label(fen1,text=x[4*i],relief=RAISED )
            listelabel['lab'+str(i)].pack()
            listecanvas['can'+str(i)]= Canvas(fen1,width=700,height=40,bg ='grey')
            listecanvas['can'+str(i)].focus_set()
            listecanvas['can'+str(i)].pack(padx=10,pady=10)
            listelabel['lab'+str(i)].bind('<Button-1>',lambda event:creationcarre(event,i))
     
     
    def creationcarre(event,i):
            global nombrecarre
            Hauteurcarre = 20
            listecarre['carre'+str(nombrecarre)]=listecanvas['can'+str(i)].create_rectangle(0,0,x[3*i]*2,Hauteurcarre*2,fill='maroon')
            nomcarre.append(nombrecarre)    
            nombrecarre+=1
            print nomcarre    
     
     
    # Creation du widget principal :
    fen1=Tk()
    fen1.title("TIPE")
     
    #variables et listes:
    x=['A',455,3,2,'AA',524,25,1,'AAA',276,13,3]
    nombrecarre=0
    nomcarre=[]
    nomposte=[0,1,2]
    listecanvas={}
    listelabel={}
    listecarre={}
     
    # creation des widgets :
    bou2 = Button(fen1,text='Quitter',command=fen1.quit)
    bou2.pack(side=BOTTOM)
    bou3=Button(fen1,text='diag de prod',command=creationdiagdeprod)
    bou3.pack()
     
     
    fen1.mainloop()		# demarrage du receptionnaire d'evenements
    fen1.destroy()
    Seulement quand j'exécute ce programme et que je teste le bind, il ne créé des carrés que dans le dernier canvas, et non pas dans le canvas attaché au label.
    Avez-vous une idée de ce qui peut se passer ?

    Merci !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par Lanzeray Voir le message
    Bonsoir à tous,
    J'aimerais créer un programme qui, à partir d'une certaine liste 'x', créé des labels et des canvas, et à ces canvas rattacher une fonction bind créant un ou plusieurs carrés dans ce canvas.
    Seulement la finalité du programme serait de pouvoir créer autant de canvas et de labels que souhaite l'utilisateur, donc je suis obligé de créer des dictionnaires de canvas et de labels, ainsi que de rentrer le bind dans une fonction, voici le programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    from Tkinter import *
     
    #definition des fonctions gestionnaires d'evenements
    def creationdiagdeprod():
        for i in nomposte:
            listelabel['lab'+str(i)]=Label(fen1,text=x[4*i],relief=RAISED )
            listelabel['lab'+str(i)].pack()
            listecanvas['can'+str(i)]= Canvas(fen1,width=700,height=40,bg ='grey')
            listecanvas['can'+str(i)].focus_set()
            listecanvas['can'+str(i)].pack(padx=10,pady=10)
            listelabel['lab'+str(i)].bind('<Button-1>',lambda event:creationcarre(event,i))
     
     
    def creationcarre(event,i):
            global nombrecarre
            Hauteurcarre = 20
            listecarre['carre'+str(nombrecarre)]=listecanvas['can'+str(i)].create_rectangle(0,0,x[3*i]*2,Hauteurcarre*2,fill='maroon')
            nomcarre.append(nombrecarre)    
            nombrecarre+=1
            print nomcarre    
     
     
    # Creation du widget principal :
    fen1=Tk()
    fen1.title("TIPE")
     
    #variables et listes:
    x=['A',455,3,2,'AA',524,25,1,'AAA',276,13,3]
    nombrecarre=0
    nomcarre=[]
    nomposte=[0,1,2]
    listecanvas={}
    listelabel={}
    listecarre={}
     
    # creation des widgets :
    bou2 = Button(fen1,text='Quitter',command=fen1.quit)
    bou2.pack(side=BOTTOM)
    bou3=Button(fen1,text='diag de prod',command=creationdiagdeprod)
    bou3.pack()
     
     
    fen1.mainloop()		# demarrage du receptionnaire d'evenements
    fen1.destroy()
    Seulement quand j'exécute ce programme et que je teste le bind, il ne créé des carrés que dans le dernier canvas, et non pas dans le canvas attaché au label.
    Avez-vous une idée de ce qui peut se passer ?

    Merci !
    Bonsoir,
    Il y a plusieurs problèmes!
    (En premier dans la liste "x", ou tout au moins son appel ligne 17 que je remplacerai par "x[4*i + 1]"…)
    Sinon, il suffit de remplacer le lambda de la ligne 11 par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lambda x, y = i:creationcarre(x, y)
    Le x pour l'événement (il faut lui faire "de la place" en tant que paramètre).
    Le y doit prendre la valeur de i lorsque la lambda est créée, mais en écrivant:
    lambda x, y: fct(x, y)
    lors de l'appel, le paramètre y de la fonction prendra comme valeur celle de y (mais que vaudra y alors???).
    Pour contrevenir cela, au moment de la déclaration, on donne une valeur par défaut qui sera mise en place lors de la définition de la lambda (les valeurs par défaut ne sont évaluées qu'une seule fois: lors de la lecture de la définition de la fonction; il ne peut pas y avoir de valeur par défaut variable au cours d'un script).
    C'est cette valeur par défaut qui est exploitée ici, d'où la présence de "y = i".

    Clodion

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 7
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup Clodion, ça marche parfaitement

    Lanzeray

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WPF] Probléme de binding dans un UserControl :(
    Par UNi[FR] dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 17/07/2008, 16h51
  2. Probléme avec Bind
    Par rach20032 dans le forum Réseau
    Réponses: 2
    Dernier message: 06/07/2007, 12h36
  3. [Netbeans 6M9 JDk6.1 Matisse] problème de binding
    Par tralloc dans le forum NetBeans
    Réponses: 14
    Dernier message: 21/06/2007, 14h32
  4. problème de bindings avec DropDownList
    Par Vlatiska dans le forum ASP.NET
    Réponses: 14
    Dernier message: 17/03/2007, 15h04
  5. [C#][MySQL 5.x]Problème de Binding
    Par Oufti dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/05/2006, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo