Commit d848f85c authored by Weber Rodolphe's avatar Weber Rodolphe

add maxime python project

parent c0e466ab
<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<!--question: 0-->
<question type="category">
<category>
<text>top</text>
</category>
</question>
<!--question: vrai faux-->
<question type="truefalse">
<name>
<text>rtrtrt</text>
</name>
<questiontext format="html">
<text><![CDATA[<p>ertert</p>]]></text>
</questiontext>
<generalfeedback format="html">
<text/>
</generalfeedback>
<defaultgrade>10</defaultgrade>
<penalty>100</penalty>
<hidden>0</hidden>
<answer format="moodle_auto_format" fraction="0">
<text>true</text>
<feedback format="html">
<text/>
</feedback>
</answer>
<answer format="moodle_auto_format" fraction="100">
<text>false</text>
<feedback format="html">
<text/>
</feedback>
</answer>
</question>
</quiz>
# -*- coding: utf-8 -*-
'''Fenêtre principale de l'application
Permet de creer une question ou de modifier une question existante'''
from PySide2.QtWidgets import QApplication, QWidget , QVBoxLayout, QHBoxLayout, QPushButton, QGroupBox, QTextEdit, QLineEdit, QComboBox, QLabel, QCheckBox, QScrollBar, QScrollArea
from PySide2.QtGui import QIcon, QFont
from PySide2 import QtCore
import os, sys
import os.path
import time
from xml.etree import ElementTree as ET
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, Comment
#on importe toute les fenêtres qui correspondent aux différentes sortes de questions
from window_numerique import Window_numerique
from window_reponsecourte import Window_reponsecourte
from window_calculeesimple import Window_calculeesimple
from window_vraifaux import Window_vraifaux
from window_choixmultiple import Window_choixmultiple
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("fenêtre principale")
self.setGeometry(500,500,500,500)
self.createVBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.groupBox_creerquestion)
vbox.addWidget(self.groupBox_modifierquestion)
self.setLayout(vbox)
def createVBoxLayout(self):
self.groupBox_creerquestion = QGroupBox("Créer quetion")
VBoxLayout_creerquestion = QVBoxLayout()
self.button_vraifaux = QPushButton("vrai faux")
self.button_vraifaux.clicked.connect(self.vraifaux)
VBoxLayout_creerquestion.addWidget(self.button_vraifaux)
self.button_reponsecourte = QPushButton("réponse courte")
self.button_reponsecourte.clicked.connect(self.reponsecourte)
VBoxLayout_creerquestion.addWidget(self.button_reponsecourte)
self.button_choixmultiple = QPushButton("choix multiple")
self.button_choixmultiple.clicked.connect(self.choixmultiple)
VBoxLayout_creerquestion.addWidget(self.button_choixmultiple)
self.button_numerique = QPushButton("numérique")
self.button_numerique.clicked.connect(self.numerique)
VBoxLayout_creerquestion.addWidget(self.button_numerique)
self.button_calculeesimple = QPushButton("calculée simple")
self.button_calculeesimple.clicked.connect(self.calculeesimple)
VBoxLayout_creerquestion.addWidget(self.button_calculeesimple)
self.groupBox_creerquestion.setLayout(VBoxLayout_creerquestion)
self.groupBox_modifierquestion = QGroupBox("modifier question")
VBoxLayout_modifier_question = QVBoxLayout()
self.lineedit_adresse = QLineEdit()
self.lineedit_adresse.setText(os.getcwd())
VBoxLayout_modifier_question.addWidget(self.lineedit_adresse)
self.button = QPushButton("Modifier")
self.button.clicked.connect(self.modifier)
VBoxLayout_modifier_question.addWidget(self.button)
self.groupBox_modifierquestion.setLayout(VBoxLayout_modifier_question)
def vraifaux(self):
window_vraifaux_creation.show()
def reponsecourte(self):
window_reponsecourte_creation.show()
def choixmultiple(self):
window_choixmultiple_creation.show()
def numerique(self):
window_numerique_creation.show()
def calculeesimple(self):
window_calculeesimple_creation.show()
def modifier(self):
#la fonction va lire une fichier xml et ouvre une fenetre de création de question en pré remplissant les champs de cette fenêtre en fonction du fichier xml
type_question = ""
nom_fichier = os.path.basename(self.lineedit_adresse.text())
adresse_fichier = os.path.dirname(self.lineedit_adresse.text())
nom_question = ""
intitule_question = ""
note_defaut = ""
penalite = ""
feedback_general = ""
tree = ET.parse(self.lineedit_adresse.text())
root = tree.getroot()
for question in root.iter('question'):
if question.attrib["type"] != "category":
type_question = question.attrib["type"]
for note in root.iter('defaultgrade'):
note_defaut = note.text
for penalty in root.iter('penalty'):
penalite = penalty.text
for name in root.iter('name'):
for nom in name.iter('text'):
nom_question = nom.text
for question in root.iter('questiontext'):
for intitule in question.iter('text'):
intitule_question = intitule.text[3:len(intitule.text)-4]
for general in root.iter('generalfeedback'):
for feedback in general.iter('text'):
feedback_general = feedback.text
if type_question == "truefalse" :
window_vraifaux_modification.lineedit_nom_fichier.setText(nom_fichier[0:len(nom_fichier)-4])
window_vraifaux_modification.lineedit_adresse.setText(adresse_fichier)
window_vraifaux_modification.lineedit_nom_question.setText(nom_question)
window_vraifaux_modification.textedit_intitule_question.setText(intitule_question)
window_vraifaux_modification.lineedit_note_par_defaut.setText(note_defaut)
window_vraifaux_modification.combobox_penalite.setCurrentText(str(int(float(penalite)*100)))
window_vraifaux_modification.lineedit_feedback_general.setText(feedback_general)
bonne_reponse = 'Vrai'
for answer in root.iter('answer'):
note_faux = answer.attrib["fraction"]
if note_faux == '100':
bonne_reponse = 'Faux'
window_vraifaux_modification.combobox_vraifaux.setCurrentText(bonne_reponse)
liste_feedback = []
for answer in root.iter('answer'):
for feedback in answer.iter('text'):
liste_feedback.append(feedback.text)
window_vraifaux_modification.lineedit_feedback_vrai.setText(liste_feedback[1])
window_vraifaux_modification.lineedit_feedback_faux.setText(liste_feedback[3])
window_vraifaux_modification.show()
if type_question == "shortanswer" :
majuscule = ''
for usecase in root.iter('usecase'):
majuscule = usecase.text
window_reponsecourte_modification.lineedit_adresse.setText(adresse_fichier)
window_reponsecourte_modification.lineedit_nom_fichier.setText(nom_fichier[0:len(nom_fichier)-4])
window_reponsecourte_modification.lineedit_nom_question.setText(nom_question)
window_reponsecourte_modification.textedit_intitule_question.setText(intitule_question)
window_reponsecourte_modification.lineedit_note_par_defaut.setText(note_defaut)
window_reponsecourte_modification.combobox_penalite.setCurrentText(str(int(float(penalite)*100)))
window_reponsecourte_modification.lineedit_feedback_general.setText(feedback_general)
window_reponsecourte_modification.show()
if majuscule != '0':
window_reponsecourte_modification.combobox_maj.setCurrentIndex(1)
liste_reponse = []
liste_note = []
liste_feedback = []
for answer in root.iter('answer'):
liste_note.append(answer.attrib["fraction"])
for question in answer.iter('text'):
liste_reponse.append(question.text)
for feedback in answer.iter('feedback'):
for feed in feedback.iter('text'):
liste_feedback.append(feed.text)
for k in range (3):
liste_reponse.append("")
liste_note.append("")
liste_feedback.append("")
window_reponsecourte_modification.LineEditReponse1.setText(liste_reponse[0])
window_reponsecourte_modification.combobox_reponse1.setCurrentText(liste_note[0])
window_reponsecourte_modification.lineedit_feedback_reponse1.setText(liste_feedback[0])
window_reponsecourte_modification.LineEditReponse2.setText(liste_reponse[2])
window_reponsecourte_modification.combobox_reponse2.setCurrentText(liste_note[1])
window_reponsecourte_modification.lineedit_feedback_reponse2.setText(liste_feedback[1])
if type_question == "multichoice" :
window_choixmultiple_modification.lineedit_nom_fichier.setText(nom_fichier[0:len(nom_fichier)-4])
window_choixmultiple_modification.lineedit_adresse.setText(adresse_fichier)
window_choixmultiple_modification.lineedit_nom_question.setText(nom_question)
window_choixmultiple_modification.textedit_intitule_question.setText(intitule_question)
window_choixmultiple_modification.lineedit_note_par_defaut.setText(note_defaut)
window_choixmultiple_modification.combobox_penalite.setCurrentText(str(int(float(penalite)*100)))
window_choixmultiple_modification.lineedit_feedback_general.setText(feedback_general)
nb_reponse = ''
for single in root.iter('single'):
nb_reponse = single.text
if nb_reponse == 'false' :
window_choixmultiple_modification.combobox_nbreponse.setCurrentIndex(1)
else:
window_choixmultiple_modification.combobox_nbreponse.setCurrentIndex(0)
melange_reponse = ''
for shuffleanswers in root.iter('shuffleanswers'):
melange_reponse = shuffleanswers.text
if melange_reponse != 'false':
window_choixmultiple_modification.check_melange.setChecked(True)
numerotation = ''
for answernumbering in root.iter('answernumbering'):
numerotation = answernumbering.text
if numerotation == '123':
window_choixmultiple_modification.combobox_numerotation.setCurrentIndex(1)
elif numerotation == 'abc':
window_choixmultiple_modification.combobox_numerotation.setCurrentIndex(0)
else:
window_choixmultiple_modification.combobox_numerotation.setCurrentIndex(2)
liste_reponse = []
liste_note = []
liste_feedback = []
for answer in root.iter('answer'):
liste_note.append(answer.attrib["fraction"])
for question in answer.iter('text'):
liste_reponse.append(question.text[3:len(question.text)-4])
for feedback in answer.iter('feedback'):
for feed in feedback.iter('text'):
liste_feedback.append(feed.text)
for k in range(3):
liste_reponse.append("")
liste_note.append("")
liste_feedback.append("")
liste_feedback_principaux = []
for feedback in root.iter('text'):
liste_feedback_principaux.append(feedback.text)
window_choixmultiple_modification.lineedit_feedback_corecte.setText(liste_feedback_principaux[4])
window_choixmultiple_modification.lineedit_feedback_partiellement_corecte.setText(liste_feedback_principaux[5])
window_choixmultiple_modification.lineedit_feedback_incorecte.setText(liste_feedback_principaux[6])
window_choixmultiple_modification.LineEditReponse1.setText(liste_reponse[0])
window_choixmultiple_modification.combobox_reponse1.setCurrentText(liste_note[0])
window_choixmultiple_modification.lineedit_feedback_reponse1.setText(liste_feedback[0])
window_choixmultiple_modification.LineEditReponse2.setText(liste_reponse[2])
window_choixmultiple_modification.combobox_reponse2.setCurrentText(liste_note[1])
window_choixmultiple_modification.lineedit_feedback_reponse2.setText(liste_feedback[1])
window_choixmultiple_modification.LineEditReponse3.setText(liste_reponse[4])
window_choixmultiple_modification.combobox_reponse3.setCurrentText(liste_note[2])
window_choixmultiple_modification.lineedit_feedback_reponse3.setText(liste_feedback[2])
window_choixmultiple_modification.LineEditReponse4.setText(liste_reponse[6])
window_choixmultiple_modification.combobox_reponse4.setCurrentText(liste_note[3])
window_choixmultiple_modification.lineedit_feedback_reponse4.setText(liste_feedback[3])
window_choixmultiple_modification.show()
if type_question == "numerical" :
window_numerique_modification.lineedit_nom_fichier.setText(nom_fichier[0:len(nom_fichier)-4])
window_numerique_modification.lineedit_adresse.setText(adresse_fichier)
window_numerique_modification.lineedit_nom_question.setText(nom_question)
window_numerique_modification.textedit_intitule_question.setText(intitule_question)
window_numerique_modification.lineedit_note_par_defaut.setText(note_defaut)
window_numerique_modification.combobox_penalite.setCurrentText(str(int(float(penalite)*100)))
window_numerique_modification.lineedit_feedback_general.setText(feedback_general)
traitement_unite = ''
for unit in root.iter('unitgradingtype'):
traitement_unite = unit.text
saisie_unite = ''
for showunits in root.iter('showunits'):
saisie_unite = showunits.text
position_unite = ''
for unitsleft in root.iter('unitsleft'):
position_unite = unitsleft.text
liste_unite_nom = []
for unit_name in root.iter('unit_name'):
liste_unite_nom.append(unit_name.text)
for k in range(3):
liste_unite_nom.append('')
liste_unite_coef = []
for multiplier in root.iter('multiplier'):
liste_unite_coef.append(multiplier.text)
for k in range(3):
liste_unite_coef.append('')
if traitement_unite == '0' and saisie_unite == '3' :
window_numerique_modification.combobox_traitementunite.setCurrentIndex(0)
if traitement_unite == '0' and saisie_unite != '3' :
window_numerique_modification.combobox_traitementunite.setCurrentIndex(1)
window_numerique_modification.combobox_position_unite.setCurrentIndex(int(position_unite))
window_numerique_modification.lineedit_unite1.setText(liste_unite_nom[0])
window_numerique_modification.lineedit_coef1.setText(liste_unite_coef[0])
window_numerique_modification.lineedit_unite2.setText(liste_unite_nom[1])
window_numerique_modification.lineedit_coef2.setText(liste_unite_coef[1])
if traitement_unite != '0' :
window_numerique_modification.combobox_traitementunite.setCurrentIndex(2)
window_numerique_modification.combobox_position_unite.setCurrentIndex(int(position_unite))
window_numerique_modification.combobox_selection_unite.setCurrentIndex(int(saisie_unite))
window_numerique_modification.lineedit_unite1.setText(liste_unite_nom[0])
window_numerique_modification.lineedit_coef1.setText(liste_unite_coef[0])
window_numerique_modification.lineedit_unite2.setText(liste_unite_nom[1])
window_numerique_modification.lineedit_coef2.setText(liste_unite_coef[1])
liste_reponse = []
liste_note = []
liste_feedback = []
liste_erreur = []
for answer in root.iter('answer'):
liste_note.append(answer.attrib["fraction"])
for question in answer.iter('text'):
liste_reponse.append(question.text)
for feedback in answer.iter('feedback'):
for feed in feedback.iter('text'):
liste_feedback.append(feed.text)
for tolerance in answer.iter('tolerance'):
liste_erreur.append(tolerance.text)
for k in range (3):
liste_reponse.append("")
liste_note.append("")
liste_feedback.append("")
liste_feedback
window_numerique_modification.LineEditReponse1.setText(liste_reponse[0])
window_numerique_modification.lineedit_erreur_reponse1.setText(liste_erreur[0])
window_numerique_modification.combobox_reponse1.setCurrentText(liste_note[0])
window_numerique_modification.lineedit_feedback_reponse1.setText(liste_feedback[0])
window_numerique_modification.LineEditReponse2.setText(liste_reponse[2])
window_numerique_modification.lineedit_erreur_reponse2.setText(liste_erreur[1])
window_numerique_modification.combobox_reponse2.setCurrentText(liste_note[1])
window_numerique_modification.lineedit_feedback_reponse2.setText(liste_feedback[1])
window_numerique_modification.show()
if type_question == 'calculatedsimple':
window_calculeesimple_modification.lineedit_nom_fichier.setText(nom_fichier[0:len(nom_fichier)-4])
window_calculeesimple_modification.lineedit_adresse.setText(adresse_fichier)
window_calculeesimple_modification.lineedit_nom_question.setText(nom_question)
window_calculeesimple_modification.textedit_intitule_question.setText(intitule_question)
window_calculeesimple_modification.lineedit_note_par_defaut.setText(note_defaut)
window_calculeesimple_modification.combobox_penalite.setCurrentText(str(int(float(penalite)*100)))
window_calculeesimple_modification.lineedit_feedback_general.setText(feedback_general)
traitement_unite = ''
for unit in root.iter('unitgradingtype'):
traitement_unite = unit.text
saisie_unite = ''
for showunits in root.iter('showunits'):
saisie_unite = showunits.text
position_unite = ''
for unitsleft in root.iter('unitsleft'):
position_unite = unitsleft.text
liste_unite_nom = []
for unit_name in root.iter('unit_name'):
liste_unite_nom.append(unit_name.text)
for k in range(3):
liste_unite_nom.append('')
liste_unite_coef = []
for multiplier in root.iter('multiplier'):
liste_unite_coef.append(multiplier.text)
for k in range(3):
liste_unite_coef.append('')
if traitement_unite == '0' and saisie_unite == '3' :
window_calculeesimple_modification.combobox_traitementunite.setCurrentIndex(0)
if traitement_unite == '0' and saisie_unite != '3' :
window_calculeesimple_modification.combobox_traitementunite.setCurrentIndex(1)
window_calculeesimple_modification.combobox_position_unite.setCurrentIndex(int(position_unite))
window_calculeesimple_modification.lineedit_unite1.setText(liste_unite_nom[0])
window_calculeesimple_modification.lineedit_coef1.setText(liste_unite_coef[0])
window_calculeesimple_modification.lineedit_unite2.setText(liste_unite_nom[1])
window_calculeesimple_modification.lineedit_coef2.setText(liste_unite_coef[1])
if traitement_unite != '0' :
window_calculeesimple_modification.combobox_traitementunite.setCurrentIndex(2)
window_calculeesimple_modification.combobox_position_unite.setCurrentIndex(int(position_unite))
window_calculeesimple_modification.combobox_selection_unite.setCurrentIndex(int(saisie_unite))
window_calculeesimple_modification.lineedit_unite1.setText(liste_unite_nom[0])
window_calculeesimple_modification.lineedit_coef1.setText(liste_unite_coef[0])
window_calculeesimple_modification.lineedit_unite2.setText(liste_unite_nom[1])
window_calculeesimple_modification.lineedit_coef2.setText(liste_unite_coef[1])
liste_reponse = []
liste_note = []
liste_feedback = []
liste_erreur = []
for answer in root.iter('answer'):
liste_note.append(answer.attrib["fraction"])
for question in answer.iter('text'):
liste_reponse.append(question.text)
for feedback in answer.iter('feedback'):
for feed in feedback.iter('text'):
liste_feedback.append(feed.text)
for tolerance in answer.iter('tolerance'):
liste_erreur.append(tolerance.text)
for k in range (3):
liste_reponse.append("")
liste_note.append("")
liste_feedback.append("")
liste_feedback
window_calculeesimple_modification.lineedit_reponse.setText(liste_reponse[0])
window_calculeesimple_modification.lineedit_erreur_reponse1.setText(liste_erreur[0])
window_calculeesimple_modification.combobox_reponse1.setCurrentText(liste_note[0])
window_calculeesimple_modification.lineedit_feedbackreponse.setText(liste_feedback[0])
window_calculeesimple_modification.show()
'''Quand le programme s'execute, on crée la fenetre principale(mainwindow) et on l'affiche.
On crée également des fenetres de création de questions(window_vraifaux, window_reponsecourte, ...).
Ces dernières ne sont pas visibles au lancement de l'application. On les rend visibles lorsque l'on appuie sur les différents boutons de la fenetre principale
'''
myApp = QApplication(sys.argv)
window = Window()
window.show()
#fenêtres qui serviront à la création de questions
window_numerique_creation = Window_numerique()
window_vraifaux_creation = Window_vraifaux()
window_reponsecourte_creation = Window_reponsecourte()
window_calculeesimple_creation = Window_calculeesimple()
window_choixmultiple_creation = Window_choixmultiple()
#fenêtres qui serviront à la modification de questions
window_numerique_modification = Window_numerique()
window_vraifaux_modification = Window_vraifaux()
window_reponsecourte_modification = Window_reponsecourte()
window_calculeesimple_modification = Window_calculeesimple()
window_choixmultiple_modification = Window_choixmultiple()
myApp.exec_()
sys.exit()
\ No newline at end of file
from cx_Freeze import setup, Executable
setup(
name = "test",
version = "0.1",
description = "premier test",
executables = [Executable("mainwindow.py")]
)
\ No newline at end of file
''' Fenêtre qui sert à créer/modifier les question de type 'calculée simple' '''
from PySide2.QtWidgets import QApplication, QWidget , QVBoxLayout, QHBoxLayout, QPushButton, QGroupBox, QTextEdit, QLineEdit, QComboBox, QLabel, QCheckBox, QScrollBar, QScrollArea
from PySide2.QtGui import QIcon, QFont
from PySide2 import QtCore
import os, sys
from xml.etree import ElementTree as ET
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, Comment
class Window_calculeesimple(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Calculée simple")
self.setGeometry(500,500,500,500)
self.createVBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.groupBox)
self.setLayout(vbox)
#self.show()
def createVBoxLayout(self):
self.groupBox = QGroupBox("Type de question : calculée simple")
VBoxLayout = QVBoxLayout()
#VBoxLayout.setSpacing(50)
scrollbar = QScrollArea()
scrollbar.setLayout(VBoxLayout)
hbox_adresse = QHBoxLayout()
VBoxLayout.addLayout(hbox_adresse)
self.label_adresse = QLabel("adresse du fichier",self)
self.label_adresse.setFixedWidth(150)
hbox_adresse.addWidget(self.label_adresse)
self.lineedit_adresse = QLineEdit(self)
self.lineedit_adresse.setText(os.getcwd())
hbox_adresse.addWidget(self.lineedit_adresse)
hbox_adresse.insertSpacing(2,400)
hbox_nom_fichier = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_fichier)
self.label_nom_fichier = QLabel("Nom fichier :",self)
self.label_nom_fichier.setFixedWidth(150)
hbox_nom_fichier.addWidget(self.label_nom_fichier)
self.lineedit_nom_fichier = QLineEdit(self)
hbox_nom_fichier.addWidget(self.lineedit_nom_fichier)
hbox_nom_fichier.insertSpacing(2,400)
hbox_nom_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_question)
self.label_nom_question = QLabel("Nom question :",self)
self.label_nom_question.setFixedWidth(150)
hbox_nom_question.addWidget(self.label_nom_question)
self.lineedit_nom_question = QLineEdit(self)
#self.lineedit_nom_question.setFixedWidth(500)
hbox_nom_question.addWidget(self.lineedit_nom_question)
hbox_nom_question.insertSpacing(2,400)
hbox_intitule_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_intitule_question)
self.label_intitule_question = QLabel("Intitulé de la question :", self)
self.label_intitule_question.setFixedWidth(150)
self.label_intitule_question.setWordWrap(True)
hbox_intitule_question.addWidget(self.label_intitule_question)
self.textedit_intitule_question = QTextEdit(self)
self.textedit_intitule_question.setFixedHeight(150)
hbox_intitule_question.addWidget(self.textedit_intitule_question)
hbox_intitule_question.insertSpacing(2,100)
hbox_note_defaut = QHBoxLayout()
VBoxLayout.addLayout(hbox_note_defaut)
self.label_note_par_defaut = QLabel("Note par défaut :", self)
self.label_note_par_defaut.setFixedWidth(150)
hbox_note_defaut.addWidget(self.label_note_par_defaut)
self.lineedit_note_par_defaut = QLineEdit(self)
hbox_note_defaut.addWidget(self.lineedit_note_par_defaut)
hbox_note_defaut.insertSpacing(2,700)
hbox_penalite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite)
self.label_penalite = QLabel("pénalité :", self)
self.label_penalite.setFixedWidth(150)
hbox_penalite.addWidget(self.label_penalite)
self.combobox_penalite = QComboBox()
self.combobox_penalite.addItem("100")
self.combobox_penalite.addItem("75")
self.combobox_penalite.addItem("66.66")
self.combobox_penalite.addItem("50")
self.combobox_penalite.addItem("25")
self.combobox_penalite.addItem("33.333")
self.combobox_penalite.addItem("0")
hbox_penalite.addWidget(self.combobox_penalite)
hbox_penalite.insertSpacing(2,1000)
hbox_feedbackgeneral = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedbackgeneral)
self.label_feedbackgeneral = QLabel("Feedback general :", self)
self.label_feedbackgeneral.setFixedWidth(150)
hbox_feedbackgeneral.addWidget(self.label_feedbackgeneral)
self.lineedit_feedback_general = QLineEdit(self)
hbox_feedbackgeneral.addWidget(self.lineedit_feedback_general)
hbox_feedbackgeneral.insertSpacing(2,100)
self.label_espace_reponse = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse)
hbox_reponse = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse)
self.label_reponse = QLabel("Formule Réponse :",self)
self.label_reponse.setFixedWidth(150)
hbox_reponse.addWidget(self.label_reponse)
self.lineedit_reponse = QLineEdit(self)
hbox_reponse.addWidget(self.lineedit_reponse)
self.label_note1 = QLabel("note (%) :",self)
hbox_reponse.addWidget(self.label_note1)
self.combobox_reponse1 = QComboBox()
self.combobox_reponse1.addItem("100")
self.combobox_reponse1.addItem("75")
self.combobox_reponse1.addItem("66.66")
self.combobox_reponse1.addItem("50")
self.combobox_reponse1.addItem("25")
self.combobox_reponse1.addItem("33.333")
self.combobox_reponse1.addItem("0")
hbox_reponse.addWidget(self.combobox_reponse1)
self.label_erreur_reponse1 = QLabel("erreur :",self)
hbox_reponse.addWidget(self.label_erreur_reponse1)
self.lineedit_erreur_reponse1 = QLineEdit(self)
hbox_reponse.addWidget(self.lineedit_erreur_reponse1)
hbox_reponse.insertSpacing(6,70)
hbox_reponse.insertSpacing(4,70)
hbox_reponse.insertSpacing(2,70)
hbox_feedbackreponse = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedbackreponse)
self.label_feedbackreponse = QLabel("feedback réponse",self)
self.label_feedbackreponse.setFixedWidth(150)
hbox_feedbackreponse.addWidget(self.label_feedbackreponse)
self.lineedit_feedbackreponse = QLineEdit(self)
hbox_feedbackreponse.addWidget(self.lineedit_feedbackreponse)
hbox_feedbackreponse.insertSpacing(2,100)
self.label_espace_unite = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_unite)
hbox_traitementunite = QHBoxLayout()
VBoxLayout.addLayout(hbox_traitementunite)
self.labeltraitementunite = QLabel("traitement de l'unité",self)
self.labeltraitementunite.setFixedWidth(150)
hbox_traitementunite.addWidget(self.labeltraitementunite)
self.combobox_traitementunite = QComboBox(self)
self.combobox_traitementunite.addItem("les unités ne sont pas utilisées. Seule la valeur numérique est évaluée")
self.combobox_traitementunite.addItem("les unités sont optionnelles. Si une unité est saisie elle est utilisée pour la conversion vers l'unité 1 ")
self.combobox_traitementunite.addItem("l'unite doit être indiquée et sera prise en compte dans la note")
hbox_traitementunite.addWidget(self.combobox_traitementunite)
hbox_traitementunite.insertSpacing(2,400)
hbox_penalite_unite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite_unite)
self.label_penalite_unite = QLabel("pénalité unité \n(fraction entre 0 et 1)",self)
self.label_penalite_unite.setFixedWidth(150)
hbox_penalite_unite.addWidget(self.label_penalite_unite)
self.lineedit_penalite_unite = QLineEdit(self)
self.lineedit_penalite_unite.setEnabled(False)
hbox_penalite_unite.addWidget(self.lineedit_penalite_unite)
hbox_penalite_unite.insertSpacing(2,700)
hbox_selection_unites = QHBoxLayout()
VBoxLayout.addLayout(hbox_selection_unites)
self.label_selection_unite = QLabel("les unités sont saisie en utilisant",self)
self.label_selection_unite.setFixedWidth(150)
self.label_selection_unite.setWordWrap(True)
hbox_selection_unites.addWidget(self.label_selection_unite)
self.combobox_selection_unite = QComboBox()
self.combobox_selection_unite.addItem("la zone de saisie")
self.combobox_selection_unite.addItem("une sélection de choix multiple")
self.combobox_selection_unite.addItem("un menu déroulant")
self.combobox_selection_unite.setEnabled(False)
hbox_selection_unites.addWidget(self.combobox_selection_unite)
hbox_selection_unites.insertSpacing(2,700)
hbox_position_unite = QHBoxLayout()
VBoxLayout.addLayout(hbox_position_unite)
self.label_position_unite = QLabel("position de l'unité",self)
self.label_position_unite.setFixedWidth(150)
hbox_position_unite.addWidget(self.label_position_unite)
self.combobox_position_unite = QComboBox()
self.combobox_position_unite.addItem("à droite, comme 12.5 cm ou 10.5 Km")
self.combobox_position_unite.addItem("à gauche, comme $ 1.5 ou £ 2.5")
self.combobox_position_unite.setEnabled(False)
hbox_position_unite.addWidget(self.combobox_position_unite)
hbox_position_unite.insertSpacing(2,700)
hbox_unite1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_unite1)
self.label_unite1 = QLabel("unité 1", self)
self.label_unite1.setFixedWidth(150)
hbox_unite1.addWidget(self.label_unite1)
self.lineedit_unite1 = QLineEdit(self)
self.lineedit_unite1.setEnabled(False)
hbox_unite1.addWidget(self.lineedit_unite1)
self.label_coef1 = QLabel("Coefficient")
self.label_coef1.setFixedWidth(90)
hbox_unite1.addWidget(self.label_coef1)
self.lineedit_coef1 = QLineEdit(self)
self.lineedit_coef1.setEnabled(False)
hbox_unite1.addWidget(self.lineedit_coef1)
hbox_unite1.insertSpacing(2,200)
hbox_unite1.insertSpacing(5,200)
hbox_unite2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_unite2)
self.label_unite2 = QLabel("unité 2", self)
self.label_unite2.setFixedWidth(150)
hbox_unite2.addWidget(self.label_unite2)
self.lineedit_unite2 = QLineEdit(self)
self.lineedit_unite2.setEnabled(False)
hbox_unite2.addWidget(self.lineedit_unite2)
self.label_coef2 = QLabel("Coefficient")
self.label_coef2.setFixedWidth(90)
hbox_unite2.addWidget(self.label_coef2)
self.lineedit_coef2 = QLineEdit(self)
self.lineedit_coef2.setEnabled(False)
hbox_unite2.addWidget(self.lineedit_coef2)
hbox_unite2.insertSpacing(2,200)
hbox_unite2.insertSpacing(5,200)
self.label_espace_bouton = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_bouton)
hbox_bouton_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_bouton_question)
self.button = QPushButton("créer la question")
self.button.clicked.connect(self.creer_question)
hbox_bouton_question.addWidget(self.button)
hbox_bouton_question.insertSpacing(2,400)
hbox_bouton_question.insertSpacing(0,400)
self.groupBox.setLayout(VBoxLayout)
self.combobox_traitementunite.currentIndexChanged.connect(self.traitement_unite)
def traitement_unite(self,index):
#Fonction qui permet de rendre actif/inactif certains champs en fonction du traitement de l'unité (comme sur Celene)
if self.combobox_traitementunite.currentIndex() == 0:
self.lineedit_penalite_unite.setEnabled(False)
self.lineedit_penalite_unite.setText("")
self.combobox_selection_unite.setEnabled(False)
self.combobox_position_unite.setEnabled(False)
self.lineedit_unite1.setEnabled(False)
self.lineedit_unite1.setText("")
self.lineedit_coef1.setEnabled(False)
self.lineedit_coef1.setText("")
self.lineedit_unite2.setEnabled(False)
self.lineedit_unite2.setText("")
self.lineedit_coef2.setEnabled(False)
self.lineedit_coef2.setText("")
if self.combobox_traitementunite.currentIndex() == 1:
self.lineedit_penalite_unite.setEnabled(False)
self.lineedit_penalite_unite.setText("")
self.combobox_selection_unite.setEnabled(False)
self.combobox_position_unite.setEnabled(True)
self.lineedit_unite1.setEnabled(True)
self.lineedit_coef1.setEnabled(True)
self.lineedit_unite2.setEnabled(True)
self.lineedit_coef2.setEnabled(True)
if self.combobox_traitementunite.currentIndex() == 2:
self.lineedit_penalite_unite.setEnabled(True)
self.combobox_selection_unite.setEnabled(True)
self.combobox_position_unite.setEnabled(True)
self.lineedit_unite1.setEnabled(True)
self.lineedit_coef1.setEnabled(True)
self.lineedit_unite2.setEnabled(True)
self.lineedit_coef2.setEnabled(True)
def creer_question(self):
#Fonction qui va créer un fichier xml en qui correspond à une question 'calculée simple' en prenant en compte toutes les infos dans les champs remplis de la fenêtre
#non du fichier xml que l'on veut creer
file_name = self.lineedit_nom_fichier.text()
file_name_txt = file_name + ".txt"
file_name_xml = file_name + ".XML"
adresse = self.lineedit_adresse.text() + '/'
nom_question = self.lineedit_nom_question.text()
intitule_question = self.textedit_intitule_question.toPlainText()
note_par_defaut = self.lineedit_note_par_defaut.text()
feedback_general = self.lineedit_feedback_general.text()
penalite = str(float(self.combobox_penalite.currentText()) / 100)
reponse1 = self.lineedit_reponse.text()
tolerance1 = self.lineedit_erreur_reponse1.text()
pourcentage1 = self.combobox_reponse1.currentText()
feedback_reponse1 = self.lineedit_feedbackreponse.text()
traitement_unite = 'sans' # mettre 'avec', 'optionnel' ou 'sans'
if self.combobox_traitementunite.currentIndex() == 1 :
traitement_unite = 'optionnel'
if self.combobox_traitementunite.currentIndex() == 2 :
traitement_unite = 'avec'
penalite_unite = self.lineedit_penalite_unite.text()
saisie_unite = 'texte' # mettre 'texte', 'menu', ou 'selection'
if self.combobox_selection_unite.currentIndex() == 1:
saisie_unite = 'selection'
if self.combobox_selection_unite.currentIndex() == 2:
saisie_unite = 'menu'
position_unite = 'R' # mettre 'R' ou 'L'
if self.combobox_position_unite.currentIndex() == 1 :
position_unite = 'L'
unite1 = self.lineedit_unite1.text()
coef1 = self.lineedit_coef1.text()
unite2 = self.lineedit_unite2.text()
coef2 = self.lineedit_coef2.text()
#'top' va contenir tout le document xml
top = Element('quiz')
#on ajoute toutes les lignes du documents
comment = Comment('question: 0')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','category')
category = SubElement(question,'category')
text = SubElement(category,'text')
text.text = 'top'
comment = Comment('question: numerique')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','calculatedsimple')
name = SubElement(question,'name')
text = SubElement(name,'text')
text.text = nom_question
questiontext = SubElement(question,'questiontext')
questiontext.set('format','html')
text=SubElement(questiontext,'text')
text.text = '<![CDATA[<p>' + intitule_question + '</p>]]>'
generalfeedback = SubElement(question,'generalfeedback')
generalfeedback.set('format','html')
text = SubElement(generalfeedback,'text')
text.text = feedback_general
defaultgrade = SubElement(question,'defaultgrade')
defaultgrade.text = note_par_defaut
penalty = SubElement(question,'penalty')
penalty.text = penalite
hidden= SubElement(question,'hidden')
hidden.text = '0'
if reponse1 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage1)
text = SubElement(answer,'text')
text.text = reponse1
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback_reponse1
tolerance = SubElement(answer,'tolerance')
tolerance.text = tolerance1
units=SubElement(question,'units')
if unite1 != '':
unit = SubElement(units,'unit')
multiplier = SubElement(unit,'multiplier')
multiplier.text = coef1
unit_name = SubElement(unit,'unit_name')
unit_name.text = unite1
if unite2 != '':
unit = SubElement(units,'unit')
multiplier = SubElement(unit,'multiplier')
multiplier.text = coef2
unit_name = SubElement(unit,'unit_name')
unit_name.text = unite2
if traitement_unite == 'sans' :
unitgradingtype = SubElement(question,'unitgradingtype')
unitgradingtype.text = '0'
unitpenalty = SubElement(question,'unitpenalty')
unitpenalty.text = '0.1'
if traitement_unite == 'optionnel' :
unitgradingtype = SubElement(question,'unitgradingtype')
unitgradingtype.text = '0'
unitpenalty = SubElement(question,'unitpenalty')
unitpenalty.text = '0.1'
if traitement_unite == 'avec' :
unitgradingtype = SubElement(question,'unitgradingtype')
unitgradingtype.text = '2'
unitpenalty = SubElement(question,'unitpenalty')
unitpenalty.text = penalite_unite
if saisie_unite == 'texte' :
showunits = SubElement(question,'showunits')
showunits.text = '0'
if saisie_unite == 'selection' :
showunits = SubElement(question,'showunits')
showunits.text = '1'
if saisie_unite == 'menu' :
showunits = SubElement(question,'showunits')
showunits.text = '2'
if traitement_unite == 'sans':
showunits = SubElement(question,'showunits')
showunits.text = '3'
if position_unite == 'L':
unitsleft = SubElement(question,'unitsleft')
unitsleft.text = '1'
else :
unitsleft = SubElement(question,'unitsleft')
unitsleft.text = '0'
#on cree un fichier txt qui contient toute les lignes du fichier xml que l'on va creer
fichier = open(adresse + file_name_txt, "w")
fichier.write(prettify(top))
fichier.close()
#on rajoute ' encoding="UTF-8" ' dans la premiere ligne
fichier = open(adresse + file_name_txt, "r")
lignes= fichier.readlines()
fichier = open(adresse + file_name_txt, "w")
lignes[0] = '<?xml version="1.0" encoding="UTF-8"?>\n'
fichier.writelines(lignes)
fichier.close()
#on remplace les &lt; et les &gt; par < et > dans le fichier
f=open(adresse + file_name_txt,'r')
chaine=f.read().replace('&lt;','<')
chaine = chaine.replace ('&gt;','>')
f.close()
f=open(adresse + file_name_txt,'w')
f.write(chaine)
f.close()
#on transforme le fichier txt en fichier xml
if os.path.exists(adresse + file_name_xml):
os.remove(adresse + file_name_xml)
os.rename(adresse + file_name_txt, adresse + file_name_xml)
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
''' Fenêtre qui sert à créer/modifier les question de type 'choix multiple' '''
from PySide2.QtWidgets import QApplication, QWidget , QVBoxLayout, QHBoxLayout, QPushButton, QGroupBox, QTextEdit, QLineEdit, QComboBox, QLabel, QCheckBox, QScrollBar, QScrollArea
from PySide2.QtGui import QIcon, QFont
from PySide2 import QtCore
import os, sys
from xml.etree import ElementTree as ET
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, Comment
class Window_choixmultiple(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Choix Multiple")
self.setGeometry(500,500,500,500)
self.createVBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.groupBox)
self.setLayout(vbox)
#self.show()
def createVBoxLayout(self):
self.groupBox = QGroupBox("Type de question : Choix multiple")
VBoxLayout = QVBoxLayout()
scrollbar = QScrollArea()
scrollbar.setLayout(VBoxLayout)
hbox_adresse = QHBoxLayout()
VBoxLayout.addLayout(hbox_adresse)
self.label_adresse = QLabel("adresse du fichier",self)
self.label_adresse.setFixedWidth(150)
hbox_adresse.addWidget(self.label_adresse)
self.lineedit_adresse = QLineEdit(self)
self.lineedit_adresse.setText(os.getcwd())
hbox_adresse.addWidget(self.lineedit_adresse)
hbox_adresse.insertSpacing(2,400)
hbox_nom_fichier = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_fichier)
self.label_nom_fichier = QLabel("Nom fichier :",self)
self.label_nom_fichier.setFixedWidth(150)
hbox_nom_fichier.addWidget(self.label_nom_fichier)
self.lineedit_nom_fichier = QLineEdit(self)
hbox_nom_fichier.addWidget(self.lineedit_nom_fichier)
hbox_nom_fichier.insertSpacing(2,400)
hbox_nom_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_question)
self.label_nom_question = QLabel("Nom question :",self)
self.label_nom_question.setFixedWidth(150)
hbox_nom_question.addWidget(self.label_nom_question)
self.lineedit_nom_question = QLineEdit(self)
#self.lineedit_nom_question.setFixedWidth(500)
hbox_nom_question.addWidget(self.lineedit_nom_question)
hbox_nom_question.insertSpacing(2,400)
hbox_intitule_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_intitule_question)
self.label_intitule_question = QLabel("Intitulé de la question :", self)
self.label_intitule_question.setFixedWidth(150)
self.label_intitule_question.setWordWrap(True)
hbox_intitule_question.addWidget(self.label_intitule_question)
self.textedit_intitule_question = QTextEdit(self)
self.textedit_intitule_question.setFixedHeight(150)
hbox_intitule_question.addWidget(self.textedit_intitule_question)
hbox_intitule_question.insertSpacing(2,100)
hbox_note_defaut = QHBoxLayout()
VBoxLayout.addLayout(hbox_note_defaut)
self.label_note_par_defaut = QLabel("Note par défaut :", self)
self.label_note_par_defaut.setFixedWidth(150)
hbox_note_defaut.addWidget(self.label_note_par_defaut)
self.lineedit_note_par_defaut = QLineEdit(self)
hbox_note_defaut.addWidget(self.lineedit_note_par_defaut)
hbox_note_defaut.insertSpacing(2,600)
hbox_penalite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite)
self.label_penalite = QLabel("pénalité :", self)
self.label_penalite.setFixedWidth(150)
hbox_penalite.addWidget(self.label_penalite)
self.combobox_penalite = QComboBox()
self.combobox_penalite.addItem("100")
self.combobox_penalite.addItem("75")
self.combobox_penalite.addItem("66.66")
self.combobox_penalite.addItem("50")
self.combobox_penalite.addItem("25")
self.combobox_penalite.addItem("33.333")
self.combobox_penalite.addItem("0")
hbox_penalite.addWidget(self.combobox_penalite)
hbox_penalite.insertSpacing(2,1000)
hbox_feedbackgeneral = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedbackgeneral)
self.label_feedbackgeneral = QLabel("Feedback general :", self)
self.label_feedbackgeneral.setFixedWidth(150)
hbox_feedbackgeneral.addWidget(self.label_feedbackgeneral)
self.lineedit_feedback_general = QLineEdit(self)
hbox_feedbackgeneral.addWidget(self.lineedit_feedback_general)
hbox_feedbackgeneral.insertSpacing(2,100)
hbox_nbreponse = QHBoxLayout()
VBoxLayout.addLayout(hbox_nbreponse)
self.label_nbreponse = QLabel("plusieurs réponses ou" +"\n" "une seule ?",self)
self.label_nbreponse.setWordWrap(True)
self.label_nbreponse.setFixedWidth(150)
hbox_nbreponse.addWidget(self.label_nbreponse)
self.combobox_nbreponse = QComboBox()
self.combobox_nbreponse.addItem("une seule réponse")
self.combobox_nbreponse.addItem("réponses multiples autorisées")
hbox_nbreponse.addWidget(self.combobox_nbreponse)
self.check_melange = QCheckBox("mélanger l'ordre des réponses", self)
hbox_nbreponse.addWidget(self.check_melange)
self.label_numerotation = QLabel("numérotation :")
hbox_nbreponse.addWidget(self.label_numerotation)
self.combobox_numerotation = QComboBox()
self.combobox_numerotation.addItem("a, b, c ...")
self.combobox_numerotation.addItem("1, 2, 3 ...")
self.combobox_numerotation.addItem("sans numerotation")
hbox_nbreponse.addWidget(self.combobox_numerotation)
hbox_nbreponse.insertSpacing(5,250)
hbox_nbreponse.insertSpacing(4,50)
hbox_nbreponse.insertSpacing(3,100)
hbox_nbreponse.insertSpacing(2,50)
self.label_espace_reponse1 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse1)
hbox_reponse1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse1)
self.label_reponse1 = QLabel("Réponse 1 :", self)
self.label_reponse1.setFixedWidth(150)
hbox_reponse1.addWidget(self.label_reponse1)
self.LineEditReponse1 = QLineEdit(self)
hbox_reponse1.addWidget(self.LineEditReponse1)
self.label_note1 = QLabel("note (%) :",self)
hbox_reponse1.addWidget(self.label_note1)
self.combobox_reponse1 = QComboBox()
self.combobox_reponse1.addItem("100")
self.combobox_reponse1.addItem("75")
self.combobox_reponse1.addItem("66.66")
self.combobox_reponse1.addItem("50")
self.combobox_reponse1.addItem("25")
self.combobox_reponse1.addItem("33.333")
self.combobox_reponse1.addItem("0")
hbox_reponse1.addWidget(self.combobox_reponse1)
hbox_reponse1.insertSpacing(4,70)
hbox_feedback_reponse1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse1)
self.label_feedback_reponse1 = QLabel("Feedback pour la réponse 1 :", self)
self.label_feedback_reponse1.setWordWrap(True)
self.label_feedback_reponse1.setFixedWidth(150)
hbox_feedback_reponse1.addWidget(self.label_feedback_reponse1)
self.lineedit_feedback_reponse1 = QLineEdit(self)
hbox_feedback_reponse1.addWidget(self.lineedit_feedback_reponse1)
hbox_feedback_reponse1.insertSpacing(2,100)
self.label_espace_reponse2 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse2)
hbox_reponse2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse2)
self.label_reponse2 = QLabel("Réponse 2 :", self)
self.label_reponse2.setFixedWidth(150)
hbox_reponse2.addWidget(self.label_reponse2)
self.LineEditReponse2 = QLineEdit(self)
hbox_reponse2.addWidget(self.LineEditReponse2)
self.label_note2 = QLabel("note (%) :",self)
hbox_reponse2.addWidget(self.label_note2)
self.combobox_reponse2 = QComboBox()
self.combobox_reponse2.addItem("100")
self.combobox_reponse2.addItem("75")
self.combobox_reponse2.addItem("66.66")
self.combobox_reponse2.addItem("50")
self.combobox_reponse2.addItem("25")
self.combobox_reponse2.addItem("33.333")
self.combobox_reponse2.addItem("0")
hbox_reponse2.addWidget(self.combobox_reponse2)
hbox_reponse2.insertSpacing(4,70)
hbox_feedback_reponse2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse2)
self.label_feedback_reponse2 = QLabel("Feedback pour la réponse 2 :", self)
self.label_feedback_reponse2.setWordWrap(True)
self.label_feedback_reponse2.setFixedWidth(150)
hbox_feedback_reponse2.addWidget(self.label_feedback_reponse2)
self.lineedit_feedback_reponse2 = QLineEdit(self)
hbox_feedback_reponse2.addWidget(self.lineedit_feedback_reponse2)
hbox_feedback_reponse2.insertSpacing(4,100)
self.label_espace_reponse3 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse3)
hbox_reponse3 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse3)
self.label_reponse3 = QLabel("Réponse 3 :", self)
self.label_reponse3.setFixedWidth(150)
hbox_reponse3.addWidget(self.label_reponse3)
self.LineEditReponse3 = QLineEdit(self)
hbox_reponse3.addWidget(self.LineEditReponse3)
self.label_note3 = QLabel("note (%) :",self)
hbox_reponse3.addWidget(self.label_note3)
self.combobox_reponse3 = QComboBox()
self.combobox_reponse3.addItem("100")
self.combobox_reponse3.addItem("75")
self.combobox_reponse3.addItem("66.66")
self.combobox_reponse3.addItem("50")
self.combobox_reponse3.addItem("25")
self.combobox_reponse3.addItem("33.333")
self.combobox_reponse3.addItem("0")
hbox_reponse3.addWidget(self.combobox_reponse3)
hbox_reponse3.insertSpacing(4,70)
hbox_feedback_reponse3 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse3)
self.label_feedback_reponse3 = QLabel("Feedback pour la réponse 3 :", self)
self.label_feedback_reponse3.setWordWrap(True)
self.label_feedback_reponse3.setFixedWidth(150)
hbox_feedback_reponse3.addWidget(self.label_feedback_reponse3)
self.lineedit_feedback_reponse3 = QLineEdit(self)
hbox_feedback_reponse3.addWidget(self.lineedit_feedback_reponse3)
hbox_feedback_reponse3.insertSpacing(2,100)
self.label_espace_reponse4 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse4)
hbox_reponse4 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse4)
self.label_reponse4 = QLabel("Réponse 4 :", self)
self.label_reponse4.setFixedWidth(150)
hbox_reponse4.addWidget(self.label_reponse4)
self.LineEditReponse4 = QLineEdit(self)
hbox_reponse4.addWidget(self.LineEditReponse4)
self.label_note4 = QLabel("note (%) :",self)
hbox_reponse4.addWidget(self.label_note4)
self.combobox_reponse4 = QComboBox()
self.combobox_reponse4.addItem("100")
self.combobox_reponse4.addItem("75")
self.combobox_reponse4.addItem("66.66")
self.combobox_reponse4.addItem("50")
self.combobox_reponse4.addItem("25")
self.combobox_reponse4.addItem("33.333")
self.combobox_reponse4.addItem("0")
hbox_reponse4.addWidget(self.combobox_reponse4)
hbox_reponse4.insertSpacing(4,70)
hbox_feedback_reponse4 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse4)
self.label_feedback_reponse4 = QLabel("Feedback pour la réponse 4 :", self)
self.label_feedback_reponse4.setWordWrap(True)
self.label_feedback_reponse4.setFixedWidth(150)
hbox_feedback_reponse4.addWidget(self.label_feedback_reponse4)
self.lineedit_feedback_reponse4 = QLineEdit(self)
hbox_feedback_reponse4.addWidget(self.lineedit_feedback_reponse4)
hbox_feedback_reponse4.insertSpacing(2,100)
self.label_espace_feedback = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_feedback)
hbox_feedback_corecte = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_corecte)
self.label_feedback_corecte = QLabel("Feedback réponse \ncorecte :", self)
self.label_feedback_corecte.setWordWrap(True)
self.label_feedback_corecte.setFixedWidth(150)
hbox_feedback_corecte.addWidget(self.label_feedback_corecte)
self.lineedit_feedback_corecte = QLineEdit(self)
hbox_feedback_corecte.addWidget(self.lineedit_feedback_corecte)
hbox_feedback_corecte.insertSpacing(2,100)
hbox_feedback_partiellement_corecte = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_partiellement_corecte)
self.label_feedback_partiellement_corecte = QLabel("Feedback réponse partiellement corecte :", self)
self.label_feedback_partiellement_corecte.setWordWrap(True)
self.label_feedback_partiellement_corecte.setFixedWidth(150)
hbox_feedback_partiellement_corecte.addWidget(self.label_feedback_partiellement_corecte)
self.lineedit_feedback_partiellement_corecte = QLineEdit(self)
hbox_feedback_partiellement_corecte.addWidget(self.lineedit_feedback_partiellement_corecte)
hbox_feedback_partiellement_corecte.insertSpacing(2,100)
hbox_feedback_incorecte = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_incorecte)
self.label_feedback_incorecte = QLabel("Feedback réponse \nincorecte :", self)
self.label_feedback_incorecte.setWordWrap(True)
self.label_feedback_incorecte.setFixedWidth(150)
hbox_feedback_incorecte.addWidget(self.label_feedback_incorecte)
self.lineedit_feedback_incorecte = QLineEdit(self)
hbox_feedback_incorecte.addWidget(self.lineedit_feedback_incorecte)
hbox_feedback_incorecte.insertSpacing(2,100)
self.label_espace_bouton = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_bouton)
hbox_bouton_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_bouton_question)
self.button = QPushButton("créer la question")
self.button.clicked.connect(self.creer_question)
hbox_bouton_question.addWidget(self.button)
hbox_bouton_question.insertSpacing(2,400)
hbox_bouton_question.insertSpacing(0,400)
self.groupBox.setLayout(VBoxLayout)
def creer_question(self):
#Fonction qui va créer un fichier xml en qui correspond à une question 'choix multiple' en prenant en compte toutes les infos dans les champs remplis de la fenêtre
#non du fichier xml que l'on veut creer
file_name = self.lineedit_nom_fichier.text()
file_name_txt = file_name + ".txt"
file_name_xml = file_name + ".XML"
adresse = self.lineedit_adresse.text() + '/'
nom_question = self.lineedit_nom_question.text()
intitule_question = self.textedit_intitule_question.toPlainText()
note_par_defaut = self.lineedit_note_par_defaut.text()
feedback_general = self.lineedit_feedback_general.text()
feedback_corecte = self.lineedit_feedback_corecte.text()
feedback_incorecte = self.lineedit_feedback_incorecte.text()
feedback_partiellement_corecte = self.lineedit_feedback_partiellement_corecte.text()
penalite = str(float(self.combobox_penalite.currentText()) / 100)
une_seule_reponse = ''
if self.combobox_nbreponse.currentIndex() == 0:
une_seule_reponse = 'oui'
reponse1 = self.LineEditReponse1.text()
feedback1 = self.lineedit_feedback_reponse1.text()
pourcentage1 = self.combobox_reponse1.currentText()
reponse2 = self.LineEditReponse2.text()
feedback2 = self.lineedit_feedback_reponse2.text()
pourcentage2 = self.combobox_reponse2.currentText()
reponse3 = self.LineEditReponse3.text()
feedback3 = self.lineedit_feedback_reponse3.text()
pourcentage3 = self.combobox_reponse3.currentText()
reponse4 = self.LineEditReponse4.text()
feedback4 = self.lineedit_feedback_reponse4.text()
pourcentage4 = self.combobox_reponse4.currentText()
reponse5 = ''
feedback5 = ''
pourcentage5 = '0'
reponse6 = ''
feedback6 = ''
pourcentage6 = '0'
melange_reponse = ''
if self.check_melange.isChecked() == True :
melange_reponse = 'oui' #mettre 'oui' si on veut mélanger l'ordre des reponses
numerotation = 'none'
if self.combobox_numerotation.currentIndex() == 0:
numerotation = 'abc'
if self.combobox_numerotation.currentIndex() == 1:
numerotation = '123'
montrer_nombre_correcte = 'oui' # mettre 'oui' si on veut indiquer le nombre de bonne reponses correctes
#'top' va contenir tout le document xml
top = Element('quiz')
#on ajoute toutes les lignes du documents
comment = Comment('question: 0')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','category')
category = SubElement(question,'category')
text = SubElement(category,'text')
text.text = 'top'
comment = Comment('question: numerique')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','multichoice')
name = SubElement(question,'name')
text = SubElement(name,'text')
text.text = nom_question
questiontext = SubElement(question,'questiontext')
questiontext.set('format','html')
text=SubElement(questiontext,'text')
text.text = '<![CDATA[<p>' + intitule_question + '</p>]]>'
generalfeedback = SubElement(question,'generalfeedback')
generalfeedback.set('format','html')
text = SubElement(generalfeedback,'text')
text.text = feedback_general
defaultgrade = SubElement(question,'defaultgrade')
defaultgrade.text = note_par_defaut
penalty = SubElement(question,'penalty')
penalty.text = penalite
hidden= SubElement(question,'hidden')
hidden.text = '0'
single = SubElement(question,'single')
if une_seule_reponse == 'oui':
single.text = 'true'
else:
single.text = 'false'
shuffleanswers = SubElement(question, 'shuffleanswers')
if melange_reponse == 'oui' :
shuffleanswers.text = 'true'
else:
shuffleanswers.text = 'false'
answernumbering = SubElement(question,'answernumbering')
answernumbering.text = numerotation
correctfeedback = SubElement(question,'correctfeedback')
correctfeedback.set('format','html')
text = SubElement(correctfeedback,'text')
text.text = feedback_corecte
partiallycorrectfeedback = SubElement(question,'partiallycorrectfeedback')
partiallycorrectfeedback.set('format','html')
text = SubElement(partiallycorrectfeedback,'text')
text.text = feedback_partiellement_corecte
incorrectfeedback = SubElement(question,'incorrectfeedback')
incorrectfeedback.set('format','html')
text = SubElement(incorrectfeedback,'text')
text.text = feedback_incorecte
if montrer_nombre_correcte == 'oui':
shownumcorrect = SubElement(question,'shownumcorrect')
if reponse1 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage1)
text = SubElement(answer,'text')
text.text = '<![CDATA[<p>' + reponse1 + '</p>]]>'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback1
if reponse2 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage2)
text = SubElement(answer,'text')
text.text ='<![CDATA[<p>' + reponse2 + '</p>]]>'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback2
if reponse3 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage3)
text = SubElement(answer,'text')
text.text ='<![CDATA[<p>' + reponse3 + '</p>]]>'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback3
if reponse4 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage4)
text = SubElement(answer,'text')
text.text ='<![CDATA[<p>' + reponse4 + '</p>]]>'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback4
if reponse5 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage5)
text = SubElement(answer,'text')
text.text ='<![CDATA[<p>' + reponse5 + '</p>]]>'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback5
if reponse6 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage6)
text = SubElement(answer,'text')
text.text = '<![CDATA[<p>' + reponse6 + '</p>]]>'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback6
#on cree un fichier txt qui contient toute les lignes du fichier xml que l'on va creer
fichier = open(adresse + file_name_txt, "w")
fichier.write(prettify(top))
fichier.close()
#on rajoute ' encoding="UTF-8" ' dans la premiere ligne
fichier = open(adresse + file_name_txt, "r")
lignes= fichier.readlines()
fichier = open(adresse + file_name_txt, "w")
lignes[0] = '<?xml version="1.0" encoding="UTF-8"?>\n'
fichier.writelines(lignes)
fichier.close()
#on remplace les &lt; et les &gt; par < et > dans le fichier
f=open(adresse + file_name_txt,'r')
chaine=f.read().replace('&lt;','<')
chaine = chaine.replace ('&gt;','>')
f.close()
f=open(adresse + file_name_txt,'w')
f.write(chaine)
f.close()
#on transforme le fichier txt en fichier xml
if os.path.exists(adresse + file_name_xml):
os.remove(adresse + file_name_xml)
os.rename(adresse + file_name_txt, adresse + file_name_xml)
#fonction qui permet de mettre en forme le fichier xml avec les indexations
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
''' Fenêtre qui sert à créer/modifier les question de type 'numériques' '''
from PySide2.QtWidgets import QApplication, QWidget , QVBoxLayout, QHBoxLayout, QPushButton, QGroupBox, QTextEdit, QLineEdit, QComboBox, QLabel, QCheckBox, QScrollBar, QScrollArea
from PySide2.QtGui import QIcon, QFont
from PySide2 import QtCore
import os, sys
from xml.etree import ElementTree as ET
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, Comment
class Window_numerique(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Numérique")
self.setGeometry(500,500,500,500)
self.createVBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.groupBox)
self.setLayout(vbox)
def createVBoxLayout(self):
self.groupBox = QGroupBox("Type de question : Numérique")
VBoxLayout = QVBoxLayout()
hbox_adresse = QHBoxLayout()
VBoxLayout.addLayout(hbox_adresse)
self.label_adresse = QLabel("adresse du fichier",self)
self.label_adresse.setFixedWidth(150)
hbox_adresse.addWidget(self.label_adresse)
self.lineedit_adresse = QLineEdit(self)
self.lineedit_adresse.setText(os.getcwd())
hbox_adresse.addWidget(self.lineedit_adresse)
hbox_adresse.insertSpacing(2,400)
scrollbar = QScrollArea()
scrollbar.setLayout(VBoxLayout)
hbox_nom_fichier = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_fichier)
self.label_nom_fichier = QLabel("Nom fichier :",self)
self.label_nom_fichier.setFixedWidth(150)
hbox_nom_fichier.addWidget(self.label_nom_fichier)
self.lineedit_nom_fichier = QLineEdit(self)
hbox_nom_fichier.addWidget(self.lineedit_nom_fichier)
hbox_nom_fichier.insertSpacing(2,400)
hbox_nom_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_question)
self.label_nom_question = QLabel("Nom question :",self)
self.label_nom_question.setFixedWidth(150)
hbox_nom_question.addWidget(self.label_nom_question)
self.lineedit_nom_question = QLineEdit(self)
hbox_nom_question.addWidget(self.lineedit_nom_question)
hbox_nom_question.insertSpacing(2,400)
hbox_intitule_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_intitule_question)
self.label_intitule_question = QLabel("Intitulé de la question :", self)
self.label_intitule_question.setFixedWidth(150)
self.label_intitule_question.setWordWrap(True)
hbox_intitule_question.addWidget(self.label_intitule_question)
self.textedit_intitule_question = QTextEdit(self)
self.textedit_intitule_question.setFixedHeight(150)
hbox_intitule_question.addWidget(self.textedit_intitule_question)
hbox_intitule_question.insertSpacing(2,100)
hbox_note_defaut = QHBoxLayout()
VBoxLayout.addLayout(hbox_note_defaut)
self.label_note_par_defaut = QLabel("Note par défaut :", self)
self.label_note_par_defaut.setFixedWidth(150)
hbox_note_defaut.addWidget(self.label_note_par_defaut)
self.lineedit_note_par_defaut = QLineEdit(self)
hbox_note_defaut.addWidget(self.lineedit_note_par_defaut)
hbox_note_defaut.insertSpacing(2,700)
hbox_penalite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite)
self.label_penalite = QLabel("pénalité :", self)
self.label_penalite.setFixedWidth(150)
hbox_penalite.addWidget(self.label_penalite)
self.combobox_penalite = QComboBox()
self.combobox_penalite.addItem("100")
self.combobox_penalite.addItem("75")
self.combobox_penalite.addItem("66.66")
self.combobox_penalite.addItem("50")
self.combobox_penalite.addItem("25")
self.combobox_penalite.addItem("33.333")
self.combobox_penalite.addItem("0")
hbox_penalite.addWidget(self.combobox_penalite)
hbox_penalite.insertSpacing(2,1000)
hbox_feedbackgeneral = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedbackgeneral)
self.label_feedbackgeneral = QLabel("Feedback general :", self)
self.label_feedbackgeneral.setFixedWidth(150)
hbox_feedbackgeneral.addWidget(self.label_feedbackgeneral)
self.lineedit_feedback_general = QLineEdit(self)
hbox_feedbackgeneral.addWidget(self.lineedit_feedback_general)
hbox_feedbackgeneral.insertSpacing(2,100)
self.label_espace_reponse1 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse1)
hbox_reponse1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse1)
self.label_reponse1 = QLabel("Réponse 1 :", self)
self.label_reponse1.setFixedWidth(150)
hbox_reponse1.addWidget(self.label_reponse1)
self.LineEditReponse1 = QLineEdit(self)
hbox_reponse1.addWidget(self.LineEditReponse1)
self.label_note1 = QLabel("note (%) :",self)
hbox_reponse1.addWidget(self.label_note1)
self.combobox_reponse1 = QComboBox()
self.combobox_reponse1.addItem("100")
self.combobox_reponse1.addItem("75")
self.combobox_reponse1.addItem("66.66")
self.combobox_reponse1.addItem("50")
self.combobox_reponse1.addItem("25")
self.combobox_reponse1.addItem("33.333")
self.combobox_reponse1.addItem("0")
hbox_reponse1.addWidget(self.combobox_reponse1)
self.label_erreur_reponse1 = QLabel("erreur :",self)
hbox_reponse1.addWidget(self.label_erreur_reponse1)
self.lineedit_erreur_reponse1 = QLineEdit(self)
hbox_reponse1.addWidget(self.lineedit_erreur_reponse1)
hbox_reponse1.insertSpacing(6,70)
hbox_reponse1.insertSpacing(4,70)
hbox_reponse1.insertSpacing(2,70)
hbox_feedback_reponse1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse1)
self.label_feedback_reponse1 = QLabel("Feedback pour la réponse 1 :", self)
self.label_feedback_reponse1.setWordWrap(True)
self.label_feedback_reponse1.setFixedWidth(150)
hbox_feedback_reponse1.addWidget(self.label_feedback_reponse1)
self.lineedit_feedback_reponse1 = QLineEdit(self)
hbox_feedback_reponse1.addWidget(self.lineedit_feedback_reponse1)
hbox_feedback_reponse1.insertSpacing(2,100)
self.label_espace_reponse2 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse2)
hbox_reponse2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse2)
self.label_reponse2 = QLabel("Réponse 2 :", self)
self.label_reponse2.setFixedWidth(150)
hbox_reponse2.addWidget(self.label_reponse2)
self.LineEditReponse2 = QLineEdit(self)
hbox_reponse2.addWidget(self.LineEditReponse2)
self.label_note2 = QLabel("note (%) :",self)
hbox_reponse2.addWidget(self.label_note2)
self.combobox_reponse2 = QComboBox()
self.combobox_reponse2.addItem("100")
self.combobox_reponse2.addItem("75")
self.combobox_reponse2.addItem("66.66")
self.combobox_reponse2.addItem("50")
self.combobox_reponse2.addItem("25")
self.combobox_reponse2.addItem("33.333")
self.combobox_reponse2.addItem("0")
hbox_reponse2.addWidget(self.combobox_reponse2)
self.label_erreur_reponse2 = QLabel("erreur :",self)
hbox_reponse2.addWidget(self.label_erreur_reponse2)
self.lineedit_erreur_reponse2 = QLineEdit(self)
hbox_reponse2.addWidget(self.lineedit_erreur_reponse2)
hbox_reponse2.insertSpacing(6,70)
hbox_reponse2.insertSpacing(4,70)
hbox_reponse2.insertSpacing(2,70)
hbox_feedback_reponse2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse2)
self.label_feedback_reponse2 = QLabel("Feedback pour la réponse 2 :", self)
self.label_feedback_reponse2.setWordWrap(True)
self.label_feedback_reponse2.setFixedWidth(150)
hbox_feedback_reponse2.addWidget(self.label_feedback_reponse2)
self.lineedit_feedback_reponse2 = QLineEdit(self)
hbox_feedback_reponse2.addWidget(self.lineedit_feedback_reponse2)
hbox_feedback_reponse2.insertSpacing(4,100)
self.label_espace_unite = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_unite)
hbox_traitementunite = QHBoxLayout()
VBoxLayout.addLayout(hbox_traitementunite)
self.labeltraitementunite = QLabel("traitement de l'unité",self)
self.labeltraitementunite.setFixedWidth(150)
hbox_traitementunite.addWidget(self.labeltraitementunite)
self.combobox_traitementunite = QComboBox(self)
self.combobox_traitementunite.addItem("les unités ne sont pas utilisées. Seule la valeur numérique est évaluée")
self.combobox_traitementunite.addItem("les unités sont optionnelles. Si une unité est saisie elle est utilisée pour la conversion vers l'unité 1 ")
self.combobox_traitementunite.addItem("l'unite doit être indiquée et sera prise en compte dans la note")
hbox_traitementunite.addWidget(self.combobox_traitementunite)
hbox_traitementunite.insertSpacing(2,400)
hbox_penalite_unite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite_unite)
self.label_penalite_unite = QLabel("pénalité unité \n(fraction entre 0 et 1)",self)
self.label_penalite_unite.setFixedWidth(150)
hbox_penalite_unite.addWidget(self.label_penalite_unite)
self.lineedit_penalite_unite = QLineEdit(self)
self.lineedit_penalite_unite.setEnabled(False)
hbox_penalite_unite.addWidget(self.lineedit_penalite_unite)
hbox_penalite_unite.insertSpacing(2,700)
hbox_selection_unites = QHBoxLayout()
VBoxLayout.addLayout(hbox_selection_unites)
self.label_selection_unite = QLabel("les unités sont saisie en utilisant",self)
self.label_selection_unite.setFixedWidth(150)
self.label_selection_unite.setWordWrap(True)
hbox_selection_unites.addWidget(self.label_selection_unite)
self.combobox_selection_unite = QComboBox()
self.combobox_selection_unite.addItem("la zone de saisie")
self.combobox_selection_unite.addItem("une sélection de choix multiple")
self.combobox_selection_unite.addItem("un menu déroulant")
self.combobox_selection_unite.setEnabled(False)
hbox_selection_unites.addWidget(self.combobox_selection_unite)
hbox_selection_unites.insertSpacing(2,700)
hbox_position_unite = QHBoxLayout()
VBoxLayout.addLayout(hbox_position_unite)
self.label_position_unite = QLabel("position de l'unité",self)
self.label_position_unite.setFixedWidth(150)
hbox_position_unite.addWidget(self.label_position_unite)
self.combobox_position_unite = QComboBox()
self.combobox_position_unite.addItem("à droite, comme 12.5 cm ou 10.5 Km")
self.combobox_position_unite.addItem("à gauche, comme $ 1.5 ou £ 2.5")
self.combobox_position_unite.setEnabled(False)
hbox_position_unite.addWidget(self.combobox_position_unite)
hbox_position_unite.insertSpacing(2,700)
hbox_unite1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_unite1)
self.label_unite1 = QLabel("unité 1", self)
self.label_unite1.setFixedWidth(150)
hbox_unite1.addWidget(self.label_unite1)
self.lineedit_unite1 = QLineEdit(self)
self.lineedit_unite1.setEnabled(False)
hbox_unite1.addWidget(self.lineedit_unite1)
self.label_coef1 = QLabel("Coefficient")
self.label_coef1.setFixedWidth(90)
hbox_unite1.addWidget(self.label_coef1)
self.lineedit_coef1 = QLineEdit(self)
self.lineedit_coef1.setEnabled(False)
hbox_unite1.addWidget(self.lineedit_coef1)
hbox_unite1.insertSpacing(2,200)
hbox_unite1.insertSpacing(5,200)
hbox_unite2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_unite2)
self.label_unite2 = QLabel("unité 2", self)
self.label_unite2.setFixedWidth(150)
hbox_unite2.addWidget(self.label_unite2)
self.lineedit_unite2 = QLineEdit(self)
self.lineedit_unite2.setEnabled(False)
hbox_unite2.addWidget(self.lineedit_unite2)
self.label_coef2 = QLabel("Coefficient")
self.label_coef2.setFixedWidth(90)
hbox_unite2.addWidget(self.label_coef2)
self.lineedit_coef2 = QLineEdit(self)
self.lineedit_coef2.setEnabled(False)
hbox_unite2.addWidget(self.lineedit_coef2)
hbox_unite2.insertSpacing(2,200)
hbox_unite2.insertSpacing(5,200)
self.label_espace_bouton = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_bouton)
hbox_bouton_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_bouton_question)
self.button = QPushButton("créer la question")
self.button.clicked.connect(self.creer_question)
hbox_bouton_question.addWidget(self.button)
hbox_bouton_question.insertSpacing(2,400)
hbox_bouton_question.insertSpacing(0,400)
self.combobox_traitementunite.currentIndexChanged.connect(self.traitement_unite)
self.groupBox.setLayout(VBoxLayout)
def traitement_unite(self,index):
#Fonction qui permet de rendre actif/inactif certains champs en fonction du traitement de l'unité (comme sur Celene)
if self.combobox_traitementunite.currentIndex() == 0:
self.lineedit_penalite_unite.setEnabled(False)
self.lineedit_penalite_unite.setText("")
self.combobox_selection_unite.setEnabled(False)
self.combobox_position_unite.setEnabled(False)
self.lineedit_unite1.setEnabled(False)
self.lineedit_unite1.setText("")
self.lineedit_coef1.setEnabled(False)
self.lineedit_coef1.setText("")
self.lineedit_unite2.setEnabled(False)
self.lineedit_unite2.setText("")
self.lineedit_coef2.setEnabled(False)
self.lineedit_coef2.setText("")
if self.combobox_traitementunite.currentIndex() == 1:
self.lineedit_penalite_unite.setEnabled(False)
self.lineedit_penalite_unite.setText("")
self.combobox_selection_unite.setEnabled(False)
self.combobox_position_unite.setEnabled(True)
self.lineedit_unite1.setEnabled(True)
self.lineedit_coef1.setEnabled(True)
self.lineedit_unite2.setEnabled(True)
self.lineedit_coef2.setEnabled(True)
if self.combobox_traitementunite.currentIndex() == 2:
self.lineedit_penalite_unite.setEnabled(True)
self.combobox_selection_unite.setEnabled(True)
self.combobox_position_unite.setEnabled(True)
self.lineedit_unite1.setEnabled(True)
self.lineedit_coef1.setEnabled(True)
self.lineedit_unite2.setEnabled(True)
self.lineedit_coef2.setEnabled(True)
def creer_question(self):
#Fonction qui va créer un fichier xml en qui correspond à une question 'numérique' en prenant en compte toutes les infos dans les champs remplis de la fenêtre
#non du fichier xml que l'on veut creer
file_name = self.lineedit_nom_fichier.text()
file_name_txt = file_name + ".txt"
file_name_xml = file_name + ".XML"
adresse = self.lineedit_adresse.text() + '/'
nom_question = self.lineedit_nom_question.text()
intitule_question = self.textedit_intitule_question.toPlainText()
note_par_defaut = self.lineedit_note_par_defaut.text()
feedback_general = self.lineedit_feedback_general.text()
penalite = str(float(self.combobox_penalite.currentText()) / 100)
reponse1 = self.LineEditReponse1.text()
tolerance1 = self.lineedit_erreur_reponse1.text()
pourcentage1 = self.combobox_reponse1.currentText()
feedback_reponse1 = self.lineedit_feedback_reponse1.text()
reponse2 = self.LineEditReponse2.text()
tolerance2 = self.lineedit_erreur_reponse2.text()
pourcentage2 = self.combobox_reponse2.currentText()
feedback_reponse2 = self.lineedit_feedback_reponse2.text()
traitement_unite = 'sans' # mettre 'avec', 'optionnel' ou 'sans'
if self.combobox_traitementunite.currentIndex() == 1 :
traitement_unite = 'optionnel'
if self.combobox_traitementunite.currentIndex() == 2 :
traitement_unite = 'avec'
penalite_unite = self.lineedit_penalite_unite.text()
saisie_unite = 'texte' # mettre 'texte', 'menu', ou 'selection'
if self.combobox_selection_unite.currentIndex() == 1:
saisie_unite = 'selection'
if self.combobox_selection_unite.currentIndex() == 2:
saisie_unite = 'menu'
position_unite = 'R' # mettre 'R' ou 'L'
if self.combobox_position_unite.currentIndex() == 1 :
position_unite = 'L'
unite1 = self.lineedit_unite1.text()
coef1 = self.lineedit_coef1.text()
unite2 = self.lineedit_unite2.text()
coef2 = self.lineedit_coef2.text()
#'top' va contenir tout le document xml
top = Element('quiz')
#on ajoute toutes les lignes du documents
comment = Comment('question: 0')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','category')
category = SubElement(question,'category')
text = SubElement(category,'text')
text.text = 'top'
comment = Comment('question: numerique')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','numerical')
name = SubElement(question,'name')
text = SubElement(name,'text')
text.text = nom_question
questiontext = SubElement(question,'questiontext')
questiontext.set('format','html')
text=SubElement(questiontext,'text')
text.text = '<![CDATA[<p>' + intitule_question + '</p>]]>'
generalfeedback = SubElement(question,'generalfeedback')
generalfeedback.set('format','html')
text = SubElement(generalfeedback,'text')
text.text = feedback_general
defaultgrade = SubElement(question,'defaultgrade')
defaultgrade.text = note_par_defaut
penalty = SubElement(question,'penalty')
penalty.text = penalite
hidden= SubElement(question,'hidden')
hidden.text = '0'
if reponse1 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage1)
text = SubElement(answer,'text')
text.text = reponse1
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback_reponse1
tolerance = SubElement(answer,'tolerance')
tolerance.text = tolerance1
if reponse2 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage2)
text = SubElement(answer,'text')
text.text = reponse2
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback_reponse2
tolerance = SubElement(answer,'tolerance')
tolerance.text = tolerance2
units=SubElement(question,'units')
if unite1 != '':
unit = SubElement(units,'unit')
multiplier = SubElement(unit,'multiplier')
multiplier.text = coef1
unit_name = SubElement(unit,'unit_name')
unit_name.text = unite1
if unite2 != '':
unit = SubElement(units,'unit')
multiplier = SubElement(unit,'multiplier')
multiplier.text = coef2
unit_name = SubElement(unit,'unit_name')
unit_name.text = unite2
if traitement_unite == 'sans' :
unitgradingtype = SubElement(question,'unitgradingtype')
unitgradingtype.text = '0'
unitpenalty = SubElement(question,'unitpenalty')
unitpenalty.text = '0.1'
if traitement_unite == 'optionnel' :
unitgradingtype = SubElement(question,'unitgradingtype')
unitgradingtype.text = '0'
unitpenalty = SubElement(question,'unitpenalty')
unitpenalty.text = '0.1'
if traitement_unite == 'avec' :
unitgradingtype = SubElement(question,'unitgradingtype')
unitgradingtype.text = '2'
unitpenalty = SubElement(question,'unitpenalty')
unitpenalty.text = penalite_unite
if saisie_unite == 'texte' :
showunits = SubElement(question,'showunits')
showunits.text = '0'
if saisie_unite == 'selection' :
showunits = SubElement(question,'showunits')
showunits.text = '1'
if saisie_unite == 'menu' :
showunits = SubElement(question,'showunits')
showunits.text = '2'
if traitement_unite == 'sans':
showunits = SubElement(question,'showunits')
showunits.text = '3'
if position_unite == 'L':
unitsleft = SubElement(question,'unitsleft')
unitsleft.text = '1'
else :
unitsleft = SubElement(question,'unitsleft')
unitsleft.text = '0'
#on cree un fichier txt qui contient toute les lignes du fichier xml que l'on va creer
fichier = open(adresse + file_name_txt, "w")
fichier.write(prettify(top))
fichier.close()
#on rajoute ' encoding="UTF-8" ' dans la premiere ligne
fichier = open(adresse + file_name_txt, "r")
lignes= fichier.readlines()
fichier = open(adresse + file_name_txt, "w")
lignes[0] = '<?xml version="1.0" encoding="UTF-8"?>\n'
fichier.writelines(lignes)
fichier.close()
#on remplace les &lt; et les &gt; par < et > dans le fichier
f=open(adresse + file_name_txt,'r')
chaine=f.read().replace('&lt;','<')
chaine = chaine.replace ('&gt;','>')
f.close()
f=open(adresse + file_name_txt,'w')
f.write(chaine)
f.close()
#on transforme le fichier txt en fichier xml
if os.path.exists(adresse + file_name_xml):
os.remove(adresse + file_name_xml)
os.rename(adresse + file_name_txt, adresse + file_name_xml)
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
''' Fenêtre qui sert à créer/modifier les question de type 'réponse courte' '''
from PySide2.QtWidgets import QApplication, QWidget , QVBoxLayout, QHBoxLayout, QPushButton, QGroupBox, QTextEdit, QLineEdit, QComboBox, QLabel, QCheckBox, QScrollBar, QScrollArea
from PySide2.QtGui import QIcon, QFont
from PySide2 import QtCore
import os, sys
from xml.etree import ElementTree as ET
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, Comment
class Window_reponsecourte(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Réponse courte")
self.setGeometry(500,500,500,500)
self.createVBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.groupBox)
self.setLayout(vbox)
def createVBoxLayout(self):
self.groupBox = QGroupBox("Type de question : réponse courte")
VBoxLayout = QVBoxLayout()
hbox_adresse = QHBoxLayout()
VBoxLayout.addLayout(hbox_adresse)
self.label_adresse = QLabel("adresse du fichier",self)
self.label_adresse.setFixedWidth(150)
hbox_adresse.addWidget(self.label_adresse)
self.lineedit_adresse = QLineEdit(self)
self.lineedit_adresse.setText(os.getcwd())
hbox_adresse.addWidget(self.lineedit_adresse)
hbox_adresse.insertSpacing(2,400)
hbox_nom_fichier = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_fichier)
self.label_nom_fichier = QLabel("Nom fichier :",self)
self.label_nom_fichier.setFixedWidth(150)
hbox_nom_fichier.addWidget(self.label_nom_fichier)
self.lineedit_nom_fichier = QLineEdit(self)
hbox_nom_fichier.addWidget(self.lineedit_nom_fichier)
hbox_nom_fichier.insertSpacing(2,400)
hbox_nom_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_question)
self.label_nom_question = QLabel("Nom question :",self)
self.label_nom_question.setFixedWidth(150)
hbox_nom_question.addWidget(self.label_nom_question)
self.lineedit_nom_question = QLineEdit(self)
hbox_nom_question.addWidget(self.lineedit_nom_question)
hbox_nom_question.insertSpacing(2,400)
hbox_intitule_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_intitule_question)
self.label_intitule_question = QLabel("Intitulé de la question :", self)
self.label_intitule_question.setFixedWidth(150)
self.label_intitule_question.setWordWrap(True)
hbox_intitule_question.addWidget(self.label_intitule_question)
self.textedit_intitule_question = QTextEdit(self)
self.textedit_intitule_question.setFixedHeight(150)
hbox_intitule_question.addWidget(self.textedit_intitule_question)
hbox_intitule_question.insertSpacing(2,100)
hbox_note_defaut = QHBoxLayout()
VBoxLayout.addLayout(hbox_note_defaut)
self.label_note_par_defaut = QLabel("Note par défaut :", self)
self.label_note_par_defaut.setFixedWidth(150)
hbox_note_defaut.addWidget(self.label_note_par_defaut)
self.lineedit_note_par_defaut = QLineEdit(self)
hbox_note_defaut.addWidget(self.lineedit_note_par_defaut)
hbox_note_defaut.insertSpacing(2,600)
hbox_penalite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite)
self.label_penalite = QLabel("pénalité :", self)
self.label_penalite.setFixedWidth(150)
hbox_penalite.addWidget(self.label_penalite)
self.combobox_penalite = QComboBox()
self.combobox_penalite.addItem("100")
self.combobox_penalite.addItem("75")
self.combobox_penalite.addItem("66.66")
self.combobox_penalite.addItem("50")
self.combobox_penalite.addItem("25")
self.combobox_penalite.addItem("33.333")
self.combobox_penalite.addItem("0")
hbox_penalite.addWidget(self.combobox_penalite)
hbox_penalite.insertSpacing(2,1000)
hbox_feedbackgeneral = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedbackgeneral)
self.label_feedbackgeneral = QLabel("Feedback general :", self)
self.label_feedbackgeneral.setFixedWidth(150)
hbox_feedbackgeneral.addWidget(self.label_feedbackgeneral)
self.lineedit_feedback_general = QLineEdit(self)
hbox_feedbackgeneral.addWidget(self.lineedit_feedback_general)
hbox_feedbackgeneral.insertSpacing(2,100)
hbox_maj = QHBoxLayout()
VBoxLayout.addLayout(hbox_maj)
self.label_maj = QLabel("sensible à la case :",self)
self.label_maj.setFixedWidth(150)
hbox_maj.addWidget(self.label_maj)
self.combobox_maj = QComboBox()
self.combobox_maj.addItem("non, la case n'est pas importante")
self.combobox_maj.addItem("oui la case doit correspondre")
hbox_maj.addWidget(self.combobox_maj)
hbox_maj.insertSpacing(2,450)
self.label_espace_reponse1 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse1)
hbox_reponse1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse1)
self.label_reponse1 = QLabel("Réponse 1 :", self)
self.label_reponse1.setFixedWidth(150)
hbox_reponse1.addWidget(self.label_reponse1)
self.LineEditReponse1 = QLineEdit(self)
hbox_reponse1.addWidget(self.LineEditReponse1)
self.label_note1 = QLabel("note (%) :",self)
hbox_reponse1.addWidget(self.label_note1)
self.combobox_reponse1 = QComboBox()
self.combobox_reponse1.addItem("100")
self.combobox_reponse1.addItem("75")
self.combobox_reponse1.addItem("66.66")
self.combobox_reponse1.addItem("50")
self.combobox_reponse1.addItem("25")
self.combobox_reponse1.addItem("33.333")
self.combobox_reponse1.addItem("0")
hbox_reponse1.addWidget(self.combobox_reponse1)
hbox_reponse1.insertSpacing(4,70)
hbox_feedback_reponse1 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse1)
self.label_feedback_reponse1 = QLabel("Feedback pour la réponse 1 :", self)
self.label_feedback_reponse1.setWordWrap(True)
self.label_feedback_reponse1.setFixedWidth(150)
hbox_feedback_reponse1.addWidget(self.label_feedback_reponse1)
self.lineedit_feedback_reponse1 = QLineEdit(self)
hbox_feedback_reponse1.addWidget(self.lineedit_feedback_reponse1)
hbox_feedback_reponse1.insertSpacing(2,100)
self.label_espace_reponse2 = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_reponse2)
hbox_reponse2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_reponse2)
self.label_reponse2 = QLabel("Réponse 2 :", self)
self.label_reponse2.setFixedWidth(150)
hbox_reponse2.addWidget(self.label_reponse2)
self.LineEditReponse2 = QLineEdit(self)
hbox_reponse2.addWidget(self.LineEditReponse2)
self.label_note2 = QLabel("note (%) :",self)
hbox_reponse2.addWidget(self.label_note2)
self.combobox_reponse2 = QComboBox()
self.combobox_reponse2.addItem("100")
self.combobox_reponse2.addItem("75")
self.combobox_reponse2.addItem("66.66")
self.combobox_reponse2.addItem("50")
self.combobox_reponse2.addItem("25")
self.combobox_reponse2.addItem("33.333")
self.combobox_reponse2.addItem("0")
hbox_reponse2.addWidget(self.combobox_reponse2)
hbox_reponse2.insertSpacing(4,70)
hbox_feedback_reponse2 = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_reponse2)
self.label_feedback_reponse2 = QLabel("Feedback pour la réponse 2 :", self)
self.label_feedback_reponse2.setWordWrap(True)
self.label_feedback_reponse2.setFixedWidth(150)
hbox_feedback_reponse2.addWidget(self.label_feedback_reponse2)
self.lineedit_feedback_reponse2 = QLineEdit(self)
hbox_feedback_reponse2.addWidget(self.lineedit_feedback_reponse2)
hbox_feedback_reponse2.insertSpacing(4,100)
self.label_espace_bouton = QLabel("",self)
VBoxLayout.addWidget(self.label_espace_bouton)
hbox_bouton_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_bouton_question)
self.button = QPushButton("créer la question")
self.button.clicked.connect(self.creer_question)
hbox_bouton_question.addWidget(self.button)
hbox_bouton_question.insertSpacing(2,400)
hbox_bouton_question.insertSpacing(0,400)
self.groupBox.setLayout(VBoxLayout)
def creer_question(self):
#Fonction qui va créer un fichier xml en qui correspond à une question 'réponse courte' en prenant en compte toutes les infos dans les champs remplis de la fenêtre
#non du fichier xml que l'on veut creer
file_name = self.lineedit_nom_fichier.text()
file_name_txt = file_name + ".txt"
file_name_xml = file_name + ".XML"
adresse = self.lineedit_adresse.text() + '/'
nom_question = self.lineedit_nom_question.text()
intitule_question = self.textedit_intitule_question.toPlainText()
note_par_defaut = self.lineedit_note_par_defaut.text()
feedback_general = self.lineedit_feedback_general.text()
penalite = str(float(self.combobox_penalite.currentText()) / 100)
reponse1 = self.LineEditReponse1.text()
feedback1 = self.lineedit_feedback_reponse1.text()
pourcentage1 = self.combobox_reponse1.currentText()
reponse2 = self.LineEditReponse2.text()
feedback2 = self.lineedit_feedback_reponse2.text()
pourcentage2 = self.combobox_reponse2.currentText()
reponse3 = ''
feedback3 = ''
pourcentage3 = ''
majuscule = ''
if self.combobox_maj.currentIndex() == 1 :
majuscule = 'oui' # mettre 'oui' si on veut prendre en compte les majuscules dans la réponse
#'top' va contenir tout le document xml
top = Element('quiz')
#on ajoute toutes les lignes du documents
comment = Comment('question: 0')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','category')
category = SubElement(question,'category')
text = SubElement(category,'text')
text.text = 'top'
comment = Comment('question: reponse courte')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','shortanswer')
name = SubElement(question,'name')
text = SubElement(name,'text')
text.text = nom_question
questiontext = SubElement(question,'questiontext')
questiontext.set('format','html')
text=SubElement(questiontext,'text')
text.text = '<![CDATA[<p>' + intitule_question + '</p>]]>'
generalfeedback = SubElement(question,'generalfeedback')
generalfeedback.set('format','html')
text = SubElement(generalfeedback,'text')
text.text = feedback_general
defaultgrade = SubElement(question,'defaultgrade')
defaultgrade.text = note_par_defaut
penalty = SubElement(question,'penalty')
penalty.text = penalite
hidden= SubElement(question,'hidden')
hidden.text = '0'
usecase = SubElement(question,'usecase')
if majuscule == 'oui' :
usecase.text = '1'
else :
usecase.text = '0'
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage1)
answer.set('format','moodle_auto_format')
text = SubElement(answer,'text')
text.text = reponse1
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback1
if reponse2 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage2)
answer.set('format','moodle_auto_format')
text = SubElement(answer,'text')
text.text = reponse2
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback2
if reponse3 != '' :
answer = SubElement(question,'answer')
answer.set('fraction',pourcentage3)
answer.set('format','moodle_auto_format')
text = SubElement(answer,'text')
text.text = reponse3
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback3
#on cree un fichier txt qui contient toute les lignes du fichier xml que l'on va creer
fichier = open(adresse + file_name_txt, "w")
fichier.write(prettify(top))
fichier.close()
#on rajoute ' encoding="UTF-8" ' dans la premiere ligne
fichier = open(adresse + file_name_txt, "r")
lignes= fichier.readlines()
fichier = open(adresse + file_name_txt, "w")
lignes[0] = '<?xml version="1.0" encoding="UTF-8"?>\n'
fichier.writelines(lignes)
fichier.close()
#on remplace les &lt; et les &gt; par < et > dans le fichier
f=open(adresse + file_name_txt,'r')
chaine=f.read().replace('&lt;','<')
chaine = chaine.replace ('&gt;','>')
f.close()
f=open(adresse + file_name_txt,'w')
f.write(chaine)
f.close()
#on transforme le fichier txt en fichier xml
if os.path.exists(adresse + file_name_xml):
os.remove(adresse + file_name_xml)
os.rename(adresse + file_name_txt, adresse + file_name_xml)
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
''' Fenêtre qui sert à créer/modifier les question de type 'vrai faux' '''
from PySide2.QtWidgets import QApplication, QWidget , QVBoxLayout, QHBoxLayout, QBoxLayout, QPushButton, QGroupBox, QGridLayout, QTextEdit, QLineEdit, QComboBox, QMessageBox, QLabel, QSpacerItem
from PySide2.QtGui import QIcon, QFont
import os, sys
import os.path
from xml.etree import ElementTree as ET
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, Comment
class Window_vraifaux(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Vrai-Faux")
self.setGeometry(900,900,900,900)
self.createVBoxLayout()
vbox = QVBoxLayout()
vbox.addWidget(self.groupBox)
self.setLayout(vbox)
#self.show()
def createVBoxLayout(self):
self.groupBox = QGroupBox("Type de question : vrai faux")
VBoxLayout = QVBoxLayout()
hbox_adresse = QHBoxLayout()
VBoxLayout.addLayout(hbox_adresse)
self.label_adresse = QLabel("adresse du fichier",self)
self.label_adresse.setFixedWidth(150)
hbox_adresse.addWidget(self.label_adresse)
self.lineedit_adresse = QLineEdit(self)
self.lineedit_adresse.setText(os.getcwd())
hbox_adresse.addWidget(self.lineedit_adresse)
hbox_adresse.insertSpacing(2,400)
hbox_nom_fichier = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_fichier)
self.label_nom_fichier = QLabel("Nom fichier :",self)
self.label_nom_fichier.setFixedWidth(150)
hbox_nom_fichier.addWidget(self.label_nom_fichier)
self.lineedit_nom_fichier = QLineEdit(self)
hbox_nom_fichier.addWidget(self.lineedit_nom_fichier)
hbox_nom_fichier.insertSpacing(2,400)
hbox_nom_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_nom_question)
self.label_nom_question = QLabel("Nom question :",self)
self.label_nom_question.setFixedWidth(150)
hbox_nom_question.addWidget(self.label_nom_question)
self.lineedit_nom_question = QLineEdit(self)
#self.lineedit_nom_question.setFixedWidth(500)
hbox_nom_question.addWidget(self.lineedit_nom_question)
hbox_nom_question.insertSpacing(2,400)
hbox_intitule_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_intitule_question)
self.label_intitule_question = QLabel("Intitulé de la question :", self)
self.label_intitule_question.setFixedWidth(150)
self.label_intitule_question.setWordWrap(True)
hbox_intitule_question.addWidget(self.label_intitule_question)
self.textedit_intitule_question = QTextEdit(self)
self.textedit_intitule_question.setFixedHeight(150)
hbox_intitule_question.addWidget(self.textedit_intitule_question)
hbox_intitule_question.insertSpacing(2,100)
hbox_bonne_reponse = QHBoxLayout()
VBoxLayout.addLayout(hbox_bonne_reponse)
self.label_vraifaux = QLabel("Bonne réponse :", self)
self.label_vraifaux.setFixedWidth(150)
hbox_bonne_reponse.addWidget(self.label_vraifaux)
self.combobox_vraifaux = QComboBox()
self.combobox_vraifaux.addItem("Vrai")
self.combobox_vraifaux.addItem("Faux")
hbox_bonne_reponse.addWidget(self.combobox_vraifaux)
hbox_bonne_reponse.insertSpacing(2,1000)
hbox_note_defaut = QHBoxLayout()
VBoxLayout.addLayout(hbox_note_defaut)
self.label_note_par_defaut = QLabel("Note par défaut :", self)
self.label_note_par_defaut.setFixedWidth(150)
hbox_note_defaut.addWidget(self.label_note_par_defaut)
self.lineedit_note_par_defaut = QLineEdit(self)
hbox_note_defaut.addWidget(self.lineedit_note_par_defaut)
hbox_note_defaut.insertSpacing(2,700)
hbox_penalite = QHBoxLayout()
VBoxLayout.addLayout(hbox_penalite)
self.label_penalite = QLabel("pénalité :", self)
self.label_penalite.setFixedWidth(150)
hbox_penalite.addWidget(self.label_penalite)
self.combobox_penalite = QComboBox()
self.combobox_penalite.addItem("100")
self.combobox_penalite.addItem("75")
self.combobox_penalite.addItem("66.66")
self.combobox_penalite.addItem("50")
self.combobox_penalite.addItem("25")
self.combobox_penalite.addItem("33.333")
self.combobox_penalite.addItem("0")
hbox_penalite.addWidget(self.combobox_penalite)
hbox_penalite.insertSpacing(2,1000)
hbox_feedbackgeneral = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedbackgeneral)
self.label_feedbackgeneral = QLabel("Feedback general :", self)
self.label_feedbackgeneral.setFixedWidth(150)
hbox_feedbackgeneral.addWidget(self.label_feedbackgeneral)
self.lineedit_feedback_general = QLineEdit(self)
hbox_feedbackgeneral.addWidget(self.lineedit_feedback_general)
hbox_feedbackgeneral.insertSpacing(2,100)
hbox_feedback_vrai = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_vrai)
self.label_feedbackvrai = QLabel("Feedback pour la réponse 'vrai' :", self)
self.label_feedbackvrai.setFixedWidth(150)
self.label_feedbackvrai.setWordWrap(True)
hbox_feedback_vrai.addWidget(self.label_feedbackvrai)
self.lineedit_feedback_vrai = QLineEdit(self)
hbox_feedback_vrai.addWidget(self.lineedit_feedback_vrai)
hbox_feedback_faux = QHBoxLayout()
VBoxLayout.addLayout(hbox_feedback_faux)
self.label_feedbackfaux = QLabel("Feedback pour la réponse 'faux' :", self)
self.label_feedbackfaux.setFixedWidth(150)
self.label_feedbackfaux.setWordWrap(True)
hbox_feedback_faux.addWidget(self.label_feedbackfaux)
self.lineedit_feedback_faux = QLineEdit(self)
hbox_feedback_faux.addWidget(self.lineedit_feedback_faux)
hbox_bouton_question = QHBoxLayout()
VBoxLayout.addLayout(hbox_bouton_question)
self.button = QPushButton("créer la question")
self.button.clicked.connect(self.creer_question)
hbox_bouton_question.addWidget(self.button)
hbox_bouton_question.insertSpacing(2,400)
hbox_bouton_question.insertSpacing(0,400)
self.groupBox.setLayout(VBoxLayout)
def creer_question(self):
#Fonction qui va créer un fichier xml en qui correspond à une question 'vrai faux' en prenant en compte toutes les infos dans les champs remplis de la fenêtre
#non du fichier xml que l'on veut creer
file_name = self.lineedit_nom_fichier.text()
file_name_txt = file_name + ".txt"
file_name_xml = file_name + ".XML"
adresse = self.lineedit_adresse.text() + '/'
nom_question = self.lineedit_nom_question.text()
intitule_question = self.textedit_intitule_question.toPlainText()
note_par_defaut = self.lineedit_note_par_defaut.text()
feedback_general = self.lineedit_feedback_general.text()
feedback_vrai = self.lineedit_feedback_vrai.text()
feedback_faux = self.lineedit_feedback_faux.text()
penalite = self.combobox_penalite.currentText()
bonne_reponse = self.combobox_vraifaux.currentText()
#'top' va contenir tout le document xml
top = Element('quiz')
#on ajoute toutes les lignes du documents
comment = Comment('question: 0')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','category')
category = SubElement(question,'category')
text = SubElement(category,'text')
text.text = 'top'
comment = Comment('question: vrai faux')
top.append(comment)
question = SubElement(top, 'question')
question.set('type','truefalse')
name = SubElement(question,'name')
text = SubElement(name,'text')
text.text = nom_question
questiontext = SubElement(question,'questiontext')
questiontext.set('format','html')
text=SubElement(questiontext,'text')
text.text = '<![CDATA[<p>' + intitule_question + '</p>]]>'
generalfeedback = SubElement(question,'generalfeedback')
generalfeedback.set('format','html')
text = SubElement(generalfeedback,'text')
text.text = feedback_general
defaultgrade = SubElement(question,'defaultgrade')
defaultgrade.text = note_par_defaut
penalty = SubElement(question,'penalty')
penalty.text = penalite
hidden= SubElement(question,'hidden')
hidden.text = '0'
answer = SubElement(question,'answer')
if bonne_reponse == 'vrai':
answer.set('fraction','100')
else:
answer.set('fraction','0')
answer.set('format','moodle_auto_format')
text = SubElement(answer,'text')
text.text = 'true'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback_vrai
answer = SubElement(question,'answer')
if bonne_reponse == 'vrai':
answer.set('fraction','0')
else:
answer.set('fraction','100')
answer.set('format','moodle_auto_format')
text = SubElement(answer,'text')
text.text = 'false'
feedback = SubElement(answer,'feedback')
feedback.set('format','html')
text = SubElement(feedback,'text')
text.text = feedback_faux
#on cree un fichier txt qui contient toute les lignes du fichier xml que l'on va creer
fichier = open(adresse + file_name_txt, "w")
fichier.write(prettify(top))
fichier.close()
#on rajoute ' encoding="UTF-8" ' dans la premiere ligne
fichier = open(adresse + file_name_txt, "r")
lignes= fichier.readlines()
fichier = open(adresse + file_name_txt, "w")
lignes[0] = '<?xml version="1.0" encoding="UTF-8"?>\n'
fichier.writelines(lignes)
fichier.close()
#on remplace les &lt; et les &gt; par < et > dans le fichier
f=open(adresse + file_name_txt,'r')
chaine=f.read().replace('&lt;','<')
chaine = chaine.replace ('&gt;','>')
f.close()
f=open(adresse + file_name_txt,'w')
f.write(chaine)
f.close()
#on transforme le fichier txt en fichier xml
if os.path.exists(adresse + file_name_xml):
os.remove(adresse + file_name_xml)
os.rename(adresse + file_name_txt, adresse + file_name_xml)
#fonction qui permet de mettre en forme le fichier xml avec les indexations
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment