Création automatique de fonction

Résolu
Pr.Witherfire Messages postés 84 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

J'aimerais créer automatiquement une fonction. J'y arrive pour les variables. Mais pas pour les fonctions.

En fait, je voudrais créer plusieurs ensembles de boutons représentant un projet (déjà créés automatiquement par l'utilisateur avec un bouton) les boutons de ces ensembles ont des buts spéciaux: modifier le projet, supprimer le projet, ouvrir le projet...  C'est simple : si par exemple un bouton supprimer projet est cliqué, une fonction de suppression du frame (contenant les boutons) sur lequel la souris est actuellement va être exécutée. Du coup, il faudrait que, quand la souris est sur le frame 3, ça exécute la fonction de mettre la variable Frameconcerné = 3. Si elle survole le frame 5, Frameconcerné = 5, ect... Le truc, c'est que le frame est créer de toute pièce quand l'utilisateur clique sur le bouton +. Il faut donc que la fonction soit crée de toute pièce

Désolé pour le pavé et les explications douteuses...


Android / Chrome 104.0.0.0


Que Notch soit avec vous

12 réponses

  1. Utilisateur anonyme
     

    Bonjour 

    Le truc, c'est que le frame est créer de toute pièce quand l'utilisateur clique sur le bouton +. Il faut donc que la fonction soit crée de toute pièce

    heu, non, il suffit de récupérer l'instance du frame où se trouve la souris ou de la stocker dans une liste (par exemple) au moment de la création.

    Je ne suis pas assez bon en python pour te faire un exemple.


    0
  2. Pr.Witherfire Messages postés 84 Statut Membre
     

    Merci mais le frame concerné peut varier, ce n'est pas toujours le même.


    0
    1. tiroutoutou
       

      Salut, qu'est-ce qui t'empêche de modifier les commandes de tes boutons lorsqu'une nouvelle frame est créée ?

      0
  3. Utilisateur anonyme
     

    mais le frame concerné peut varier

    Oui, d'où l'idée de récupérer l'instance concernée ou de la stocker.


    0
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    Je pense que ce que tu souhaites faire, c'est, quand le bouton est cliqué, appeler une fonction avec un paramètre.

    Si tu montres ton code, nous pourrons sans doute te montrer comment réaliser cela.

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      SI tu veux associer au bouton la fonction clic() avec un paramètre, disons 123, tu peux faire ainsi:

         , command=lambda clic(123) , 
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Pr.Witherfire Messages postés 84 Statut Membre
     
    From tkinter import *
    
    Nbdeprojet = 0
    
    Nbdeprojetsplus1 = Nbdeprojet+1
    
    Fenêtre = Tk()
    
    Def supprimer projet ():
        
        #Suppression de la frame dont le numéro est la variable frameactive
    
    Def creerprojet ():
    
        globals["Projet"+str(nbdeprojetsplus1+"num"]= str(nbdeprojetsplus1)
    
    Globals["FrameProjet"+str(nbdeprojetsplus1)]= Frame(Fenêtre)
    ["frameProjet"+str(nbdeprojetsplus1)].pack()
    
    Globals["ButtonSupprimerProjet"+str(nbdeprojetsplus1)]=Button(frameProjet,command= Supprimer projet)
    ["ButtonSupprimerProjet"+str(nbdeprojetsplus1)].pack()
    
    Nbdeprojet = Nbdeprojet+1
    
    
    
    BoutonAjouterProjet = Button(Fenêtre, command = creerprojet)
    BoutonAjouterProjet.pack()
    
    Fenêtre.mainloop()
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Pourquoi partages-tu du code qui ne fonctionne pas?

      Plein d'erreurs.

      0
  7. Pr.Witherfire Messages postés 84 Statut Membre
     

    Je voudrais que la variable active = le numéro de la frame que la souris survole.


    0
  8. Pr.Witherfire Messages postés 84 Statut Membre
     

    C'est parce que je n'ai pas encore le code. Je l'ai fait maintenant selon ce que je voudrais faire plus tard.


    0
  9. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    ainsi:

    import tkinter
    mesprojets=[]
    class Projet:
        def __init__(self):
            mesprojets.append(self)
            self.num=str(Nbdeprojet+1)
            fp=tkinter.Frame(Fenêtre)
            self.frameprojet=fp
            bt=tkinter.Button(fp,text="REMOVE "+self.num,command= lambda: Projet.supprimerprojet(self))
            fp.pack()
            bt.pack()
        def supprimerprojet(self):
            self.frameprojet.destroy()
            print("suppression projet",self.num)
            mesprojets.remove(self)
            print("il reste",str(len(mesprojets)),"projets")
    
    
    Nbdeprojet = 0
    def creerprojet():
        global Nbdeprojet
        np=Projet()
        Nbdeprojet = Nbdeprojet+1
    
    
    Fenêtre = tkinter.Tk()
    BoutonAjouterProjet = tkinter.Button(Fenêtre, command = creerprojet)
    BoutonAjouterProjet.pack()
    Fenêtre.mainloop()
    
    0
  10. Pr.Witherfire Messages postés 84 Statut Membre
     

    Merci beaucoup ça marche. Vous êtes vraiment des programmateurs de fou... Merci.


    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      une variante:

      import tkinter
      
      class Projet:
          mesprojets=[]
          Nbdeprojet = 0
          def __init__(self):
              Projet.mesprojets.append(self)
              self.num=str(Projet.Nbdeprojet+1)
              fp=tkinter.Frame(Fenêtre)
              self.Frame=fp
              bt=tkinter.Button(fp,text="REMOVE "+self.num,command= lambda: Projet.supprimerprojet(self))
              fp.pack()
              bt.pack()
              Projet.Nbdeprojet = Projet.Nbdeprojet+1
          def __del__(self):
              print("bye",self.num)
          def supprimerprojet(self):
              self.Frame.destroy()
              print("suppression projet",self.num)
              Projet.mesprojets.remove(self)
              print("il reste",str(len(Projet.mesprojets)),"projets")
          def fini():
              Projet.mesprojets=[]
              print("bye bye")
      
      Fenêtre = tkinter.Tk()
      BoutonAjouterProjet = tkinter.Button(Fenêtre, text="nouveau projet",command = lambda:Projet())
      BoutonAjouterProjet.pack()
      Fenêtre.mainloop()
      Projet.fini()
      
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      peux-tu, alors, marquer la discussion comme résolue?

      1
  11. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    Dans le code que tu proposes en #7, tu crées dynamiquement des variables, en utilisant globals()[abcd].  Exemple:

    Globals["FrameProjet"+str(nbdeprojetsplus1)]= Frame(Fenêtre)

    Ce n'est pas une bonne pratique.  Regarde comment j'ai fait autrement dans le code que j'ai suggéré.

    0
    1. Pr.Witherfire Messages postés 84 Statut Membre
       

      Tu as utilisé self, c'est ça ?

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Pr.Witherfire Messages postés 84 Statut Membre
         

        La prochaine fois que tu es tenté d'utiliser globals(), fais appel, nous pourrons suggérer une meilleure approche.

        0
  12. Utilisateur anonyme
     

    Vous êtes vraiment des programmateurs de fou

    Alors non, et non, d'abord un programmateur c'est oar exemple, le bouton de la machine à laver qui te permet de choisir entre un cycle pour laver le blanc ou un pour laver la couleur.

    Nous sommes (toi y compris) programmeur ou développeur.

    Ensuite, https://codes-sources.commentcamarche.net/forum/affich-10107769-message-a-tous-les-debutants-souvent-autodidactes#p10107769 C'est caricatural, mais cette discussion et quelques une des précédentes tendent à montrer que ça te concerne en parti

    0
  13. Pr.Witherfire Messages postés 84 Statut Membre
     

    Ok. Désolé ;)

    J'essaye un maximum d'apprendre comme il le faudrait mais c'est vrai que c'est un peu compliqué...

    ;)

    En tous cas, merci


    0
    1. Utilisateur anonyme
       

      Et bien fais les choses dans l'ordre, commence par prendre quelques jours pour apprendre les bases, et reprends ton projet ensuite.

      Tu n'auras pas la.solution à toutes les difficultés que tu rencontreras, mais quand tu poseras une question, tu auras les acquis pour comprendre les réponses.

      0