.

.

.

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/haut.PNG _images/c004.PNG _images/c005.PNG _images/haut.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 _images/haut.PNG

.

4 - La dernière question

On change la commande du bouton

_images/haut.PNG _images/q003.PNG _images/haut.PNG

.

5 - Le résultat

On utilise la fonction qui nettoie la fenêtre.

_images/haut.PNG _images/q004.PNG _images/haut.PNG

.

Le code en Python:

Note

On utilise plusieurs widgets.

Programme principal

#0804 dessins csv.py

import csv

from tkinter import*

 

def creer_item(tim):

       "creation d'un item "

       #tim+'.png' ="inombre.png" (nombre =1;2;

       #ou 9 ou 10 ...

       p1=PhotoImage(file=tim+'.png')

       return p1

 

def liste_image(nombre,dossier):

       # Fonction qui permet de creer un liste qui

       #      comporte un nombre de photos

       items=nombre*['']

       for i in range(nombre):

             # le symbole / permet d'aller

             #chercher les images

             # dans le dossier images/

             tim=dossier+'/i'+str(i)

             items[i]=creer_item(tim)

       return items  

def creerfenetre(fenetre,titre,taille):

       "modifie une fenêtre"

       fenetre.title(titre)

       fenetre.geometry(taille)

       return fenetre

 

def nettoie_fenetre(fenetre,liste_widgets):

        '''effacer les widgets'''

        for w in liste_widgets:w.destroy()

        return fenetre

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=";")

             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):

       '''Détermine la longueur maximale des 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,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,

                    lsolution,photo,photo1,largeur,liste_widgets ,

                    bouton,result):

       '''fonction qui gère le changement de questions'''

       global memoire

       if memoire[0]==1:

             bouton.config(text='Valider')

       if memoire[0]>=len(lquestion)-1:

             bouton.config(text='Résultat')

             bouton.config(command=lambda :affiche_resultat(fenetre

                                                               ,L_R,lid,ltitre,lq1,

                                                               lq2,lq3,lquestion,

                                                               lsolution,photo,photo1

                                                               ,largeur,result))

       if memoire[0]<=len(lquestion):        

             affiche_question(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,photo1,largeur,result):

       '''Affiche le résultat'''

       global memoire

       note=str(memoire[2])

       fenetre=nettoie_fenetre(fenetre,liste_widgets)    

       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='Philosophie et\n culture générale\nSCORE = '+note+'/20',

                 font='verdana 12 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)

       result.config(image=photo1[memoire[2]])

      

def affiche_question(fenetre,L_R,lid,ltitre,lq1,lq2,lq3,

                     lquestion,lsolution,photo,largeur):

       '''Change la question les réponses et l'image'''

       global memoire

       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])

       memoire[0]=memoire[1]+1

       

def notation(question,lq1,lq2,lq3,lsolution):

       '''Détermine le score'''

       global memoire

       for i in range(3):

             R=L_R[i]

             R.deselect()

       R=L_R[question]

       R.select()

       if question+1==int(lsolution[memoire[0]-1]):

             memoire[2]=memoire[2]+1

      

       

#---------------------------------------#

largeur,hauteur=800,700

fenetre=Tk()

taille=str(largeur)+"x"+str(hauteur)

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,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)

photo1=liste_image(22,'score')

photo=liste_image(20,'img3')

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(0,lq1,lq2,lq3,lsolution))

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(1,lq1,lq2,lq3,lsolution))

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(2,lq1,lq2,lq3,lsolution))

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]

bouton=Button(fenetre,text='Commencer',

              font='verdana 26 bold',bg='light blue',

command= lambda:change_question(fenetre,L_R,lid,ltitre,lq1,lq2,lq3,lquestion,

                    lsolution,photo,photo1,largeur,liste_widgets ,

                    bouton,result) )

bouton.grid(row=10,column=0,columnspan=3)

result=Label(fenetre,image=photo1[21])

result.grid(row=1,column=3,columnspan=2)

fenetre.mainloop()