QCM

Vidéo
html 5 video by EasyHtml5Video.com v3.9.1

Objectif

Faire un QCM

Les données sont stockées dans le fichier notions.csv il faut un dossier qui contient les images . Un fichier qui contient les données.

Liens de téléchargement des images et du code

Télécharger les fichiers Code Images .

Utilisation du module CSV

Note

CSV Comma Separated Values. Ce module permet de lire un fichier de tableur avec csv.reader ou de l’écrire avec csv.writer. On utilisera que la classe csv.reader . Car pour créer des fichiers CSV, les tableurs sont plus efficaces. Ces fichiers peuvent être fabriqués par des tableurs il suffit de choisir la bonne option « en enregistrant sous » ils produisent des lignes de données séparées soit par des virgules, des points virgules soit par des doubles quottes. Ils sont utilisés pour stocker des données.

Et pour les projets de l’enseignement facultatif :

Informatique et Création Numérique :

pour étudier l’évolution d’un territoire, en économie, étudier la répartition d’un indicateur économique. L’utilisation de ces fichiers permet de créer des cartes, des figures et de traiter toutes sortes de données. Les données sont extraites en deux sortes de format : les listes ou les dictionnaires. Les exemples suivants illustrent la différence de ces types de données.

Fonctions des fichiers csv

Ouverture d’un fichier : fichier=open(f.csv,"r") Fermeture d’un fichier : fichier.close()

Lecture d’un fichier et données extraites en format liste

    liste_csv=csv.reader(fichier,delimiter=";"`)
liste_csv=csv.reader(fichier,delimiter=",")
for ligne in liste_csv :
print(ligne)

ligne est une liste.

delimiter

indique le symbole de séparation des données, si l’on doit utiliser des nombres décimaux(float) il faut utiliser la commande

delimiter=";"

pour éviter de tout mélange dans les données.

Fichier CSV

Voici un fichier CSV: notions.csv

id;titre;q1;q2;q3;question;solution
0;TITRE;Réponse 1;Réponse 2;Réponse 3;QUESTION;1
1;Goethe;seulement au jour le jour.;sans savoir ce qu'il fait.;sans connaître le passé.;Qui ne sait pas tirer les leçons de 3000 ans vit;1
2;Le chapeau haut de forme;est de poser des questions.;est d'observer.;est de s'étonner.;La seule qualité requise pour devenir un bon philosophe;3
3;Les mythes;du passé et de l'avenir.;du bien et du mal.;de l'homme et de la nature.;Un fragile équilibre entre les forces ;2
4;Les philosophes de la nature;du néant.;de la nature.;de la pensée.;Rien ne naît;1
5;Socrate;réfléchir.;qu'elle ne sait pas.;innover.;La plus intelligente est celle qui sait ;2
6;Le destin;vient de l'astrologie.;determine le destin.;échappe à toute interprétation.;Le devin essaie d'interpréter quelque chose qui par nature;3
7;Hegel;doué de vie;doué d'espoir.;doué d'avenir.;Ce qui est raisonnable, c'est ce qui est;1
8;Marx;l'histoire.;l'Europe;l'être humain.;Un spectre hante;2
9;Le jardin d'Eden;de la pensée.;du cerveau.;du néant.;Il a bien fallu qu'a un moment donné quelque chose surgisse ;3
10;Surréalisme;surnaturel.;réel.;plus que réel.;Le surréalisme tient son nom du fait qu'il aime le :;3
11;Renaissance;un renouveau spirituel.;une doctrine politique.;un retour à l'antiquité.;La renaissance est :;3
12;Impressionnisme;une impression.;un tableau.;un lieu.;L'impressionnisme doit son nom à :;2
13;Peinture;rapide et simple.;longue et sinueuse.;impossible.;L'évolution vers la peinture non-figurative a été :;2
14;Symboles;les objets et les couleurs;les personnages et les formes.;les deux.;Les symboles en peinture portent sur :;3
15;L'art;réservé aux artistes.;ouvert à tous.;cela dépend.;L'art est un domaine :;2
16;Expression;aux artistes de la fin du XIX siècle.;aux artistes modernes sous Hitler.;aux années soixante à New York.;"L'expression "" art dégénéré"" fait référence :";2
17;Préhistoire;de pierre.;de fer.;de bronze.;L'art préhistorique apparaît à l'âge :;1
18;Conceptuel;privilégie l'idée sur la forme.;doit pouvoir être expliqué.;renonce à être compris.;L'art est  conceptuel lorsqu'il :;1
19;Roman Gothique;liés.;sans rapport.;plus ou moins liés.;Dans l'art gothique et l'art roman , innovation technique et renouveau artistique sont-ils :;1

Structure de dictionnaire

Avec le même fichier CVS, on obtient deux types de données : les listes ou un dictionnaire.

Le choix de du type de données dépend de l’utilisation que l’on veut faire de ces données.

Cet exemple est un fichier qui ne contient que des données simples, c’est à dire chaque colonne ne contient qu’une donnée. On peut utiliser les deux types : liste ou dictionnaire.

Progression

Pour faire le QCM:

La progression
1 - Les images
2 - La fenêtre d’accueil
3 - Une fenêtre pour le QCM
4 - La dernière question
5 - Le résultat

.

1 - Les images

Les données sont stockées dans le fichier notions.csv il faut un dossier qui contient les images . Un fichier qui contient les données.

_images/c004.PNG _images/c005.PNG

.

2 - La fenêtre d’accueil

On utilise un Checkbutton

_images/q001.PNG

.

3 - Une fenêtre pour le QCM

On utilise des images pour donner des indications.

_images/q002.PNG

.

4 - La dernière question

On change la commande du bouton

_images/q003.PNG

.

5 - Le résultat

On utilise la fonction qui nettoie la fenêtre.

_images/q004.PNG

Le code en Python

Note

On utilise plusieurs widgets.

Programme principal
#0804 dessins csv.py import csv from tkinter import* from fenetre import* from image import* def stocke_csv(lid,ltitre,lq1,lq2,lq3,lquestion,lsolution): """Ouvre le fichier csv et dessine dans le canevas les figures""" ft='verdana 12 bold' with open("notions.csv") as fichier_cvs: lecture=csv.DictReader(fichier_cvs,delimiter=";") #lid,ltitre,lq1,lq2,lq3,lquestion,lsolution=[],[],[],[],[],[],[] for ligne in lecture: lid.append(ligne["id"]) ltitre.append(ligne["titre"]) lq1.append(ligne["q1"]) lq2.append(ligne["q2"]) lq3.append(ligne["q3"]) lquestion.append(ligne["question"]) lsolution.append(ligne["solution"]) fichier_cvs.close() return lid,ltitre,lq1,lq2,lq3,lquestion,lsolution def longueur_phrase(liste): k=0 tk=0 for i in range(len(liste)): tk=len(liste[i]) if tk>=k:k=tk return k def change_question(fenetre,can,commande,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,lsolution,photo,largeur,liste_widgets): global memoire,kquestion if memoire[0]==1: can.itemconfig(commande,text='Valider') if memoire[0]==len(lquestion): can.itemconfig(commande,text='Résultat') if memoire[1]<len(lquestion): affiche_question(fenetre,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,lsolution,photo,largeur) if memoire[0]==len(lquestion): nettoie_fenetre(fenetre,can,liste_widgets) affiche_resultat(fenetre,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,lsolution,photo,largeur) def affiche_resultat(fenetre,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,lsolution,photo,largeur): global memoire,kquestion B2h=Label(fenetre,text=int(2.5*kquestion/5)*'_',font='verdana 18 bold',fg='red',bg='khaki') liste_widgets.append(B2h) B2h.grid(row=0,column=0,columnspan=10,sticky=W) B2=Label(fenetre,text='QCM Philosophie et culture générale',font='verdana 25 bold',fg='red',bg='khaki') liste_widgets.append(B2) B2.grid(row=1,column=0,columnspan=10,sticky=W) B2b=Label(fenetre,text=int(2.5*kquestion/5)*'_',font='verdana 18 bold',fg='red',bg='khaki') liste_widgets.append(B2b) B2b.grid(row=2,column=0,columnspan=6,sticky=W) B3=Label(fenetre,text='SCORE = '+str(memoire[2])+' / 20',font='verdana 12 bold',fg='blue',bg='khaki') liste_widgets.append(B3) B3.grid(row=3,column=0,columnspan=10,sticky=W) can.configure(height=memoire[2]*16,bg='blue') def affiche_question(fenetre,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,lsolution,photo,largeur): global memoire,kquestion numero=memoire[0] memoire[1]=memoire[0] Q1.config(text=lq1[numero]) Q2.config(text=lq2[numero]) Q3.config(text=lq3[numero]) B2.config(text=ltitre[numero]) B3.config(text=lquestion[numero]) for i in range(3): R=L_R[i] R.deselect() B.config(image=photo[numero]) #notation(question,numero,memoire,lq1,lq2,lq3,lsolution) memoire[0]=memoire[1]+1 def notation(numero,question,lq1,lq2,lq3,lsolution,item1): global memoire,kquestion for i in range(3): R=L_R[i] R.deselect() R=L_R[question] R.select() if question+1==int(lsolution[numero]): memoire[2]=memoire[2]+1 can.itemconfigure(item1,text=str(memoire[2])) #---------------------------------------# largeur,hauteur=800,700 fenetre=Tk() taille,icone=str(largeur)+"x"+str(hauteur),"icone.ico" titre="QCM CSV" numero=0 memoire=[1,0,0,0,1,2] v=IntVar() ft18='verdana 18 bold' ft12='verdana 12 bold' liste_widgets=[] lid,ltitre,lq1,lq2,lq3,lquestion,lsolution=[],[],[],[],[],[],[] creerfenetre(fenetre,titre,icone,taille) fenetre.configure(bg='khaki') lid,ltitre,lq1,lq2,lq3,lquestion,lsolution=stocke_csv(lid,ltitre,lq1,lq2,lq3,lquestion,lsolution) ktitre=longueur_phrase(ltitre) kquestion=longueur_phrase(lquestion) photo=liste_image(20) can=Canvas(fenetre,width=int(5*largeur/10),height=int(hauteur/10),bg='gold',borderwidth=0) can.grid(row=10,column=0,columnspan=3) commande=can.create_text(int(2*largeur/10),int(hauteur/20),text='Commencer',font='verdana 16 bold',fill='green',tag='UN') can.tag_bind("UN","<Button-1>",lambda utile :change_question(fenetre,can,commande,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,\ lsolution,photo,largeur,liste_widgets)) item1=can.create_text(int(4*largeur/10),int(hauteur/20),text=str(memoire[2])) B2h=Label(fenetre,text=int(2.5*kquestion/5)*'_',font='verdana 18 bold',fg='red',bg='khaki') liste_widgets.append(B2h) B2h.grid(row=0,column=0,columnspan=10,sticky=W) B2=Label(fenetre,text='QCM Philosophie et culture générale',font='verdana 25 bold',fg='red',bg='khaki') liste_widgets.append(B2) B2.grid(row=1,column=0,columnspan=10,sticky=W) B2b=Label(fenetre,text=int(2.5*kquestion/5)*'_',font='verdana 18 bold',fg='red',bg='khaki') liste_widgets.append(B2b) B2b.grid(row=2,column=0,columnspan=6,sticky=W) B=Label(fenetre,image=photo[0],bg='khaki') liste_widgets.append(B) B.grid(row=6,column=3,rowspan=3,columnspan=3,sticky='nesw') B3=Label(fenetre,text='La question ou la phrase à compléter est ici!',font='verdana 12 bold',fg='blue',bg='khaki') liste_widgets.append(B3) B3.grid(row=3,column=0,columnspan=10,sticky=W) B3m=Label(fenetre,text=int(2.5*kquestion/5)*'_',font='verdana 18 bold',fg='blue',bg='khaki') liste_widgets.append(B3m) B3m.grid(row=4,column=0,columnspan=10,sticky=W) Q1=Checkbutton(fenetre,text=lq1[numero],fg='blue',font=ft12,bg='khaki',command= lambda :notation(numero,0,lq1,lq2,lq3,lsolution,item1)) liste_widgets.append(Q1) Q1.grid(row=6,column=1,sticky=W,columnspan=3) Q2=Checkbutton(fenetre,text=lq2[numero],fg='blue',font=ft12,bg='khaki',command= lambda :notation(numero,1,lq1,lq2,lq3,lsolution,item1)) liste_widgets.append(Q2) Q2.grid(row=7,column=1,sticky=W,columnspan=3) Q3=Checkbutton(fenetre,text=lq3[numero],fg='blue',font=ft12,bg='khaki',command= lambda :notation(numero,2,lq1,lq2,lq3,lsolution,item1)) liste_widgets.append(Q3) Q3.grid(row=8,column=1,sticky=W,columnspan=3) B3b=Label(fenetre,text=int(2.5*kquestion/5)*'_',font='verdana 18 bold',fg='blue',bg='khaki') liste_widgets.append(B3b) B3b.grid(row=9,column=0,columnspan=10,sticky=W) L_R=[Q1,Q2,Q3] fenetre.mainloop()