IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

python tkinter et les classes


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut python tkinter et les classes
    Hello word!

    Je debute sous python et cherche a realiser un script qui lit un fichier csv et reordonne les colonnes et les cellules.

    Pour se faire j ai ecris un script qui fonctionne correctement. (il lit un fichier csv specifie, puis redispache les colonnes et cellules dans differents fichiers csv).
    Maintenant je voudrais qu il soit plus flexible en creant un interface graphique. Je me suis donc penche sur Tkinter et ai essaye de creer une fenetre avec un menu pour choisir le fichier a traiter et un bouton "Process" qui execute le workflow.

    C est a ce niveau que j obtiens une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    line 15, in transform
    file = open(nomfichier, "rb")
    NameError: global name 'nomfichier' is not defined

    J ai essaye un bon nombre de modifications sans reussir a corriger le probleme. Si quelqu un avait la gentillesse de m apporter ses lumieres ca serait vraiment cool.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    import csv
    from Tkinter import *
    import os
    from tkFileDialog import askopenfilename
     
     
     
    class OrganiseCSV:
     
            def __init__(self,fileIn):
                    self.fileIn = str(fileIn)
                    self.fichier=str(fileIn)
     
            def transform(self):
                    file = open(nomfichier, "rb")
                    outPole="Pole_"+nomfichier
     
                    try:
                            reader = csv.reader(file)
                  #je vous epargne les details de la suite de la fonction
     
     
     
    class mywidgets:
            def __init__(self,root):
                    frame=Frame(root)
                    self.makeMenuBar(frame)
                    frame.pack()
                    return
     
            #defines menubar
            def makeMenuBar(self,frame):
                    menubar = Frame(frame,relief = RAISED,borderwidth = 1)
                    menubar.pack()
                    mb_file = Menubutton(menubar,text = 'file')
                    mb_file.pack(side = LEFT)
                    mb_file.menu = Menu(mb_file)
                    mb_file.menu.add_command(label = 'open',command = self.file_open)
                    mb_edit = Button(menubar,text = 'process', command = self.process)
                    mb_edit.pack(side = LEFT)
     
                    mb_file['menu'] = mb_file.menu
                    return
            #defines file_open which is called when file option openis choosen
            #displays the files giving the user choice to choose  file
            def file_open(self):
                    filename =askopenfilename(filetypes=[("allfiles","*"),("csv files","*.csv")])
                    print filename
                    fname=os.path.basename(filename)
                    fname2=str(fname)
                    print fname
                    return fname2
     
            #creer une instance de OrganiseCSV et lance la transformation
            def process(fname2):
                    convert=OrganiseCSV(fname2)
                    convert.transform()
     
     
     
     
     
    def main():
        root = Tk()
        k = mywidgets(root)
        root.title('PyCSV Converter')
        root.mainloop()
    main()
    Merci d avance

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def __init__(self, fileIn):
        self.fichier = fileIn
     
    def transform(self):
        file = open(self.fichier, "rb")
        outPole="Pole_%d" % self.fichier
    @+

  3. #3
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Salut le python CSV,
    je connait pas le format *.csv, mais je connais Tkinter et je n'arrive pas a déchiffrer ton code car tu n'a pas utiliser la balise de code, qui permet d'affiché du code préformaté et le rend beaucoup plus lisible, accessible avec le bouton # (Dièse) de l'interface d'écriture du post et pense a indenter ton code dedans car c'est une faute en python de pas l'indenter.

    Pense a l'utilisé la prochaine fois que tu met du code dans ton post tu aura plus de chances de trouver réponse a tes questions.
    Désolé de pas pouvoir t'aider plus que ca.

    Bon python a toi.

  4. #4
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos conseils.

    J ai remplacé le bout de code par celui proposé par PauseKawa.

    J'obtiens une nouvelle erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    file = open(self.fichier, "rb")
    TypeError: coercing to Unicode: need string or buffer, instance found
    Apparemment je devrais mettre un type string mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fichier=str(self.fichier)
    file = open(fichier, "rb")
    j'obtiens l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File "C:\Users\Vincent\Desktop\western py\1.py", line 15, in transform
        file = open(fichier, "rb")
    IOError: [Errno 22] invalid mode ('rb') or filename: '<__main__.mywidgets instance at 0x020EA198>'
    Je ne comprends pas pourquoi je ne peux pas extraire la valeur de la chaine et la mettre dans une nouvelle variable?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,

    Le premier argument d'open doit effectivement être une chaîne de caractères.
    S'il y a erreur, c'est que vous ne savez pas ce qu'est l'objet "self.fichier".
    Appliquer str à cette chose inconnue vous fabriquera peut être un "str" sans erreur mais pas pour autant "consommable" par "open".

    Je conviens que cela ne vous aide pas, mais sans un code plus complet reproduisant l'erreur, on ne pourra que "conjecturer" ...
    - W

  6. #6
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut,

    Merci wiztricks pour ta réponse. Ca m'éclaire quand meme sur les raisons de l'erreur.

    Voici le code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    import csv
    from Tkinter import *
    import os
    from tkFileDialog import askopenfilename
     
     
     
    class OrganiseCSV:
     
        def __init__(self,fileIn):
            self.fichier=fileIn
     
        def transform(self):
            file = open(self.fichier, "rb")
            outPole="Pole_%d" % self.fichier
            outEquip1="Equip1_%d"% self.fichier
            outEquip2="Equip2_%d"% self.fichier
            outSupply="Supply_%d"% self.fichier
            outHouse="House_%d"% self.fichier
            filePole = open(outPole, "wb")
            fileEquip1 = open(outEquip1, "wb")
            fileEquip2 = open(outEquip2, "wb")
            fileSupply = open(outSupply, "wb")
            fileHouse = open(outHouse, "wb")
     
            list=[]
     
            poleRow=[0,1,2,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,3,4,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37]
            supplyRow=[0,1,2,6,8,10,12,14,16,18,20,22,24,26,28,30,0,1,2,3,4,5,6,7,9,11,13,15,17,19,21,23,25,27,29]
            Equip1Row=[0,1,2,6,8,10,12,14,16,18,20,22,24,26,28,30,32,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37]
            Equip2Row=[0,1,2,6,8,10,12,14,16,18,20,22,24,26,28,30,32,5,7,9,11,13,15,17,19,21,23,25]
            HouseRow=[0,1,2,6,8,10]
     
            try:
                reader = csv.reader(file)
     
                writer = csv.writer(filePole)   #on creer un fichier par type d objet
                writerSupply=csv.writer(fileSupply)
                writerEquipment1=csv.writer(fileEquip1)
                writerEquipment2=csv.writer(fileEquip2)
                writerHouse=csv.writer(fileHouse)
     
               #Ce qui suit renseigne le nom des colonnes
                writer.writerow( (['Point Id','Easting','Northing','Pole Number','Material','Earthing','Cattle Collar','Envir_Sign_ID','Running_Earth','No_of_HV','No_of_LV','1_Phase_Color','ABC,SLight_Conduc','No_of_Stays','Stay_Type_1','Stay_Type_2','Stay_Type_3','Supply_No1','Connec_Type_1','Supply_No2','Connec_Type_2','Supply_No3','Connec_Type_3','Supply_No4','Connec_Type_4','Supply_No5','Connec_Type_5','Supply_No6','Connec_Type_6','Term_Type','StreetLight','Power_Watch','TX_Type','Stock_Code','Input_Voltage','Output_Voltage','Input_Phase','Rating_kVA','2nd_Voltage','Year_of_Manuf','Manufacturer','Tap_Position','Load_Break_Sw','Pole_Top_Swit','HV_Disconnect','Drop_Out_Fuse','Recloser','Isolator','Sectionaliser','Unsafe_Equpmn','HV_Isolator','LV_Isolator','Krone_Box','Photo_No','Other']) )
                writerSupply.writerow( (['Point Id','Easting','Northing','Pole Number','Supply_No1','Connection1','Supply_No2','Connection2','Supply_No3','Connection3','Supply_No4','Connection4','Supply_No5','Connection5','Supply_No6','Connection6'] ) )
                writerEquipment1.writerow( (['Point Id','Easting','Northing','Pole Number','Term_Type','StreetLight','Power_Watch','TX_Type','Stock_Code','Input_Volts','Output_Volts','Input_Phase','Rating_kVA','2nd_Voltage','Year_of_Manuf','Manufacturer','Tap_Position']) )
                writerEquipment2.writerow( (['Point Id','Easting','Northing','Pole Number','Load_Break_Sw','Pole_Top_Swit','HV_Disconnect','Drop_Out_Fuse','Recloser','Isolator','Sectionaliser','Unsafe_Equpmn','HV_Isolator','LV_Isolator','Krone_Box']) )
                writerHouse.writerow( (['Point Id','Easting','Northing','Pole Number','HouseNo']) )
     
     
                for row in reader:                  #lire chaque ligne
                    if row[4]=='Pole':              # s il s agit d un pole
                        for i in range(0,38):       #parcourir la liste polerow de 1 a 38
                            a=poleRow[i]            # on met dans les l ordre les valeurs
                            c=str(row[i])           #!!!! on peut peut etre enleve la variable c ou QUOI? 
                            list[i:i]=[row[a]]      #puis on les enregistres dans une liste
                            contenu=list[0:19]      #nombre de colonne
                            if i==19:
                                writer.writerow( (contenu)) #on imprime ensuite cette liste en gardant uniquement ce les valeurs qui nous interessent
     
                    elif row[4]=='Supply_To':
                        for i in range(0,30):       
                            a=Equip1Row[i]
                            c=str(row[i])
                            list[i:i]=[row[a]]
                            contenu=list[0:16]
                            if i==16:
                                writerSupply.writerow( (contenu))
     
                    elif row[4]=='Equipment1':
                        for i in range(0,32):
                            a=Equip1Row[i]
                            c=str(row[i])
                            list[i:i]=[row[a]]
                            contenu=list[0:17]
                            if i==17:
                                writerEquipment1.writerow( (contenu))
     
                    elif row[4]=='Equipment2':
                        for i in range(0,28):
                            a=Equip2Row[i]
                            c=str(row[i])
                            list[i:i]=[row[a]]
                            contenu=list[0:15]
                            if i==15:
                                writerEquipment2.writerow( (contenu))
     
                    else :
                        for i in range(0,6):
                            a=HouseRow[i]
                            c=str(row[i])
                            list[i:i]=[row[a]]
                            contenu=list[0:4]
                            if i==4:
                                writerHouse.writerow( (contenu))
     
     
            finally:
                #
                # Fermeture du fichier source
                file.close()
            print "done"
            filePole.close() # si on omet de clore le fichier l output ne marche pas.
            fileEquip1.close()
            fileEquip2.close()
            fileSupply.close()
            fileHouse.close()
     
    class mywidgets:
        def __init__(self,root):
            frame=Frame(root)
            self.makeMenuBar(frame)
            frame.pack()
            return
     
        #defines menubar
        def makeMenuBar(self,frame):
            menubar = Frame(frame,relief = RAISED,borderwidth = 1)
            menubar.pack()
            mb_file = Menubutton(menubar,text = 'file')
            mb_file.pack(side = LEFT)
            mb_file.menu = Menu(mb_file)
            mb_file.menu.add_command(label = 'open',command = self.file_open)
            mb_edit = Button(menubar,text = 'process', command = self.process)
            mb_edit.pack(side = LEFT)
     
            mb_file['menu'] = mb_file.menu
            return
        #defines file_open which is called when file option openis choosen
        #displays the files giving the user choice to choose file
        def file_open(self):
            filename =askopenfilename(filetypes=[("allfiles","*"),("csv files","*.csv")])
            print filename
            fname=os.path.basename(filename)
            fname2=str(fname)
            print fname
            return fname2
     
        #creer une instance de OrganiseCSV et lance la transformation
        def process(fname2):
            convert=OrganiseCSV(fname2)
            convert.transform()
     
     
    def main():
        root = Tk()
        k = mywidgets(root)
        root.title('PyCSV Converter')
        root.mainloop()
    main()
    Ainsi que le fichier à traiter à renommer en .csv

    Merci de votre aide
    Fichiers attachés Fichiers attachés

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'était bien le sens de ma première réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    import csv
    from Tkinter import *
    import os
    from tkFileDialog import askopenfilename
     
     
    class OrganiseCSV:
        def __init__(self, fileIn):
            self.fichier = fileIn
     
        def transform(self):
            filein = open(self.fichier, "rb")
            fname = os.path.basename(self.fichier)
            outPole = "Pole_%s" % fname
            outEquip1 = "Equip1_%s" % fname
            outEquip2 = "Equip2_%s" % fname
            outSupply = "Supply_%s" % fname
            outHouse = "House_%s" % fname
            filePole = open(outPole, "wb")
            fileEquip1 = open(outEquip1, "wb")
            fileEquip2 = open(outEquip2, "wb")
            fileSupply = open(outSupply, "wb")
            fileHouse = open(outHouse, "wb")
     
            liste = []
     
            poleRow = [0, 1, 2, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
                       32, 34, 36, 38, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
                       25, 27, 29, 31, 33, 35, 37]
            # supplyRow ?
            supplyRow = [0, 1, 2, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
                         0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25,
                         27, 29]
            Equip1Row = [0, 1, 2, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
                         32, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31,
                         33, 35, 37]
            Equip2Row = [0, 1, 2, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
                         32, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
            HouseRow = [0, 1, 2, 6, 8, 10]
     
            try:
                reader = csv.reader(filein)
                # on creer un fichier par type d objet
                writer = csv.writer(filePole)
                writerSupply = csv.writer(fileSupply)
                writerEquipment1 = csv.writer(fileEquip1)
                writerEquipment2 = csv.writer(fileEquip2)
                writerHouse = csv.writer(fileHouse)
     
                # Ce qui suit renseigne le nom des colonnes
                writer.writerow((['Point Id', 'Easting', 'Northing', 'Pole Number',
                                  'Material', 'Earthing', 'Cattle Collar',
                                  'Envir_Sign_ID', 'Running_Earth', 'No_of_HV',
                                  'No_of_LV', '1_Phase_Color', 'ABC,SLight_Conduc',
                                  'No_of_Stays', 'Stay_Type_1', 'Stay_Type_2',
                                  'Stay_Type_3', 'Supply_No1', 'Connec_Type_1',
                                  'Supply_No2', 'Connec_Type_2', 'Supply_No3',
                                  'Connec_Type_3', 'Supply_No4', 'Connec_Type_4',
                                  'Supply_No5', 'Connec_Type_5', 'Supply_No6',
                                  'Connec_Type_6', 'Term_Type', 'StreetLight',
                                  'Power_Watch', 'TX_Type', 'Stock_Code',
                                  'Input_Voltage', 'Output_Voltage', 'Input_Phase',
                                  'Rating_kVA', '2nd_Voltage', 'Year_of_Manuf',
                                  'Manufacturer', 'Tap_Position', 'Load_Break_Sw',
                                  'Pole_Top_Swit', 'HV_Disconnect', 'Drop_Out_Fuse',
                                  'Recloser', 'Isolator', 'Sectionaliser',
                                  'Unsafe_Equpmn', 'HV_Isolator', 'LV_Isolator',
                                  'Krone_Box', 'Photo_No', 'Other']))
                writerSupply.writerow((['Point Id', 'Easting', 'Northing',
                                        'Pole Number', 'Supply_No1', 'Connection1',
                                        'Supply_No2', 'Connection2', 'Supply_No3',
                                        'Connection3', 'Supply_No4', 'Connection4',
                                        'Supply_No5', 'Connection5', 'Supply_No6',
                                        'Connection6']))
                writerEquipment1.writerow((['Point Id', 'Easting', 'Northing',
                                            'Pole Number', 'Term_Type',
                                            'StreetLight', 'Power_Watch', 'TX_Type',
                                            'Stock_Code', 'Input_Volts',
                                            'Output_Volts', 'Input_Phase',
                                            'Rating_kVA', '2nd_Voltage',
                                            'Year_of_Manuf', 'Manufacturer',
                                            'Tap_Position']))
                writerEquipment2.writerow((['Point Id', 'Easting', 'Northing',
                                            'Pole Number', 'Load_Break_Sw',
                                            'Pole_Top_Swit', 'HV_Disconnect',
                                            'Drop_Out_Fuse', 'Recloser', 'Isolator',
                                            'Sectionaliser', 'Unsafe_Equpmn',
                                            'HV_Isolator', 'LV_Isolator',
                                            'Krone_Box']))
                writerHouse.writerow((['Point Id', 'Easting', 'Northing',
                                       'Pole Number', 'HouseNo']))
     
                for row in reader:  # lire chaque ligne
                    if row[4] == 'Pole':  # s il s agit d un pole
                        for i in range(38):  # parcourir la liste polerow de 1 a 38
                            a = poleRow[i]  # on met dans les l ordre les valeurs
                            # !!!! on peut peut etre enleve la variable c ou QUOI?
                            c = str(row[i])
                            # puis on les enregistres dans une liste
                            liste[i:i] = [row[a]]
                            contenu = liste[0:19]  # nombre de colonne
                            if i == 19:
                                 # on imprime ensuite cette liste en gardant
                                 # uniquement ce les valeurs qui nous interessent
                                writer.writerow((contenu))
     
                    elif row[4] == 'Supply_To':
                        for i in range(30):
                            a = Equip1Row[i]
                            c = str(row[i])
                            liste[i:i] = [row[a]]
                            contenu = liste[0:16]
                            if i == 16:
                                writerSupply.writerow((contenu))
     
                    elif row[4] == 'Equipment1':
                        for i in range(32):
                            a = Equip1Row[i]
                            c = str(row[i])
                            liste[i:i] = [row[a]]
                            contenu = liste[0:17]
                            if i == 17:
                                writerEquipment1.writerow((contenu))
     
                    elif row[4] == 'Equipment2':
                        for i in range(28):
                            a = Equip2Row[i]
                            c = str(row[i])
                            liste[i:i] = [row[a]]
                            contenu = liste[0:15]
                            if i == 15:
                                writerEquipment2.writerow((contenu))
     
                    else:
                        for i in range(6):
                            a = HouseRow[i]
                            c = str(row[i]) # Pourquoi c = ?
                            liste[i:i] = [row[a]]
                            contenu = liste[0:4]
                            if i == 4:
                                writerHouse.writerow((contenu))
     
            finally:
                # Fermeture du fichier source
                filein.close()
            print "done"
            # si on omet de clore le fichier l output ne marche pas.
            filePole.close()
            fileEquip1.close()
            fileEquip2.close()
            fileSupply.close()
            fileHouse.close()
     
     
    class mywidgets:
        def __init__(self, root):
            frame = Frame(root)
            self.makeMenuBar(frame)
            frame.pack()
            self.filein = None
     
        #defines menubar
        def makeMenuBar(self, frame):
            menubar = Frame(frame, relief=RAISED, borderwidth=1)
            menubar.pack()
            mb_file = Menubutton(menubar, text='file')
            mb_file.pack(side=LEFT)
            mb_file.menu = Menu(mb_file)
            mb_file.menu.add_command(label='open', command=self.file_open)
            mb_edit = Button(menubar, text='process', command=self.process)
            mb_edit.pack(side=LEFT)
            mb_file['menu'] = mb_file.menu
     
        #defines file_open which is called when file option openis choosen
        #displays the files giving the user choice to choose file
        def file_open(self):
            self.filein = askopenfilename(filetypes=[("allfiles", "*"), \
                                                     ("csv files", "*.csv")])
     
        #creer une instance de OrganiseCSV et lance la transformation
        def process(self):
            convert = OrganiseCSV(self.filein)
            convert.transform()
     
     
    def main():
        root = Tk()
        mywidgets(root)
        root.title('PyCSV Converter')
        root.mainloop()
    main()
    @+

  8. #8
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci PauseKawa,

    Ca marche bien.

    Par contre est ce que tu pourrais m'expliquer les modifs que tu as fait et pourquoi ca ne marchait pas.

    Je voudrais juste être sur de bien comprendre la logique.

    @+

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class mywidgets:
        def __init__(self, root):
            ...
            self.filein = None
    
        def file_open(self):
            self.filein = askopenfilename(filetypes=[("allfiles", "*"), \
                                                     ("csv files", "*.csv")])
     
        def process(self):
            convert = OrganiseCSV(self.filein)
            convert.transform()
    Ici self.filein est un attribut d'instance (Voir self), visible de toutes les méthode de mywidgets.
    Il est donné en argument lors de la création de l'instance convert:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert = OrganiseCSV(self.filein)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class OrganiseCSV:
        def __init__(self, fileIn):
            self.fichier = fileIn
    Ou il deviens l'attribut d'instance self.fichier. Note: J'ai mis des noms différents pour faire la différence.
    Du coup self.fichier est disponible pour la méthode transform.

    Pour les autres modifs c'est l'application du PEP8 + quelques noms qui était des mots réservé (list par exemple).

    @+

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,
    Il faudrait retravailler un peu cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                   if row[4]=='Pole':              # s il s agit d un pole
                        for i in range(0,38):       #parcourir la liste polerow de 1 a 38
                            a=poleRow[i]            # on met dans les l ordre les valeurs
                            c=str(row[i])           #!!!! on peut peut etre enleve la variable c ou QUOI? 
                            list[i:i]=[row[a]]      #puis on les enregistres dans une liste
                            contenu=list[0:19]      #nombre de colonne
                            if i==19:
                                writer.writerow( (contenu)) #on imprime ensuite cette liste en gardant uniquement ce les valeurs qui nous interessent

    Pourquoi construire une liste à 39 entrées pour ne conserver que les 20 premières ?
    Ne serait-il pas plus lisible d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    contenu = []
    for ix in range(20):
        contenu.append(row[PoleRow[ix]))
    writer.writerow(contenu)
    Comme vous faites des opérations similaires sur outPole, outEquip1,... pourquoi ne pas "factoriser" cela? Chaque fichier supplémentaire ajoute sa séquence d'opérations qu'il faut répartir à différents endroits dans le code existant. Ca fonctionne mais difficile de s'y retrouver.
    - W

  11. #11
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour les explications Pausekawa! J ai bien compris la demarche a present


    wiztricks, j ai construis une liste à 39 entrées pour ne conserver que les 20 premières car si je n en cree que 20 le programme tombe en erreur et me dis que ma liste est trop petite.

    Si j ai bien compris, la lecture de chaque colonne du fichier csv entraine aussi la lecture de chaque element de la liste. J en ai deduis que si elles n etaient pas egale ca engendrait une erreur...

    Je ne sais pas encore comment factoriser le code mais ca m interesse vraiment. Est ce que tu pourrais m expliquer comment factoriser ce code ?


    Merci encore a tous

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,

    Citation Envoyé par surfing_lezard Voir le message
    Je ne sais pas encore comment factoriser le code mais ca m interesse vraiment. Est ce que tu pourrais m expliquer comment factoriser ce code ?
    Hélas pas avant ce we et si j'ai assez de temps pour "construire" un truc qui me semble lisible.
    - W

  13. #13
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Pas de soucis wiztricks, ca serait super cool.

    Si tu connais des tutoriaux ou des articles sur le sujets je suis preneur.

    @ ++

Discussions similaires

  1. Class Python Tkinter
    Par Keyve dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/04/2012, 22h06
  2. Commencer avec les classes en Python
    Par Ismatus1 dans le forum Linux
    Réponses: 1
    Dernier message: 16/11/2011, 19h39
  3. python, tkinter et les sockets (et les threads)
    Par bomberwaterman dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 02/01/2009, 19h53
  4. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  5. Les classes amies en Delphi
    Par Bruno75 dans le forum Langage
    Réponses: 3
    Dernier message: 02/09/2003, 19h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo