Comment appeler une fonction de classe depuis une autre fonction de classe

Kangoo -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonsoir,

J'ai une petite question de syntaxe qui me bloque dans mon projet. En effet, je souhaite qu'une fonction propre à une classe appelle une autre fonction de cette même classe mais je tombe sur un message d'erreur de type ''missing 1 required positional argument: ". Pouvez-vous m'aider svp ?

Voici un exemple de code illustrant le problème :


from tkinter import * # Importe Tkinter

########################

class MaClasse(): # Classe
    def __init__(self,name): # Constructeur
        self.name = name

    def fct2(self, name): # Retourne le nom du btn
        return self.name

    def fct1(self, name): # Création du bouton
        self=Button(root,text=name,command=self.fct2)
        self.pack()

########################

root=Tk() # Fenêtre

btn=MaClasse('Hello') # Instance de MaClasse
btn.fct1(btn.name)


root.mainloop()



Merci d'avance !

Kangoo

4 réponses

samigtx1459 Messages postés 482 Date d'inscription   Statut Membre Dernière intervention   67
 
Bonjour,
D'après ce que je vois lorsque tu appelles ta méthode de classe fct1 (que tu appelles fonction de classe) tu en appelles une autre (fct2) mais sans argument quand tu mets command = self.fct2. Il manque effectivement l'argument name.
0
Kangoo
 
Le problème lorsque j'écris
self=Button(root,text=name,command=self.fct2(self.name)) 
, c'est que la fonction fct2() s’exécute immédiatement et n'attend pas que je clique sur le bouton. Comment faire pour régler cela ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
à quoi sert le second paramètre de la fonction fct2?
0
Kangoo
 
Vous voulez parler du paramètre name ? A stocker le nom du bouton pour pouvoir le retourner.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Kangoo
 
je pense que tu devrais commencer par des exercices plus simples.
stocker ou retourner, il faut choisir.
0
Kangoo > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ce que je souhaite, c'est que la commande du bouton puisse renvoyer vers une méthode de la classe. J'ai pris pour exemple le fait de retourner le nom du bouton mais ça n'est qu'un exemple. On aurait pu donner d'autres directives dans fct2.

Savez-vous comment procéder svp ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Kangoo
 
change le nom du deuxième paramètre de la fonction. ce n'est pas une bonne idée d'utiliser le même nom pour différents éléments, cela crée des confusions.
0
Kangoo > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Mais c'est justement du même élément dont je parle. Le but de la fonction est d'afficher la valeur de l'attribut name que je définis avec l'instance. Le paramètre que prend cette méthode est en fait un attribut de la classe.
0
Kangoo
 
Je viens de trouver une solution mais elle n'est pas très esthétique. Je passe par une troisième méthode qui ne nécessite pas de préciser de paramètre, et dont le but est de lancer fct2. Voici le code.

from tkinter import * # Importe Tkinter

########################

class MaClasse(): # Classe
    def __init__(self,name): # Constructeur
        self.name = name

    def fct2(self, name): # Retourne le nom du btn
        print (self.name)

    def fct3(self):
        self.fct2(self.name)

    def fct1(self, name): # Création du bouton
        self=Button(root,text=name,command=self.fct3)
        self.pack()

########################

root=Tk() # Fenêtre

btn=MaClasse('Hello') # Instance de MaClasse
btn.fct1(btn.name)


root.mainloop()


Peut-être y a-t'il une technique plus "propre" ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
essaie ceci, dans ce que tu penses être une solution:
    def fct2(self, unparametreinutilise): # Retourne le nom du btn
        print (self.name)    

surtout, avant d'utiliser les classes, prend un peu de temps pour comprendre les fonctions et leurs paramètres.
0
Kangoo > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Malheureusement, ça ne marche pas lorsque je rajoute cela. La console me renvoie : "TypeError: fct2() missing 1 required positional argument: 'unparametreinutilise'"
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Kangoo
 
quand tu modifies ton code, n'hésite pas à partager ce que tu fais, au lieu de partager uniquement le message d'erreur.
0
vortex
 
Bonsoir,

Nomme ta classe et ses méthodes correctement, des fct* ne correspond aucunement à ce que ces méthodes sont censées faire.

Si ta classe est supposée représenter un bouton tkinter avec des options prédéfinies, alors fais lui hériter de Button.

Là en l'état on ne comprend pas pourquoi dans ta classe tu as besoin de passer en paramètre name qui est déjà connu.

Maintenant lorsqu'on a besoin de passer des paramètres à une fonction à fournir dans un paramètre d'une autre fonction, on utilise une fonction anonyme.

def execute(func):
    func()

def test(arg):
    print(arg)

execute(lambda: test('test'))


C'est le genre de chose à utiliser avec parcimonie.
0
azerty
 
Bonjour, j'ai besoin d'aide pour résoudre un exercice êtes-vous dispo ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peux-tu créer une nouvelle discussion?
0