Tous les exercices

Les informations utiles aux développeurs de Pyromaths.

Modérateur : Développeurs

Répondre
Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Tous les exercices

Message par Arnaud » 06 janv. 2009, 00:26

Plutôt que de me battre encore une fois avec eclipse, j'ai préféré codé directement, et je n'ai pas d'autre choix que de partager par le forum.
Quand j'aurai de la motivation à nouveau, je relance le combat avec eclipse, mais pour le moment...

C'est pas grand chose, mais pratique pour avoir une vue d'ensemble : j'ai ajouté une entrée dans le menu fichier qui exploite la fonction "latotale", afin de générer une feuille d'exercices par niveau. Voici la modification de la classe Fenetre_Principale dans pyromaths.py. Pour le reste, il faut juste définir la fonction latotale au début et une variable ID_TOTALE = 104 :

Code : Tout sélectionner

class Fenetre_Principale(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Pyromaths...")

    # Crée l'icone de l'application
        if os.name == "posix":
            if os.path.basename(__file__) == "pyromaths":
                self.icon = wx.Icon("/usr/share/pixmaps/pyromaths.png",
                                    wx.BITMAP_TYPE_PNG)
            else:
                pathname = os.path.dirname((sys.argv)[0])
                self.icon = wx.Icon(os.path.join(os.path.abspath(pathname),
                                    "pyromaths.ico"), wx.BITMAP_TYPE_ICO)
        else:
            pathname = os.path.dirname((sys.argv)[0])
            self.icon = wx.Icon(os.path.join(os.path.abspath(pathname),
                                "pyromaths.ico"), wx.BITMAP_TYPE_ICO)
        self.SetIcon(self.icon)

    # Crée la barre de status

        self.CreateStatusBar()
        self.SetStatusText(number=0, text=
                           u'Choisir un niveau, s\xe9lectionner des exercices, puis cliquer sur "Cr\xe9er".')

    # Paramètre le menu

        menu_fichier = wx.Menu()
        menu_fichier.Append(ID_EXIT, '&Quitter',
                            'Quitter l\'application.')

			    

	menu_fichier.Append(ID_TOTALE, u'Tous les exercices', u'G\xe9n\xe9rer une feuille avec un exemplaire de chaque exercice.')





	
        menu_about = wx.Menu()
        menu_about.Append(ID_SITE, u'Acc\xe9der au &site',
                          u'Acc\xe9der au site de Pyromaths')
        menu_about.AppendSeparator()
        menu_about.Append(ID_ABOUT, u'\xc0 &propos',
                          u'\xc0 propos de Pyromaths.')

    # Crée la barre de menu

        menubar = wx.MenuBar()
        menubar.Append(menu_fichier, "&Fichier")
        menubar.Append(menu_about, "&Aide")
        self.SetMenuBar(menubar)

    # Crée le panel

        self.ligne = wx.BoxSizer(wx.HORIZONTAL)
        self.colonne_gauche = wx.BoxSizer(wx.VERTICAL)
        self.colonne_droite = wx.BoxSizer(wx.HORIZONTAL)
        self.SetBackgroundColour('#FBF5E1')

    # Crée les RadiosButtons

        self.niveaux_ctrls = []
        radio0 = wx.RadioButton(self, -1, LesFiches[0][0], style=wx.RB_GROUP)
        radio1 = wx.RadioButton(self, -1, LesFiches[1][0])
        radio2 = wx.RadioButton(self, -1, LesFiches[2][0])
        radio3 = wx.RadioButton(self, -1, LesFiches[3][0])
        radio3.SetValue(True)
        self.niveaux_ctrls.append(radio0)
        self.niveaux_ctrls.append(radio1)
        self.niveaux_ctrls.append(radio2)
        self.niveaux_ctrls.append(radio3)
        self.colonne_gauche.Add((10, 30), 0, wx.EXPAND)
        for radio in self.niveaux_ctrls:
            self.colonne_gauche.Add(radio, 0, wx.ALIGN_LEFT | wx.LEFT |
                                    wx.RIGHT | wx.TOP, 5)

    # Crée les boutons

        self.bouton_continuer = wx.Button(self, -1, u"Cr\xe9er", pos=(50,
                50))
        self.bouton_continuer.SetDefault()
        self.bouton_continuer.SetSize(self.bouton_continuer.GetBestSize())
        self.bouton_fermer = wx.Button(self, -1, u"Quitter", pos=(50, 50))
        self.bouton_fermer.SetSize(self.bouton_fermer.GetBestSize())

    # Intègre la liste, les boutons é la colonne gauche

        self.colonne_gauche.AddMany([((10, 50), 0, wx.EXPAND), (self.bouton_continuer,
                                    0, wx.CENTER), ((10, 10), 0, wx.EXPAND),
                                    (self.bouton_fermer, 0, wx.CENTER),
                                    ((10, 50), 0, wx.EXPAND)])

    # Crée les options

        self.option1 = wx.CheckBox(self, -1, u"Cr\xe9er un PDF", style=
                                   wx.BU_EXACTFIT)
        self.option1.SetValue(1)
        self.colonne_gauche.Add(self.option1, 0, wx.CENTER)

    # écrit la liste des exercices dans la colonne de droite

        self.niveau_selectionne = 3  # le niveau par défaut est le niveau 3e
        exos = LesFiches[3][2]  # le niveau par défaut est le niveau 3e
        self.exos1 = new_liste_exos(self, exos, 1)
        self.exos2 = new_liste_exos(self, exos, 0)
        self.colonne_droite.Add(self.exos1, 0, wx.EXPAND)
        self.colonne_droite.Add(self.exos2, 0, wx.EXPAND)
        self.ligne.Add(self.colonne_gauche, 0, wx.TOP)
        self.ligne.Add(self.colonne_droite, 0, wx.TOP)

    # BINDINGS
    # Actions de la barre de menu

        self.Bind(wx.EVT_MENU, self.OnExit, id=ID_EXIT)
        self.Bind(wx.EVT_MENU, self.site, id=ID_SITE)
        self.Bind(wx.EVT_MENU, self.About, id=ID_ABOUT)
	self.Bind(wx.EVT_MENU, self.Totale, id=ID_TOTALE)

    # Action des sélections dans les boutons radio

        for radio in self.niveaux_ctrls:
            self.Bind(wx.EVT_RADIOBUTTON, self.Radio_Button, radio)

    # Actions des boutons

        self.bouton_fermer.Bind(wx.EVT_BUTTON, self.OnExit, id=self.bouton_fermer.GetId())
        self.bouton_continuer.Bind(wx.EVT_BUTTON, self.OnValide, id=self.bouton_continuer.GetId())

    # Actions des options
    # Inutile de créer une action pour ce bouton.
    # self.Bind(wx.EVT_CHECKBOX, self.OnOption1,
    # self.option1)
    # Affiche la boite de dialogue Pyromaths

        self.SetSizer(self.ligne)
        self.SetAutoLayout(1)
        self.SetSize(self.GetBestSize())
        self.CenterOnParent(wx.BOTH)
        self.Show(1)

    def OnExit(self, event):
        self.Close(True)

    def site(self, event):
        import webbrowser
        webbrowser.open('http://www.pyromaths.org')

    def About(self, event):
        from dialog_box import MyAboutBox
        about = MyAboutBox(self)
        about.ShowModal()
        about.Destroy()

    def Totale(self, event):
	i = 0
	while i < 4:
		latotale('/home/arnaud/totale_' + str(6 - i) + '.tex', '/home/arnaud/totale_' + str(6 - i) + '_cor.tex', i)
		i += 1 

    def OnSelect(self, event):
        pos = self.liste_niveaux.GetSelection()
        self.commentaires.SetValue(LesFiches[pos][2])

    def Radio_Button(self, event):
        radio_selected = event.GetEventObject()
        cpt = 0
        self.colonne_droite.Clear(1)
        for radio in self.niveaux_ctrls:
            if radio is radio_selected:
                self.niveau_selectionne = cpt
                exos = LesFiches[cpt][2]
                exos1 = new_liste_exos(self, exos, 1)
                exos2 = new_liste_exos(self, exos, 0)
                self.colonne_droite.Add(exos1, 0, wx.EXPAND)
                self.colonne_droite.Add(exos2, 0, wx.EXPAND)
            cpt = cpt + 1
        self.ligne.Layout()

    def OnGroupCheckBox(self, event):
        for groups in (self.group_ctrls1, self.group_ctrls2):
            for (sc, cb) in groups:
                if cb.GetValue():
                    if not sc.GetValue():
                        sc.Enable(True)
                        sc.SetValue(1)
                else:
                    sc.Enable(False)
                    sc.SetValue(0)
                lst[sc.GetId()] = sc.GetValue()

    def OnGroupSpinCtrl(self, event):
        for groups in (self.group_ctrls1, self.group_ctrls2):
            for (sc, cb) in groups:
                if not sc.GetValue():
                    cb.SetValue(False)
                    sc.Enable(False)
                lst[sc.GetId()] = sc.GetValue()

    def OnValide(self, event):
        progs = verifie_programmes(self)
        entete = self.option1.GetValue()
        listevide = True
        for i in xrange(len(lst)):
            if lst[i]:
                listevide = False
                break
        if listevide:
            dialog_box.Verif_progs(self,
                                   u"Veuillez s\xe9lectionner des exercices...",
                                   "Attention !")
        else:
            wildcard = \
                u"Documents TeX (*.tex)|*.tex|Tous les fichiers (*.*)|*.*"
            dossier = os.getcwd()
            (f0, f1) = ("", "")
            dlg = wx.FileDialog(self,
                                u"Enregistrer les exercices sous ...",
                                dossier, u"exercices.tex", wildcard, wx.SAVE |
                                wx.OVERWRITE_PROMPT)
            if dlg.ShowModal() == wx.ID_OK:
                f0 = dlg.GetPath()
                dossier = dlg.GetDirectory()
                nom_exo = dlg.GetFilename()
                file = os.path.splitext(nom_exo)
                if file[1].lower() == ".tex":
                    nom_exo = file[0]
                else:
                    nom_exo = file[0] + file[1]
                    f0 = f0 + ".tex"
            dlg.Destroy()
            if f0:
                dlg = wx.FileDialog(self,
                                    u"Enregistrer le corrig\xe9 sous ...",
                                    dossier, u"%s-corrige.tex" % nom_exo,
                                    wildcard, wx.SAVE | wx.OVERWRITE_PROMPT)
                if dlg.ShowModal() == wx.ID_OK:
                    f1 = dlg.GetPath()
                    if f1.lower().rfind(".tex", len(f1) - 4) < 0:
                        f1 = f1 + ".tex"
                dlg.Destroy()
            if f0 and f1:
                LesFiches[self.niveau_selectionne][1].main(lst, f0, f1,
                        entete)
                if entete:
                    print f0, f1
                    compilation(f0, f1, progs[0], progs[1], progs[2],
                                progs[3])
Seul problème, j'ai mis mon dossier /home/arnaud....il faut modifier.
Jérôme, tu es contre le fait de fixer une variable pour le chemin ?
Parce que donner le chemin à chaque fois qu'on veut une feuille...

Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Re: Tous les exercices

Message par Arnaud » 06 janv. 2009, 00:39

Hé ben, ça m'a permis de me rendre compte du travail effectué :shock:

Un problème, avec la fonction tex_formule_dix dans le module operations.py, dossier 6e : il y a des "imes" au lieu de "\times".

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 06 janv. 2009, 09:51

Non mais Arnaud, tu as vu l'heure à laquelle tu postes tes messages ! Il va falloir songer à aller te coucher ! :lol:
C'est une excellente idée que tu as eu là. Il faudrait trouver un moyen pour qu'il demande une fois le chemin pour l'ensemble des exercices. Ou alors on décide de tout placer dans /tmp. Qu'en pensez-vous.
J'insère ton code ce soir dans le svn.
Concernant les "imes", à la place des "\\times", il doit manquer un antislash quelque part. Je regarde aussi ce soir.
Jérôme
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Re: Tous les exercices

Message par Arnaud » 06 janv. 2009, 11:33

Jérôme a écrit :Non mais Arnaud, tu as vu l'heure à laquelle tu postes tes messages ! Il va falloir songer à aller te coucher ! :lol:
Bonne année aussi :)
Le 6 janvier est férié chez nous, je suis encore en vacances.
Et puis je ne vais plus avoir longtemps la possibilité de rester tard debout....donc j'en profite pour les semaines qui me restent.
Jérôme a écrit : C'est une excellente idée que tu as eu là. Il faudrait trouver un moyen pour qu'il demande une fois le chemin pour l'ensemble des exercices. Ou alors on décide de tout placer dans /tmp. Qu'en pensez-vous.
Le problème, c'est qu'il faut enregistrer une variable fixée, et pour cela il faudrait un fichier de configuration, sinon je ne vois pas comment on pourrait faire quand le programme est compilé.
Jérôme a écrit : Concernant les "imes", à la place des "\\times", il doit manquer un antislash quelque part. Je regarde aussi ce soir.
J'ai déjà corrigé sur mon dd, c'est pas grand chose.
J'ai qq idées pour le niveau cinquième, le problème étant que je ne sais pas dessiner en LaTeX.

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 06 janv. 2009, 14:07

Arnaud a écrit : Le problème, c'est qu'il faut enregistrer une variable fixée, et pour cela il faudrait un fichier de configuration, sinon je ne vois pas comment on pourrait faire quand le programme est compilé.
Je n'ai rien contre un fichier de config (même si je préfèrerais qu'on puisse s'en passer). Mais je ne veux pas m'en occuper ! :)
Arnaud a écrit : J'ai qq idées pour le niveau cinquième, le problème étant que je ne sais pas dessiner en LaTeX.
Je me débrouille en pstricks et metapost (que je préfère en ce moment). On peut peut-être travailler à deux là-dessus.
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 06 janv. 2009, 14:14

Arnaud a écrit : Le problème, c'est qu'il faut enregistrer une variable fixée, et pour cela il faudrait un fichier de configuration, sinon je ne vois pas comment on pourrait faire quand le programme est compilé.
Ne serait-ce pas supportable de saisir le chemin à chaque utilisation de la fonction "totale" ?
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Re: Tous les exercices

Message par Arnaud » 06 janv. 2009, 14:38

Jérôme a écrit :Ne serait-ce pas supportable de saisir le chemin à chaque utilisation de la fonction "totale" ?
Pour le fichier de conf, je sous-entendais pour l'utilisation globale de pyromaths, pas seulement pour la fonction totale.
Prenons par exemple moi : j'ai un dossier par niveau, donc je préfèrerais que les fiches 3e soient enregistrées dans le bon dossier ( bien que ce soit pas la mort de déplacer ). Par contre c'est vrai qu'à chaque fois que tu fais une feuille d'exos, il faut valider deux fois le chemin.

Je ne sais pas comment ça se passe sous win, mais j'ai l'impression que du coup cela ferait passer pyromaths de la catégorie "binaire à lancer" à "programme à installer". C'est une modification importante, donc je vais encore réfléchir si il n'y a pas une autre solution ( bdd... ).

Pour les figures, ce ne seraient que des figures illustratives, donc ce n'est pas urgent dans un premier temps.

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 06 janv. 2009, 14:50

Moi aussi j'ai un dossier par niveau. Mais à l'intérieur de ceux-ci, j'ai un dossier par chapitre. Par conséquent, un fichier de conf ne me serait pas utile pour ça.
Il faut valider le chemin deux fois (pour l'énoncé puis pour le corriger), mais par défaut, le chemin du corrigé est celui de l'énoncé. Je n'ai donc pas l'impression que ce soit trop lourd. Et ça permet à ceux qui le souhaitent de se faire un dossier énoncé et un dossier corrigé.
J'avoue que je ne suis pas convaincu par le fichier de conf, mais je te laisse le soin de me convaincre ! ;)
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Re: Tous les exercices

Message par Arnaud » 06 janv. 2009, 15:19

Bon, d'accord, tu mènes pour le moment.
Demain dans le bus je pousserai la réflexion plus loin :)

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 06 janv. 2009, 15:20

Arnaud a écrit :Bon, d'accord, tu mènes pour le moment.
Demain dans le bus je pousserai la réflexion plus loin :)
Il va falloir que j'affute mes arguments alors ! :P
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Re: Tous les exercices

Message par Arnaud » 07 janv. 2009, 22:02

Bon en fait le chemin ne serait pas la seule option à préciser.
Je sais que tu es contre les usines à gaz, mais je t'en fais part tout de même :

- options de chemin
- options d'entête ( nom du prof, nom du lycée, date ?, etc... )
- options générales de présentation ( plusieurs colonnes, titres d'exos, etc... )

Il y avoir d'autres trucs que les modèles LateX, mais ça suffit déjà pour avoir une idée :D

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 07 janv. 2009, 22:14

Ouais, tu marques des points. :)
Ça peut valoir le coup d'y réfléchir.
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Jérôme
Administrateur - Site Admin
Messages : 1143
Inscription : 26 août 2006, 13:10
Localisation : Nantes
Contact :

Re: Tous les exercices

Message par Jérôme » 21 janv. 2009, 19:46

Arnaud,
j'ai intégré (enfin !) ta proposition sur la création de tous les exercices à partir du menu Fichier de Pyromaths. Je l'ai un peu modifiée :

Code : Tout sélectionner

    def Totale(self, event):
        (f0, f1) = ("", "")
        dlg = wx.DirDialog(self, 
                           u"Enregistrer les fiches sous ...",
                           os.getcwd(),wx.DD_DEFAULT_STYLE|wx.DD_DIR_MUST_EXIST)
        if dlg.ShowModal() == wx.ID_OK:
            f0 = dlg.GetPath()
        dlg.Destroy()
        i = 0
        print f0
        while i < 4:
            latotale(os.path.join(f0,"%s" % (str(6 - i) + 'e.tex')),
                     os.path.join(f0,"%s" % (str(6 - i) + 'e-corrige.tex')),
                     i)
            i += 1
Ainsi, le logiciel nous demande où on veut créer toutes ces fiches. J'ai renommer les fichiers 6e.tex et 6e-corrige.tex car c'est le nom que j'utilise pour les exemples sur le site de Pyromaths et que j'ai un script qui les charge lorsque je publie une nouvelle version.

J'ai aussi corrigé le bug des " imes" à la place de "\\times".

Il n'y a pas d'autres nouveautés actuellement. Est-ce que ça vaut le coup de faire une release ? Je dirais que non. Qu'en pensez-vous ?
Pyromaths génère des fiches d'exercices et leur corrigé en toute simplicité.
Un programme multi-plateformes libre et gratuit sous licence GPL

Avatar de l’utilisateur
Arnaud
Critique officiel de pyromaths
Messages : 609
Inscription : 26 août 2006, 21:49
Localisation : Allemagne
Contact :

Re: Tous les exercices

Message par Arnaud » 21 janv. 2009, 20:10

Je ne pense pas non plus, il vaut mieux attendre une avancée significative.
Encore désolé pour ma part : je peux suivre les discussions du forum au mieux, mais je suis au bord du gouffre du point de vue du boulot ici.
Mais je suis hyper motivé d'apporter une mince contribution...

Répondre