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 :

bouton/fonctions dans un liste [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 17
    Points
    17
    Par défaut bouton/fonctions dans un liste
    Bonjour, afin de faire un programme générant d'un questionnaire sur les identités remarquables, et où l'on peut choisir le nombre de question, et afficher, à l'aide d'un bouton, une à une les réponses à chacune des questions.
    Il faut donc pouvoir stocker dans une liste, les text variables ainsi que les champs de textes dans une liste, en effet, le nombre de question n’étant pas connu a l'avance, je les crées une par une a l'aide d'une boucle for, et les intègre dans des listes.
    Le problème est avec les boutons (un pour la vérification, et un pour la réponse. il faut pouvoir stocker ces boutons dans une liste (afin d'avoir un indice pour les distinguer) et surtout, la fonction qui y est associé afin de pouvoir afficher les erreurs / la réponse.
    Mon ancien prof d'ISN m'avait parlé d'une fonction lambda, qui, a ce que j'ai compris, permettrai de résoudre le problème, mais je ne vois pas trop comment..
    Merci d'avance à ceux qui pourront m'aider,
    Cordialement
    Ti

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Citation Envoyé par ti.du.du39 Voir le message
    Mon ancien prof d'ISN m'avait parlé d'une fonction lambda, qui, a ce que j'ai compris, permettrai de résoudre le problème, mais je ne vois pas trop comment..
    Pour autant que j'ai compris le problème (çà serait mieux de poster du code...), vous avez des explications détaillées dans un tuto associée à la FAQ.

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

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Ton exposé du problème est assez confus. Et en plus tu ne nous dis absolument rien de la librairie d'IHM utilisée (tkinter ? PyQt ? GTK ? ... ... ...).

    On ne résoud pas un souci en essayant maladroitement d'utiliser un outil qui "pourrait" justement être le bon. On commence par utiliser les outils, on se familiarise avec eux, on comprend comment ils fonctionnent puis enfin quand survient le souci là on utilise notre acquis pour le résoudre. Et dans cette optique, la fonction lambda n'est qu'un simple outil comme les autres, ni plus puissante, ni moins. Ou si on veut être plus exact, peut-être plus puissante dans un certain contexte mais qui le sera alors beaucoup moins qu'une autre dans un autre.

    Par exemple une fonction lambda est une fonction "minimaliste". Elle ne peut effectuer qu'un seul et unique traitement. Impossible donc de lui programmer une boucle, une alternative, etc. On l'utilise quand on veut juste un travail direct et immédiat.
    Exemple: carre=lambda x: x*x. Il faut juste comprendre que le "return" est implicite. Mais on aura le même résultat avec une fonction classique def carre(x): return x*x. Et dans les deux cas on l'utilise de la même manière for i in xrange(10): print("carre %d: %d" % (i, carre(i))).

    On peut effectivement stocker des lambdas dans des listes ou des tuples. Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    traitement=(
        lambda x: 1,
        lambda x: x,
        lambda x: x*x,
        lambda x: x*x*x,
        lambda x: x*x*x*x,
    )
     
    for (i, trt) in enumerate(traitement):
        print("5 puissance %d vaut %d" % (i, trt(5)))

    C'est en effet plus pratique d'utiliser directement la lambda. Mais on aurait pu faire sans. Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def p0(x): return 1
    def p1(x): return x
    def p2(x): return x*x
    def p3(x): return x*x*x
    def p4(x): return x*x*x*x
    traitement=(
        p0,
        p1,
        p2,
        p3,
        p4,
    )
     
    for (i, trt) in enumerate(traitement):
        print("5 puissance %d vaut %d" % (i, trt(5)))

    Donc je pense que c'est dans ce sens que ton prof t'a dit que la lambda pouvait résoudre le problème puisqu'effectivement si tu arrives à faire rentrer ton traitement de QCM dans une lambda, alors tu peux stocker ladite lambda dans une liste qui pourra stocker et le bouton, et la lambda associée au bouton...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    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
    from tkinter import *
    nbr_de_question = 10
     
    fen1=Tk()
    can1=Canvas(fen1,width=500,  height=500,bg='white')
    can1.pack()
    bout = []
    te = []
    for i in range(nbr_de_question):
        te.append("reponse type "+str(i))
     
    def fonction(a):
        texte=Label(text= te[a] )
        texte.place(x= 100 ,y= a * 40+55)
     
    for i in range(nbr_de_question):
        bout.append(Button(text='valider',command= fonction(i) ))
        bout[i].place(x= 10 ,y=40*i+50)
     
    fen1.mainloop()
    Voici en résume a peu près le problème auquel je suis confronté

    et voila comment je le contourne:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    from tkinter import *
    nbr_de_question = 4 # je le fixe, sans possibiliter de le changer
     
    fen1=Tk()
    can1=Canvas(fen1,width=500,  height=500,bg='white')
    can1.pack()
    bout = []
    te = []
    for i in range(nbr_de_question):
        te.append("reponse type "+str(i))
     
    def fonction(a):
        texte=Label(text= te[a] )
        texte.place(x= 100 ,y= a * 40+55)
     
     
    def fonction0():
        fonction(0)
    def fonction1():
        fonction(1)
    def fonction2():
        fonction(2)
    def fonction3():
        fonction(3)
     
    bout0 = Button(text='valider',command= fonction0 )
    bout0.place(x= 10 ,y=50)
    bout1 = Button(text='valider',command= fonction1 )
    bout1.place(x= 10 ,y=90)
    bout2 = Button(text='valider',command= fonction2 )
    bout2.place(x= 10 ,y=130)
    bout3 = Button(text='valider',command= fonction3 )
    bout3.place(x= 10 ,y=170)
     
    fen1.mainloop()
    le problème de cette solutions, c'est, qu'en plus de n’être pas très propre, elle ne permet pas à l'utilisateur de changer le nombre de question comme ça.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Citation Envoyé par ti.du.du39 Voir le message
    Voici en résume a peu près le problème auquel je suis confronté
    à la ligne 17, vous pourriez écrire command = lambda i=i: fonction(i) sinon la fonction est appelée immédiatement.

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    C'est exactement ce que je cherchais ! Merci à tous !

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ti.du.du39 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    te = []
    for i in range(nbr_de_question):
        te.append("reponse type "+str(i))
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    te=["reponse type "+str(i) for i in range(nbr_de_question)]

    Et comme à priori "te" n'est plus susceptible d'évoluer dans la suite du code... te=tuple("reponse type "+str(i) for i in range(nbr_de_question))...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Supprimer bouton 'Nouveau' dans une liste
    Par neo.96 dans le forum SharePoint
    Réponses: 6
    Dernier message: 15/07/2009, 13h40
  2. Stocker des fonctions dans une liste ou un dico
    Par Mistervanhalen dans le forum Général Python
    Réponses: 2
    Dernier message: 21/01/2009, 13h33
  3. Ajouter fonction dans une liste déroulante
    Par juzii dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/12/2008, 09h13
  4. Réponses: 10
    Dernier message: 08/12/2006, 02h18
  5. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54

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