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

Fermé
Kangoo - 13 août 2021 à 23:49
yg_be Messages postés 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 - 15 août 2021 à 15:51
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
A voir également:

4 réponses

samigtx1459 Messages postés 482 Date d'inscription vendredi 3 août 2012 Statut Membre Dernière intervention 13 janvier 2024 67
Modifié le 14 août 2021 à 11:37
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
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 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 Ambassadeur 1 564
14 août 2021 à 12:52
bonjour,
à quoi sert le second paramètre de la fonction fct2?
0
Vous voulez parler du paramètre name ? A stocker le nom du bouton pour pouvoir le retourner.
0
yg_be Messages postés 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 1 564 > Kangoo
14 août 2021 à 14:46
je pense que tu devrais commencer par des exercices plus simples.
stocker ou retourner, il faut choisir.
0
Kangoo > yg_be Messages postés 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025
Modifié le 14 août 2021 à 16:22
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 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 1 564 > Kangoo
14 août 2021 à 19:26
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 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025
14 août 2021 à 19:55
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
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 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 1 564
14 août 2021 à 20:17
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 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025
14 août 2021 à 20:26
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 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 1 564 > Kangoo
14 août 2021 à 20:31
quand tu modifies ton code, n'hésite pas à partager ce que tu fais, au lieu de partager uniquement le message d'erreur.
0
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
Bonjour, j'ai besoin d'aide pour résoudre un exercice êtes-vous dispo ?
0
yg_be Messages postés 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 1 564
15 août 2021 à 15:51
peux-tu créer une nouvelle discussion?
0