Création automatique de fonction

Résolu
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 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


12 réponses

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
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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


0
tiroutoutou
 

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

0
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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

   , command=lambda clic(123) , 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

Pourquoi partages-tu du code qui ne fonctionne pas?

Plein d'erreurs.

0
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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


0
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

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
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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


0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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

1
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

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
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
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
Pr.Witherfire Messages postés 79 Date d'inscription   Statut Membre Dernière intervention  
 

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