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

Tkinter Python Discussion :

Préselection abusive de boutons radios


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut Préselection abusive de boutons radios
    Bonjour,

    J'ai beaucoup cherché de mon côté et aussi beaucoup sur Internet ( Merci à tous ceux qui aident ).

    Pour un qcm j'affiche des questions une à une à l'aide de boutons radio.
    Mais si je réponds juste au premier, lors de l'affichage du second qcm c'est la bonne case qui est présélectionnée.

    Comment éviter cela ? Voici un exemple du problème

    Merci à vous
    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
    36
    37
    38
    39
    40
    41
    42
    43
    from tkinter import *
    from tkinter import messagebox
     
    # ces lignes de code sont un extrait volontairement simplifié d'un programme mieux agencé et qui fonctionne bien avec beaucoup de questions qcm à la suite
    # le seul inconvénient est que si on a répondu bon à une question, c'est automatiquement cette réponse qui est présélectionnée à la question suivante
    # si on a répondu faux, c'est la réponse faux qui est présélectionnée.
    # comment ne préselectionner aucune case ?
     
     
     
     
    def question(enonce,reponse1,reponse2):
        global reponse
        enonce=Label(fen,text=enonce)
        enonce.pack()
     
        bouton=Radiobutton(fen, text=reponse1, variable=retour, value= 1,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
        bouton=Radiobutton(fen, text=reponse2, variable=retour, value= 2,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
     
     
    def correction(): # on corrige la question 1 et on pose la question 2
     
        reponse=retour.get()
        if reponse == 1 :
            messagebox.showinfo("correction","bonne réponse")
        else:
            messagebox.showinfo("correction","mauvaise réponse")
     
        question("Combien font 7 + 2 ?","9","11")   # je pose la question à cet endroit pour plus de facilité
                                                    # dans un programme plus complet c'est ailleurs qu'elle est posée
                                                    # de plus pour aller à l'essentiel de ma question volontairement il n'y a pas de fin à ce programme
    ########
    #programme principal
    #######
    fen=Tk()
    fen.geometry("400x300")
    n=0
    reponse="1"
    retour=IntVar()
    question("combien font 2+2 ?","4","5")
     
     
    fen.mainloop()
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Peut-être en appliquant un deselect() sur chaque radio bouton à chaque nouvelle question ?

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Merci de votre réponse rapide.

    Je ne connaissais pas cette notion de deselect.
    Je vais creuser cela.

    En fait je me rends compte que c'est toujours le même bouton radio qui intervient. Si on a deux questions d'affichées et qu'on clique sur la première question le bouton radio réagit quand même.

    Comment faire pour que chaque bouton radio ait sa propre "personnalité" ?

    Est-ce envisageable ?

  4. #4
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Ce que tu demande est le principe des objets. Quand tu appelles "Radiobutton", tu créé un objet de type bouton radio. Chaque objet à ses propres caractéristiques.

    D'apres ce que je comprend, ton code n'est pas complet, tu l'a simplifié pour le poster. On ne peux donc se baser sur ton code posté pour juger, mais d'après ta demande, je pense que tu utilise toujours les meme radiobutton, alors qu'a chaque fois, il faudrais ou les reinitialiser, ou les supprimer avant de les recréer.

    On pourra plus t'aider avec ton code complet

  5. #5
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Merci beaucoup !

    Effectivement je ne sais pas comment détruire ou réinitialiser des boutons radions ( peut-être créer des classes mais je débute ... à mon âge..; ).

    Voici mon code complet dans lequel j'ai fait en sorte que la bonne réponse ne soit pas suggérée en premier

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    from tkinter import *
    from tkinter import messagebox
    from random import randint
    from random import shuffle
     
    # qs est une liste de dictionnaires ( chacun des ces dictionnaires a trois champs )
     
    qs = [
           {'question': "Quelle est la couleur du cheval blanc d'Henri IV ?",
            'correcte': "blanc",
            'incorrecte': "gris"},
     
           {'question': "2 + 2 = ?",
            'correcte': "4",
            'incorrecte': "42"},
     
          {'question': "Quel est l'antonyme de synonyme ?",
            'correcte': "antonyme",
            'incorrecte': "homonyme"},
     
          {'question': "Qui a écrit 'La ballade des Pendus' ?",
            'correcte': "François Villon",
            'incorrecte': "François Rabelais"},
     
           {'question': "De quel fleuve l'Erne est-elle un affluent  ?",
            'correcte': "La Loire",
            'incorrecte': "La Seine"}]
     
    def question(q,bouton1, bouton2):
     
        global a
        a=randint(0,1)
     
        enonce=Label(root,text="",font ="Arial 14")
        enonce.configure(text="Voici votre question : " + qs[q]["question"])
        enonce.pack()
        if a==0:
            bouton1=Radiobutton(root, text=qs[q]["correcte"], variable=retour, value=1,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
            bouton2=Radiobutton(root, text=qs[q]["incorrecte"], variable=retour, value=2,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
        else:
            bouton2=Radiobutton(root, text=qs[q]["incorrecte"], variable=retour, value=2,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
            bouton1=Radiobutton(root, text=qs[q]["correcte"], variable=retour, value=1,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
     
     
    def correction():
     
     
        global score
        print(retour.get())
        reponse = retour.get()
        print("correction de la"+ str(reponse),a)
     
        if reponse == 1:
            print("Bonne reponse")
            score+=1
        else:
            print("Mauvaise réponse")
     
        global n
        n+=1
     
        if n<len(t):
            i=t[n]
            question(i,"c","d")
        else:
            truc=Label(root,text="Fin du questionnaire. Votre taux de réussite est de : {} %".format (100*score//len(qs)),font ="Arial 14")
            truc.pack()
     
     
    #######################
    # debut du programme principal
    ######################
     
    root = Tk()
    root.geometry("800x500")
     
    score=0
    a=0 # cette variable est globale elle pourra être consultée dans toute fonction mais ne pourra pas être modifiée
        # sauf si dans certaines fonctions qui désirent la modifier on met global a
    retour=IntVar()   # variable spécifique au module tkinter sera utilisée pour le boutonradio
    valider = 0
    n=0
    t=list(range(0,len(qs)))    # on touille la liste des questions
    shuffle(t)
    question(t[0],"a","b")
     
    root.mainloop()

  6. #6
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Alors, quelques petites remarques:

    Prenez l'habitude de toujours definir le shebang et l'encodage sur les deux première ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #! /usr/bin/env PYTHON
    # -*- coding: utf-8 -*-
    La première ligne sert à indiquer ou se trouve l'interpreteur python (utile sous Linux principalement), la seconde à préciser le type d'encodage.

    Vous déclarez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from tkinter import *
    from tkinter import messagebox
    from random import randint
    from random import shuffle
    La bonne syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from tkinter import *
    from random import randint, shuffle
    A la première ligne vous importer tout ce que contient Tkinter dans votre code, votre seconde ligne est donc inutile, cela fait doublon. Ensuite, pour "random", la façon que je vous ai communiqué est la plus rependu (dans ce que j'ai pu voir). Votre façon d'écrire est néanmoins correcte.

    A l'execution, on rencontre effectivement bien le soucis dont vous parlez, et on voit alors que modifier un bouton radio impacte les autres boutons radios.

    Je regarde un peu le code et reviens sur ce post

  7. #7
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Alors apres m'etre un peu plongé dans la doc TKINTER (je suis plutot GTK), le fonctionnement des radiobuttons s'avere etre similaire. Je m'explique: Les radiobuttons doivent etre regroupés par groupe ("variable). Au sein de chaque groupe, chaque radiobutton doit etre identifié par un identifiant propre (value).

    J'ai donc legerement modifié votre code (ci-dessous), en ne corrigeant que le bug cité dans ce post. Enleve la première ligne si tu es sous windows.

    Comme tu vois, j'ai juste créé une liste nommée group pour variable lors de la creation des radiobuttons.

    Dans ton ancien code, tous les radiobuttons appartenaient au même groupe. De plus, ils fonctionnaient tous uniquement avec deux identifiants. De fait à chaque fois que tu en modifiait un, cela impactait tous les autres.

    J'espère etre clair, sinon n'hesite pas. Si cela est OK pour toi, n'oublie pas de passer le post à RESOLU.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #! /usr/bin/env PYTHON
    # -*- coding: utf-8 -*-
     
     
    from Tkinter import *
    from random import randint, shuffle
     
    # qs est une liste de dictionnaires ( chacun des ces dictionnaires a trois champs )
     
    qs = [
    		{'question': "Quelle est la couleur du cheval blanc d'Henri IV ?",
    		'correcte': "blanc",
    		'incorrecte': "gris"},
     
    		{'question': "2 + 2 = ?",
            'correcte': "4",
            'incorrecte': "42"},
     
    		{'question': "Quel est l'antonyme de synonyme ?",
    		'correcte': "antonyme",
    		'incorrecte': "homonyme"},
     
    		{'question': "Qui a écrit 'La ballade des Pendus' ?",
    		'correcte': "François Villon",
    		'incorrecte': "François Rabelais"},
     
    		{'question': "De quel fleuve l'Erne est-elle un affluent  ?",
    		'correcte': "La Loire",
    		'incorrecte': "La Seine"}
    	]
     
    def question(q,bouton1, bouton2):
     
    	global a
    	global group
    	a=randint(0,1)
     
    	enonce=Label(root,text="",font ="Arial 14")
    	enonce.configure(text="Voici votre question : " + qs[q]["question"])
    	enonce.pack()
    	if a==0:
    		bouton1=Radiobutton(root, text=qs[q]["correcte"], variable=group[q], value=1,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
    		bouton2=Radiobutton(root, text=qs[q]["incorrecte"], variable=group[q], value=2,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
    	else:
    		bouton2=Radiobutton(root, text=qs[q]["incorrecte"], variable=group[q], value=2,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
    		bouton1=Radiobutton(root, text=qs[q]["correcte"], variable=group[q], value=1,font  ="Arial 14",indicatoron=1,command=correction).pack(anchor=CENTER)
     
     
    def correction():
    	global score
    	print(retour.get())
    	reponse = retour.get()
    	print("correction de la"+ str(reponse),a)
     
    	if reponse == 1:
    		print("Bonne reponse")
    		score+=1
    	else:
    		print("Mauvaise réponse")
     
    	global n
    	n+=1
     
    	if n<len(t):
    		i=t[n]
    		question(i,"c","d")
    	else:
    		truc=Label(root,text="Fin du questionnaire. Votre taux de réussite est de : {} %".format (100*score//len(qs)),font ="Arial 14")
    		truc.pack()
     
     
    #######################
    # debut du programme principal
    ######################
     
    if __name__ == "__main__":
    	root = Tk()
    	root.geometry("800x500")
     
    	score=0
    	a=0 
    	retour=IntVar()
    	valider = 0
    	n=0
    	group = []
    	t=list(range(0,len(qs)))
    	shuffle(t)
     
    	for i in range(5):
    		group.append(IntVar())
     
    	question(t[0],"a","b")
     
    	root.mainloop()

  8. #8
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Grand merci pour ces remarques judicieuses et la solution apportée à mon problème. Je comprends bien maintenant comment donner une identité propre à chaque groupe de boutons radio. Ensuite j'ai pu actualiser mon programme pour que le calcul du score soit opérationnel

    Quelques remarques pour ceux qui voudraient s'inspirer de ce code.

    Avec Python 3 il faut marquer from tkinter import *
    Dans mon code initial la ligne from tkinter import messagebox était inutile puisque je n'utilisais pas messagebox.
    toutefois si j'avais utilisé messagebox cette ligne était indispensable car même si on met import* messagebox n'est pas importé.

    Quelques modifications pour que le score soit opérationnel
    à la ligne 50 mettre global score,q
    la ligne 51 est inutile ( je l'avais mise pour debugger )
    ligne 52 reponse=group[q].get()
    après la ligne 65 ajouter q=i
    et ligne 93 mis q=t[0].

    Encore merci.
    Débutant sur ce forum, comment marquer cette discussion comme résolue ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Par défaut
    En dessous du dernier message, à hauteur de "ajouter une réponse", mais tout à droite, tu as un bouton "résolu" quand tu es le créateur du fil de discution. Il te suffit de cliquer dessus

  10. #10
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut
    Merci pour l'info.

    Je mets à exécution

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

Discussions similaires

  1. recupérer la valeur d'un bouton radio
    Par ericmart dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/05/2008, 15h42
  2. Boutons Radios qui charge une page php différente
    Par nebule dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/11/2004, 15h25
  3. apparition d'un chanp text au click d'un bouton radio
    Par Flobel dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 09/11/2004, 09h34
  4. [CR]liste de boutons radio
    Par inesfonfon dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 16/09/2004, 09h04
  5. Problème de boutons radio
    Par BRAUKRIS dans le forum Composants
    Réponses: 3
    Dernier message: 03/06/2004, 02h41

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