Tutoriel Python : créer un quiz/questionnaire

Table des matières

Introduction

  1. Comment créer un quiz simple ?

1.1. Exemple  : Quiz traduction Espagnol- Français en utilisant un dictionnaire

1.2. Exemple : Quiz traduction Espagnol - Français en utilisant une classe

1.3. Exemple : Quiz mathématiques simple

  1. Comment créer un quiz interactif ?

2.1. Exemple : Quiz général

Conclusion

Introduction

De nos jours, les quizz sont devenus une méthode d’évaluation indispensable !

Python n’est pas un langage destiné qu’à l’analyse de données, le développement web ou le machine Learning ! Il permet également de programmer des jeux intéressants tels que le fameux Tic-Tac-Toe au blackjack qui est basé sur la programmation orientée objet.

 Dans ce tutoriel, vous allez apprendre à créer votre propre quizz avec Python. Un quizz en Python peut être implémenté de deux manières différentes. La première manière consiste à réaliser un  dictionnaire qui contient des clés et leurs valeurs correspondantes. D’autre part, la deuxième manière se base sur la programmation de classes. Nous allons voir tout cela en détail dans ce tutoriel !

À la fin de ce tutoriel, vous serez capables de créer des quiz basiques ainsi que des quizz  interactifs à l’aide du module  Tkinter.

Afin de bien suivre ce tutoriel, vous devez avoir quelques notions de base sur la programmation orientée objet, les types de données et sur le module Tkinter. Si ce n’est pas déjà fait, nous vous invitions à jeter un coup d’œil sur ces tutoriels afin de vous familiariser avec ces notions: les types de données , programmation tkinter .

1. Comment créer un quiz simple ?

Dans cette première partie du tutoriel, nous allons créer des quizs simples, ça veut dire sans aucune interface graphique afin de vous familiariser avec cette notion avant de passer à la deuxième partie qui concerne l’implémentation du quiz à l’aide du module Tkinter.

1.1. Exemple  : Quiz traduction Espagnol- Français en utilisant un dictionnaire

Ce premier quiz demande à l’utilisateur de traduire des mots de la langue espagnole à la langue française. Si vous faites une faute, le quiz est terminé et le programme vous retourne le nombre de réponses juste sur le nombre total des questions.

Nous allons expliquer en détail les différentes étapes du code.

Syntaxe :

# Simple quiz en utilisant les dictionnaires
def main():
questions={'Hacer ':'faire', 'comer':'manger', 'playa ':'plage', 'cuidad ':'ville', ' salir ':'sortir'}
print ("*** Début du Quiz ***\n")
nom = input (" Entrez votre nom: ").title()
print ()
print("\nBien joué {0}, vous avez repondu à {1} de {2} questions.".format(nom, quiz(questions), len(questions)))
def quiz(qs):
points = 0
for qu,an in qs.items():
if input(qu).lower() == an.lower():
points += 1
print("Juste.")
else:
print("Oups, la bonne réponse est \"{}\".".format(an))
return points
if __name__ == "__main__":
main()

On commence tout d’abord par créer la variable questionnaire qui est un dictionnaire sous forme de questions (clé) et réponses (valeur). Ensuite, on affiche le message ‘ début du quiz’, on demande au joueur de taper son nom puis on lance le quiz.

La fonction quiz (qs) qui prend en paramètre le dictionnaire qu’on avait initié au début compare si la réponse de la question dans le dictionnaire et celle entrée par l’utilisateur sont pareilles.

Résultat de l’exécution :

1.2. Exemple : Quiz traduction Espagnol - Français en utilisant une classe

Ce quiz est semblable au quiz précédent, la seule différence est que dans ce cas nous n’allons pas nous baser sur un dictionnaire de clés et valeurs mais plutôt sur une classe.

Syntaxe :

''' Quiz basé sur une classe'''
class Question:
def __init__(self, probleme, reponse):
self.probleme= probleme
self.reponse= reponse
question_pro = [
"Que veut dire 'Hacer' ?\n(a) 'Faire'\n(b)'Manger'",'\n'
"Que veut dire 'Comer' ?\n(a) 'Pain'\n(b)'manger'",'\n'
"Que veut dire 'Playa' ?\n (a) 'Plage'\n (b) 'Lune'", '\n'
"Que veut dire 'cuidad'?\n (a) 'forêt'\n (b) 'Ville'", '\n'
"Que veut dire 'salir' ?\n (a) 'Sortir'\n (b) 'dormir'", '\n'
]
nom = input("Entrer votre nom: ").title()
questions = [
Question(question_pro[0], "a"),
Question(question_pro[1], "b"),
Question(question_pro[2], "a"),
Question(question_pro[3], "a"),
Question (question_pro[4], "b")
def lancer_quiz(ques):
resultat = 0
for question in ques:
reponse = input (question.probleme)
if reponse == question.reponse:
resultat += 1
print ("\n{0}, vous avez répondu à {1} de {2} questions.".format (nom, resultat, len(questions)))
lancer_quiz(questions)

On définit notre classe Question qui a comme attribut une variable probleme , une variable reponse ainsi que  la variable question_pro qui contient les différentes questions du quiz.

La variable nom permet de stocker le nom de l’utilisateur qui joue à la partie du quizz. Questions est la variable de type objet de la classe Question qui stocke les questions et leurs réponses équivalentes.

Par la suite, on définit la fonction lancer_quiz(),qui, pour chaque question de la variable paramètre de la fonction, compare si la réponse insérée par l’utilisateur est similaire à celle fournit dans les réponses. Si oui, la variable score est incrémentée de 1. Finalement, le programme retourne un message qui spécifie le nombre de réponses justes qu’a eu un utilisateur sur le nombre total des questions du jeu.

Résultat de l’exécution :

1.3. Exemple : Quiz mathématiques simple

Dans cet exemple, nous souhaitons créer un quiz mathématique qui pose des questions à l’utilisateur afin de tester ses capacités à faire des opérations basiques comme l’addition, la soustraction, la multiplication ….

Explication du code :

La première fonction debut_quiz() sert à afficher le titre du quiz qui est « Quiz de Maths simple » . Ensuite, nous définissons la fonction menu()  elle sert à afficher le menu des opérations disponibles dans ce quiz . Ces opérations sont stockées dans une liste, la fonction print() va afficher chaque élément de cette liste de choix . L’utilisateur pourra choisir l’addition, la soustraction, la multiplication, la division ou bien de quitter le quiz comme dernière option.

separation() permet juste d’afficher une ligne de séparation . Elle nous sera utile dans les autres fonctions.

La fonction entree_utilisateur () permet à l’utilisateur de faire son choix d’opération. Nous avons précisé que nous avions 5 opérations . Il est donc évident que la variable entree_utilsateur doit être comprise entre 0 et 5 sinon elle ne sera pas valide ! Cette condition est exprimée par la boucle while qui informe l’utilisateur que son option n’est pas valide tant que son choix n’est pas entre 0 et 5 .

choix_utilisateur() permet à l’utilisateur de rentrer son choix d’opération, ensuite de taper le résultat de l’opération affichée. Ainsi, nous définissons la fonction verifier_solution() qui prend comme paramètre la solution insérée par l’utilisateur, la solution du quiz et la variable compte qui calcule le score de l’utilisateur . Cette étape est réalisée par la fonction if qui teste si les deux réponses sont égales. Si c’est le cas, on incrémente la variable compte de 1 .

La fonction option_menu() est celle où on définit comment vont fonctionner les différentes opérations du quiz. Elle est composée de 4 parties, car on a 4 opérations différentes (l’option quitter ne nécessite aucune implémentation). Si l’index est égal à 1, cela veut dire que nous avons affaire à une addition ! On implémente donc l’opération puis on passe aux autres options jusqu’à l’implémentation de toutes les opérations existantes dans le menu.

Puis, on définit la fonction montrer_résultat () qui affiche le nombre de réponses justes sur le nombre total de réponses ainsi que le pourcentage de réussite du joueur. Finalement, la fonction main () permet de lancer le programme du quiz.

 Syntaxe :

import random
def debut_quiz():
titre = "** Quiz de Maths simple **"
print ("*" * len(titre))
print (titre)
print ("*" * len(titre))
def menu():
liste_menu = ["1. Addition", "2. Soustraction", "3. Multiplication", "4. Division", "5. Quitter"]
print(liste_menu[0])
print(liste_menu[1])
print(liste_menu[2])
print(liste_menu[3])
print(liste_menu[4])
def separation():
print("-" * 24)
def entree_utilisateur():
entree_utilisateur = int(input("Entrer votre choix: "))
while entree_utilisateur > 5 or entree_utilisateur print("Option de menu invalide.")
entree_utilisateur = int(input("Essayer une autre fois: "))
else:
return entree_utilisateur
def solution_utilisateur(choix_probleme):
print("Entrer votre réponse")
print(choix_probleme, end="")
resultat = int(input(" = "))
return resultat
def verifier_solution(utilisateur_solution, solution_quiz, compte):
if utilisateur_solution == solution_quiz:
compte = compte + 1
print("Réponse Correcte.")
return compte
else:
print("Réponse incorrecte.")
return compte
def option_menu(indexe, compte):
numero_un = random.randrange(1, 21)
numero_deux = random.randrange(1, 21)
if indexe is 1:
probleme = str(numero_un) + " + " + str(numero_deux)
solution_quiz = numero_un + numero_deux
utilisateur_solution = solution_utilisateur(probleme)
compte = verifier_solution(utilisateur_solution, solution_quiz, compte)
return compte
elif indexe is 2:
probleme = str(numero_un) + " - " + str(numero_deux)
solution_quiz = numero_un - numero_deux
utilisateur_solution = solution_utilisateur(probleme)
compte = verifier_solution(utilisateur_solution, solution_quiz, compte)
return compte
elif indexe is 3:
probleme = str(numero_un) + " * " + str(numero_deux)
solution_quiz = numero_un * numero_deux
user_solution = solution_utilisateur(probleme)
compte = verifier_solution(utilisateur_solution, solution_quiz, compte)
return compte
else:
probleme = str(numero_un) + " // " + str(numero_deux)
solution = numero_un // numero_deux
utilisateur_solution = solution_utilisateur(probleme)
compte = verifier_solution(utilisateur_solution, solution_quiz, compte)
return count
def montrer_resultat(somme_total, correct):
if somme_total > 0:
resultat = correct / somme_total
pourcentage = round((resultat * 100), 2)
if somme_total == 0:
pourcentage = 0
print("Vous avez répondu à ", somme_total, "questions avec", correct, "correctes.")
print("Votre score est ", pourcentage, "%. Merci.", sep = "")
def main():
debut_quiz()
menu()
separation()
option = entree_utilisateur()
total = 0
correct = 0
while option != 5:
total = total + 1
correct = option_menu(option, correct)
option = entree_utilisateur()
print("Sortir du quiz.")
separation()
montrer_resultat(total, correct)
main()

Résultat de l’exécution :

On choisit par exemple d’effectuer une opération d’addition :

On insère ensuite la réponse et le résultat est ensuite affichée :

2. Comment créer un quiz interactif ?

Dans cette deuxième partie du tutoriel , nous allons créer un quiz interactif qui dispose d’une interface graphique à l’aide du module Tkinter .

2.1. Exemple : Quiz général

La première étape avant de coder votre programme est de créer un fichier .json qui va contenir vos questions et réponses. Voici ce que doit contenir votre  fichier data.json :

Syntaxe :

[
{
"1": "Quelle est la capitale du Maroc ?",
"2": "Laquelle des fonctions suivantes prend une entrée console en Python ?",
"3": " Laquelle des villes suivantes est la capitale économique du Maroc ?",
"4": "Lequel des éléments suivants doit exécuter un code Python ?",
"5": " La mosquée hassan 2 est situé dans ?",
"6": "la Méthode ajoute de la valeur à la liste à la ?",
"7": "Laquelle des villes suivantes n’est pas une ville côtière du Maroc ?",
"8": "Lequel des éléments suivants est exécuté dans le navigateur (côté client) ?",
"9": "Lequel des mots-clés suivants est utilisé pour créer une fonction dans Python ?",
"10": "Pour déclarer une variable globale en python, nous utilisons le mot-clé?"
},
{
"1": [
"Fes",
"Casablanca",
"Rabat",
"Safi"
],
"2": [
"get()",
"input()",
"gets()",
"scan()"
],
"3": [
"Rabat",
"fes",
"tanger",
"marrakech",
],
"4": [
"TURBO C",
"Py Interpreter",
"Notepad",
"IDE"
],
"5": [
"Fes",
"Agadir",
"Casablanca",
"Tanger"
],
"6": [
"custom location",
"end",
"center",
"beginning"
],
"7": [
"Ifrane",
"Oualidia",
"Rabat",
"Casablanca"
],
"8": [
"perl",
"css",
"python",
"java"
],
"9": [
"function",
"void",
"fun",
"def"
],
"10": [
"all",
"var",
"let",
"global"
]
}
]

Explication du code :

On commence par importer les questions/réponses et les convertir en deux listes questions et choix_reponse . On définit la liste des bonnes réponses sous le nom de reponses puis une liste vide reponse_utilisateur où nous allons stocker les réponses fournies par l’utilisateur.  La fonction generer() permet de générer des indexes aléatoires.

  • montrer_resultat() permet d’afficher à l’utilisateur le résultat qu’il a obtenu en fonction de son score .
  • calculer() calcule le résultat de l’utilisateur en testant l’égalité entre les réponses fournies par ce dernier et les réponses qu’on a dans la liste reponses .
  • selected() permet d’enregistrer les reponses sélectionnées par l’utilisateur et de les stocker dans des variables .
  • commencer_quiz() est la fonction qui déclenche le programme en initiant les différents radioboutons de réponses .

Finalement, on initie l’interafce graphique à l’aide du module tkinter puis on configure les différents paramètres graphiques de l’application avant de la lancer.

Remarque : N’oubliez pas de changer les images ce sont des variables locales sur votre ordinateur !

Syntaxe :

import json
import tkinter
from tkinter import *
import random
# questions = [
# "Quelle est la capitale du maroc ",
# "Laquelle des fonctions suivantes prend une entrée console en Python ? ?",
# "Laquelle des villes suivantes est la capitale économique du Maroc ?",
# "Lequel des éléments suivants doit exécuter un code Python?",
# "La mosquée hassan 2 est situé dans ?",
# " La méthode append ajoute une valeur une liste liste au?",
# "Laquelle des villes suivantes n’est pas une ville côtière du Maroc ?",
# "Lequel des éléments suivants est exécuté dans le navigateur (côté client)?",
# "Lequel des mots-clés suivants est utilisé pour créer une fonction dans Python?",
# "Pour déclarer une variable globale en python, nous utilisons le mot-clé ?",
# ]
# answers_choice = [
# ["Fes","Casablanca","Rabat","Safi",],
# ["get()","input()","gets()","scan()",],
# ["Rabat","fes","tanger","marrakech",],
# ["TURBO C","Py Interpreter","Notepad","IDE",],
# ["Fes","Agadir","Casablanca","Tanger",],
# ["custom location","end","center","beginning",],
# ["Ifrane","Oualidia","Rabat","Casablanca",],
# ["perl","css","python","java",],
# ["function","void","fun","def",],
# ["all","var","let","global",],
# ]
#charger les questions et les réponses du fichier data.json que vous avez créée avant
with open('./data.json', encoding="utf8") as f:
donnees = json.load(f)
# convertit le dictionnaire en listes de questions et de choix_reponse
questions = [valeur for valeur in donnees[0].values()]
choix_reponse = [valeur for valeur in donnees[1].values()]
reponses = [1,1,1,1,3,1,0,1,3,3]
reponse_utilisateur = []
indexes = []
def generer():
global indexes
while(len(indexes) x = random.randint(0,9)
if x in indexes:
continue
else:
indexes.append(x)
def montrer_resultat(score):
lblQuestion.destroy()
reponse_1.destroy()
reponse_2.destroy()
reponse_3.destroy()
reponse_4.destroy()
label_image = Label(
root,
background = "#ffffff",
border = 0,
)
label_image.pack(pady=(50,30))
label_resultat_text = Label(
root,
font = ("Consolas",20),
background = "#ffffff",
)
label_resultat_text.pack()
if score >= 20:
image = PhotoImage(file="great.png")
label_image.configure(image=image)
label_image.image = image
label_resultat_text.configure(text="Vous êtes excellent !!")
elif (score >= 10 and score image = PhotoImage(file="ok.png")
label_image.configure(image=image)
label_image.image = image
label_resultat_text.configure(text="vous pouvez faire mieux !!")
else:
image = PhotoImage(file="bad.png")
label_image.configure(image=image)
label_image.image = image
label_resultat_text.configure(text="vous devez faire plus d'effort !!")
def calculer():
global indexes,reponse_utilisateur,reponses
x = 0
score = 0
for i in indexes:
if reponse_utilisateur[x] == reponses[i]:
score = score + 5
x += 1
print(score)
montrer_resultat(score)
ques = 1
def selected():
global radiovar,reponse_utilisateur
global lblQuestion,reponse_1,reponse_2,reponse_3,reponse_4
global ques
x = radiovar.get()
reponse_utilisateur.append(x)
radiovar.set(-1)
if ques lblQuestion.config(text= questions[indexes[ques]])
reponse_1['text'] = choix_reponse[indexes[ques]][0]
reponse_2['text'] = choix_reponse[indexes[ques]][1]
reponse_3['text'] = choix_reponse[indexes[ques]][2]
reponse_4['text'] = choix_reponse[indexes[ques]][3]
ques += 1
else:
# print(indexes)
# print(user_answer)
calculer()
commencer_quiz()
def commencer_quiz():
global lblQuestion,reponse_1,reponse_2,reponse_3,reponse_4
lblQuestion = Label(
root,
text = questions[indexes[0]],
font = ("Consolas", 16),
width = 500,
justify = "center",
wraplength = 400,
background = "#ffffff",
)
lblQuestion.pack(pady=(100,30))
global radiovar
radiovar = IntVar()
radiovar.set(-1)
reponse_1 = Radiobutton(
root,
text = choix_reponse[indexes[0]][0],
font = ("Times", 12),
value = 0,
variable = radiovar,
command = selected,
background = "#ffffff",
)
reponse_1.pack(pady=5)
reponse_2 = Radiobutton(
root,
text = choix_reponse[indexes[0]][1],
font = ("Times", 12),
value = 1,
variable = radiovar,
command = selected,
background = "#ffffff",
)
reponse_2.pack(pady=5)
reponse_3 = Radiobutton(
root,
text = choix_reponse[indexes[0]][2],
font = ("Times", 12),
value = 2,
variable = radiovar,
command = selected,
background = "#ffffff",
)
reponse_3.pack(pady=5)
reponse_4 = Radiobutton(
root,
text = choix_reponse[indexes[0]][3],
font = ("Times", 12),
value = 3,
variable = radiovar,
command = selected,
background = "#ffffff",
)
reponse_4.pack(pady=5)
def start_est_presse():
label_image.destroy()
label_text.destroy()
lblInstruction.destroy()
lblRules.destroy()
btnStart.destroy()
generer()
commencer_quiz()
root = tkinter.Tk()
root.title("Quiz")
root.geometry("700x600")
root.config(background="#ffffff")
root.resizable(0,0)
image_1 = PhotoImage(file="j.png")
label_image = Label(
root,
image = image_1,
background = "#ffffff",
)
label_image.pack(pady=(40,0))
label_text = Label(
root,
text = "Quiz",
font = ("Comic sans MS",24,"bold"),
background = "#ffffff",
)
label_text.pack(pady=(0,50))
image_2 = PhotoImage(file="images.png")
btnStart = Button(
root,
image = image_2,
relief = FLAT,
border = 0,
command = start_est_presse,
)
btnStart.pack()
lblInstruction = Label(
root,
text = "Lisez les règles et \nCliquez sur Démarrer une fois que vous êtes prêt",
background = "#ffffff",
font = ("Consolas",14),
justify = "center",
)
lblInstruction.pack(pady=(10,100))
lblRules = Label(
root,
text = "Ce quiz contient 10 questions \nVous aurez 20 secondes pour résoudre une question \nUne fois que vous aurez sélectionné un bouton radio qui sera un choix final \n donc penser avant de sélectionner",
width = 100,
font = ("Times",14),
background = "#000000",
foreground = "#FACA2F",
)
lblRules.pack()
root.mainloop()

Résultat de l’exécution :

Afin d’exécuter ce programme, vous devez le faire sur votre console anaconda prompt. Il suffit de vous positionner dans le répertoire de l’application et taper la commande suivante :

ipython nom_de_votre_fichier.py .

À la fin du quiz, vous obtenez le résultat suivant (il  change selon votre score) :

Conclusion

Nous sommes arrivés à la fin de ce tutoriel, maintenant vous savez comment créer un quiz en Python (simple et avec interface graphique). Les quiz sont la première étape dans la programmation d’applications en Python. C’est pour cela que nous vous conseillons de bien appliquer les exemples de ce tutoriel et essayer d’implémenter vos propres codes afin d’avoir une solide base pour les tutoriels à venir !

Article publié le 24 Novembre 2020par Mouna HAMIM