Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Revue de code [fermés]

0 votes

Je suis débutant en python et en programmation en général, ça va faire 6 mois que m'y suis mis.
J'ai terminé aujourd'hui mon premier vrai projet (pur lequel vous m'avez déjà bien aidé), un petit utilitaire qui me sert dans le cadre du boulot pour automatiser l'extraction de données du logiciel de compta vers Excel.
Je ne sais pas si ça cadre vraiment avec l'objet d'IndexError, mais j'aimerais beaucoup recevoir votre feedback pour m'améliorer.
J'ai codé ça en essayant de suivre le pattern MVC (ça m'a beaucoup appris, au départ j'avais beaucoup de mal à appréhender la communication entre les objets).

View.py

from tkinter import Tk, Frame, Text, Button, filedialog, WORD, DISABLED, NORMAL, INSERT
from tkinter.ttk import *

class View(object):
    """Interface du programe"""

    def __init__(self):
        #fenêtre maitresse
        self.root= Tk()
        self.root.title("CoalaLink")
        self.root.iconbitmap("fav.ico")
        self.root.resizable(0,0)

        frame = Frame(self.root)
        frame.pack()

        #widgets
        self.message = Text(frame, width=40, height=10, wrap=WORD)
        self.message.config(state=DISABLED) #on interdit la copie ou l'écriture

        self.browse = Button(frame, text="Fichier à traiter", width=15)
        self.traiter = Button(frame, text="Lancer", width=15)

        #positionnement       
        self.message.grid(row=0, column=0, columnspan=2)
        self.browse.grid(row=1, column=0, sticky='w')
        self.traiter.grid(row=1, column=1, sticky="e")

    def ins(self, text, t="black") :
        """Ecriture du texte dans la zone, de couleur 't'"""
        self.message.config(state=NORMAL)
        self.message.tag_add(t, "1.0", "1.0")
        self.message.tag_config(t, foreground=t)
        self.message.insert(INSERT, text, t)
        self.message.config(state=DISABLED)

    def browser(self) :
        """Renvoi le chemin du fichier choisi"""
        return filedialog.askopenfilename(filetypes=(("Excel", "*.xls;*.xlsx"),
                                                      ("All files", "*.*"))) 

if __name__ == "__main__" :
    app = View()
    app.ins("012345678910", "red")
    app.ins("012345678910", "blue")
    app.root.mainloop()

Modele.py

from os import path
import sys
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants

class Excel(object) :
    """Classe qui proxy l'objet contrôlant Excel via OLE
    Et qui gère la totalité des traitements faits sous Excel"""

    def __init__(self, obj) :
        #proxy
        object.__setattr__(self, "_obj", obj)
        obj.DisplayAlerts = False #permet déviter la pop-up concernant les macros

        #excel
        #si executable figé, on prend le chemin du .exe, sinon celui du .py
        if hasattr(sys, "frozen") :
            self.rep = path.dirname(sys.executable) 
        else :
            self.rep = path.dirname(__file__)

        self.pathTab = "" #chemin du tableau à traiter
        self.mois = dict(zip(["01","02","03","04","05","06","07","08","09","10","11","12"],
                ["Janvier","Février","Mars","Avril","Mai","Juin","Juillet",
                 "Août","Septembre","Octobre","Novembre","Décembre"]))

    #proxy : override des méthodes, en permettant l'ajout de nouveaux attributs
    def __getattribute__(self, name):
        try :
            return getattr(object.__getattribute__(self, "_obj"), name)
        except AttributeError :
            return object.__getattribute__(self, name)
    def __delattr__(self, name):
        try :
            delattr(object.__getattribute__(self, "_obj"), name)
        except AttributeError :
            object.__delattr__(self, name)
    def __setattr__(self, name, value):
        try :
            setattr(object.__getattribute__(self, "_obj"), name, value)
        except AttributeError :
            object.__setattr__(self, name, value)

    #excel            
    def colleVal(self, fSource, fDest, rSource, rDest) :
        """Copier/coller en valeurs"""
        if len(rSource) != len(rDest) :
            print("Erreur de plages")
        else :
            for s, d in zip(rSource, rDest) :
                fSource.Range(s).Copy()
                fDest.Range(d).PasteSpecial(Paste=constants.xlPasteValues)
            fDest.Range("H4").Value = "ole"

    def renameMois(self, tab, moisEx) :
        """Renomme les onglets par le nom du mois au lieu du numéro dans l'exercice si nécessaire"""
        if tab.Sheets[2].Name == "1" :
            tab.Sheets[2].Name = self.mois[moisEx]
            num=int(moisEx)
            i=3
            while i < len(tab.Sheets)-1 :
                if num==12 :
                    num=1
                    tab.Sheets[i].Name=self.mois["01"]
                else :
                    num+=1
                    if num<10 :
                        n="0"+str(num)
                    else :
                        n=str(num)
                    tab.Sheets[i].Name=self.mois[n]
                i+=1
            return "Onglets renommés\n"
        else :
            return ""

    def do5P(self) :
        """Traitements du tableau 5 phases"""
        #on ouvre les fichiers
        cOle = self.Workbooks.Open(path.join(self.rep,"ole.xla"))
        tab = self.Workbooks.Open(self.pathTab)

        #on selectionne la feuille et récupère les données intéressantes
        ole = self.ActiveWorkbook.Sheets("OLE")
        moisEx = str(ole.Range("K2"))[5:7]
        moisTVA = str(ole.Range("G2"))[5:7]

        #renommage des onglets
        rMois = self.renameMois(tab, moisEx)

        #on récupère la feuille de travail
        tva = self.ActiveWorkbook.Sheets(self.mois[moisTVA])
        tva.Activate() #affiche la feuille dans excel

        #on s'assure que la feuille n'a pas déjà été traitée
        if tva.Range("H4").Value == "ole" :
            self.pathTab = ""
            tab.Close(SaveChanges=0)
            cOle.Close(SaveChanges=0)
            self.Quit()
            return rMois+"Ole déjà effectué sur ce mois"
        #et on fait les traitements
        else :
            self.colleVal(ole,tva,["B27:G32","B34:G34","B36:G36","B38:G41","B43:G43","B45","B46","B47"],
             ["C13","C22","C31","C153","C168","G181","G183","G182"])
            self.Visible = True
            return rMois+"Traitement 5 phases OK"

def initExcel() :
    """Retourne l'objet généré par OLE"""
    #Evite d'importer win32 dans le contrôleur
    return EnsureDispatch("Excel.Application")

Controleur.py
Lien vers 0bin, la limite de 8 000 caractères était atteinte

fermée avec la mention: Post déplacé vers https://www.reddit.com/r/sametmax/comments/3dask6/conseilsremarques_sur_code/  , IE n'est pas la plateforme appropriée pour ça
demandé 14-Jul-2015 par Zara (200 points)
fermés 14-Jul-2015 par boblinux

Si aucune réponse ne vient mieux vaut tenter le coup ici https://www.reddit.com/r/sametmax qui a été ouvert pour ça si je ne m'abuse

Dacc avec Fox, c'est pas trop fait pour ça ce genre de plateforme =/, comment tu pourrais selectionner une meilleure réponse avec un post pareil ??

Tu devrais t'orienter vers le subreddit sam&max

J'en étais bien conscient, mais je n'avais pas pensé au subreddit ! Je poste là bas du coup. Merci !

...