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

Python Discussion :

Donner des arguments à une fonction [Python 2.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Points : 665
    Points
    665
    Billets dans le blog
    3
    Par défaut Donner des arguments à une fonction
    Bonjour, je suis actuellement en train de développer une application de jeux mathématique de multiplication destiné aux enfants. Cependant je suis tombé sur un problème...
    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
    def sauv(nbmul, difnb1, difnb2):
        nbmul = nbmul.get
        difnb1 = difnb1.get
        difnb2 = difnb2.get
        print(nbmul)
        print(difnb1)
        print(difnb2)
     
    def parametre():
        parametre = Tk()
        parametre.geometry("300x150+500+250")
        parametre.title("Parametre")
        nbmul_text = Label(parametre, text="Nombre de multiplications a effectuer :").pack()
        nbmul = StringVar()
        nbmul_input = Entry(parametre, textvariable=nbmul, width=3).pack()
        difnb1_text = Label(parametre, text="Multiplications allant de").pack()
        difnb1 = StringVar()
        difnb1_input = Entry(parametre, textvariable=difnb1, width=2).pack()
        difnb2_text = Label(parametre, text="a").pack()
        difnb2 = StringVar()
        dinfnb2_input = Entry(parametre, textvariable=difnb2, width=2).pack()
        ok = Button(parametre, text="Enregistrer", command=parametre.destroy).pack()
        sauv(nbmul, difnb1, difnb2)
    (Ce code est destiné à la fenêtre de paramètre du programme [Nombre de multiplications à effectuer / Multiplication allant de x à x] au cas où vous ne l'auriez pas remarqué. )
    La variable "nbmul" est le nombres de multiplications que le programme va effectuer durant la session d'entraînement.
    Les variables "difnb1" et "difnb2" sont les variables qui vont contenir les chiffres entre lesquels les multiplication vont se faire (je sais que je ne suis pas clair sur ce point là donc je vais vous donner un exemple ):
    Si difnb1 = 1 et que difnb2 = 10, les multiplications ne pourrons pas être au dessus de 1*10 (j'espère que j'ai été compris)

    Mon problème c'est qu'il faut que quand les paramètres sont effectuer par l'utilisateur, il faut qu'ils soient sauvegardés (d'où l’intérêt de la fonction "sauv").
    Ce qu'il y a c'est que quand j'essaye de lui passé des arguments voilà l'erreur que Python me met:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
        return self.func(*args)
    TypeError: sauv() takes exactly 3 arguments (0 given)
    Je ne sais pas pourquoi il me met cette erreur, j'ai cherché partout mais je n'ai rien trouvé...
    Merci d'avance!
    Cordialement,
    Herman Adrien.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Fastoche:

    Une fonction avec arguments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> def f(a, b): print('a', a, 'b', b)
    ...
    que je déclare comme callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> tk.Button(text='foo', command=f)
    <tkinter.Button object at 0x0000000002C9DA90>
    Lorsqu'on "clicke" sur le Button (on qu'on simule le click):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> _.invoke()
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\py_env\py34-64\lib\tkinter\__init__.py", line 1482, in __call__
        return self.func(*args)
    TypeError: f() missing 2 required positional arguments: 'a' and 'b'
    'None'
    ce qui reproduit le problème mentionné.

    La solution est "simple":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> tk.Button(text='foo', command=lambda: f(1, 2))
    <tkinter.Button object at 0x0000000002C9D668>
    >>> _.invoke()
    a 1 b 2
    'None'
    >>>
    Pour en savoir plus (et corriger le tas d'erreurs que comporte le code que vous montrez), il faudrait quand même passer un peu de temps à lire un tuto et à comprendre comment on programme avec tkinter. Le Swinnen, c'est pas si mal...
    Bon courage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Points : 665
    Points
    665
    Billets dans le blog
    3
    Par défaut
    Bonjour et merci de votre réponse.
    Pour coder avec Tkinter j'ai commencé il n'y a que 2 semaines et je n'ai que 14 ans, ce qui fais que certaines chose sont assez compliquée à comprendre pour moi.
    Avec votre précédent message, le programme marche et j'ai essayé de voir ce qui était enregistrer dans les variables nbmul, difnb1 et difnb2.
    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
    def sauv(nbmul, difnb1, difnb2):
        nbmul = nbmul.get
        difnb1 = difnb1.get
        difnb2 = difnb2.get
        print(nbmul)
        print(difnb1)
        print(difnb2)
     
    def parametre():
        parametre = Tk()
        parametre.geometry("300x175+500+250")
        parametre.title("Parametre")
        nbmul_text = Label(parametre, text="Nombre de multiplications a effectuer :").pack()
        nbmul = StringVar()
        nbmul_input = Entry(parametre, textvariable=nbmul, width=3).pack()
        difnb1_text = Label(parametre, text="Multiplications allant de").pack()
        difnb1 = StringVar()
        difnb1_input = Entry(parametre, textvariable=difnb1, width=2).pack()
        difnb2_text = Label(parametre, text="a").pack()
        difnb2 = StringVar()
        dinfnb2_input = Entry(parametre, textvariable=difnb2, width=2).pack()
        enregistrer = Button(parametre, text="Enregistrer les parametres", command=lambda: sauv(nbmul, difnb1, difnb2)).pack()
        ok = Button(parametre, text="OK", command=parametre.destroy).pack()
    Je ne sais pas si c'est normal mais Python m'indique ceci dans la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <bound method StringVar.get of <Tkinter.StringVar instance at 0x7f418e115ab8>>
    <bound method StringVar.get of <Tkinter.StringVar instance at 0x7f418e115bd8>>
    <bound method StringVar.get of <Tkinter.StringVar instance at 0x7f418e115cb0>>
    Qu'est-ce que cela signifie?
    Merci d'avance!
    Cordialement,
    Herman Adrien.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par BlackoOSX Voir le message
    Avec votre précédent message, le programme marche et j'ai essayé de voir ce qui était enregistrer dans les variables nbmul, difnb1 et difnb2.
    ....
    Je ne sais pas si c'est normal mais Python m'indique ceci dans la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <bound method StringVar.get of <Tkinter.StringVar instance at 0x7f418e115ab8>>
    <bound method StringVar.get of <Tkinter.StringVar instance at 0x7f418e115bd8>>
    <bound method StringVar.get of <Tkinter.StringVar instance at 0x7f418e115cb0>>
    Qu'est-ce que cela signifie?
    Un parmi les N trucs de bases que vous ignorez à cause de votre précipitation: pour appeler une fonction, il faut des parenthèses i.e. "nbmul.get" est une méthode/fonction alors que nbmul.get() appelle la fonction et retourne un résultat.

    Citation Envoyé par BlackoOSX Voir le message
    Pour coder avec Tkinter j'ai commencé il n'y a que 2 semaines et je n'ai que 14 ans, ce qui fais que certaines chose sont assez compliquée à comprendre pour moi.
    Quelque soit votre age, si nous avons pris le temps d'écrire des cours/tutos. pour vous permettre d'apprendre à programmer facilement avec Python (et des tas d'autres langages), c'est pour que vous preniez le temps de les lire et de faire les exercices proposés. Dans le cours du Swinnen, tkinter n'est pas le premier chapitre abordé car, il y a des tas de choses à apprendre avant et des tas d'exercices à potasser pour se faire la main, acquérir quelques réflexes, comprendre les messages d'erreurs, ...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Points : 665
    Points
    665
    Billets dans le blog
    3
    Par défaut
    Merci de vos réponses rapides!
    Cordialement,
    Herman Adrien.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/07/2006, 09h25
  2. Réponses: 13
    Dernier message: 07/05/2006, 11h54
  3. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17
  4. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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