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

  1. #1
    Membre habitué
    petit bug sur sur la fonction d'appel de tkinter
    Bonjour

    Je ne parviens pas a voir comment détecter et prendre en charge le fait de cliquer sur le bouton annuler dans ce programme.
    Sur tout comment régler lemassage d'exception AttributeError dans l'appel
    line 54, in <module>
    if le_fichier.nom_fichier == None:
    AttributeError: 'recherche_fichier' object has no attribute 'nom_fichier'

    il semble que ce soit def explorateur_window(repertoireinit):

    La classe class recherche_fichier(): contient bien 3 variables dont la zone nom_fichier

    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
    # coding: utf-8  
    import threading
     
    import tkinter 
    from tkinter.filedialog import askopenfilename
    import os 
     
     
    '''Created on 21 aout 2017 
    @ 
    '''
    def explorateur_window(repertoireinit):
        """ Explorateur Windows    """
        root = tkinter.Tk()
     
        filename = tkinter.filedialog.askopenfilename(
            initialdir=repertoireinit,
            title="Choisir votre fichier",
            filetypes=(
                ("Tous type de fichier","*.*") ,
            )
        )
     
        return filename
    pass
     
    class recherche_fichier():
        nom_fichier :str
        repertoire : str
        nom_complet: str 
     
     
        def __init__(self,depart):
            '''
            Constructor
            '''
            nom_fichier = None
            repertoire = None
            nom_complet = None
     
            self.nom_complet = explorateur_window(depart) # Recherche via explorateur  nom_fichier_path_in
     
            if self.nom_complet != None :
                if os.path.isfile(self.nom_complet):
     
                # Ouverture du fichier destination
                    self.nom_fichier = os.path.basename(self.nom_complet) # Retourne le nom du fichier
                    #print(self.nom_fichier)
                    self.repertoire = os.path.dirname(self.nom_complet) # Retourne le répertoire complet
                    #print(self.repertoire  )
     
    if __name__ == '__main__':
        le_fichier = recherche_fichier(".//")
        if le_fichier.nom_fichier == None:
            print("Pas de fichier choisi" )
        else:
            print(le_fichier)
            print(le_fichier.repertoire)
            print(le_fichier.nom_fichier)

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par dedalios Voir le message
    Je ne parviens pas a voir comment détecter et prendre en charge le fait de cliquer sur le bouton annuler dans ce programme.
    Cliquer sur Annuler fera retourner une chaine vide à askopenfilename.

    Pour ce qui est de:
    Citation Envoyé par dedalios Voir le message
    line 54, in <module>
    if le_fichier.nom_fichier == None:
    AttributeError: 'recherche_fichier' object has no attribute 'nom_fichier'
    Dans votre code nom_fichier est une variable locale et non attribut d'instance.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent
    Salut,
    Ici:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
            self.nom_fichier = None
            self.repertoire = None
            self.nom_complet = None


    Là par contre:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        nom_fichier :str
        repertoire : str
        nom_complet: str

    quelle est ton intention ?

  4. #4
    Membre habitué
    correction-
    merci

    voici donc la correction (effectivement j'avais homis le paramètre self. sur les 3 variables de class dans l'iniitialisation)
    sur cette version j'utilise
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    from dataclasses import dataclass

    et je paramètre l'initilisation

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @dataclass
    class recherche_fichier():
        nom_fichier :str = None
        repertoire : str = None
        nom_complet: str = None
        ...


    le premier code est un melange erronée


    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
    # coding: utf-8  
    # coding: utf-8  
     
    from dataclasses import dataclass
    import tkinter 
    from tkinter.filedialog import askopenfilename
    import os 
     
     
    def explorateur_window(repertoireinit):
        """ Explorateur Windows    """
        root = tkinter.Tk()
     
        filename = tkinter.filedialog.askopenfilename(
            initialdir=repertoireinit,
            title="Choisir votre fichier",
            filetypes=(
                ("Tous type de fichier","*.*") ,
            )
        )
     
        return filename
    pass
    @dataclass
    class recherche_fichier():
        nom_fichier :str = None
        repertoire : str = None
        nom_complet: str = None
     
     
        def __init__(self,depart):
            '''
            Constructor
             '''
     
            self.nom_complet = explorateur_window(depart) # Recherche via explorateur  nom_fichier_path_in
     
            #print(self.nom_complet )
     
            if os.path.isfile(self.nom_complet):
     
            # Ouverture du fichier destination
                self.nom_fichier = os.path.basename(self.nom_complet) # Retourne le nom du fichier
                #print(self.nom_fichier)
                self.repertoire = os.path.dirname(self.nom_complet) # Retourne le répertoire complet
                #print(self.repertoire  )
     
    if __name__ == '__main__':
        le_fichier = recherche_fichier(".//")
        print(le_fichier)
        if le_fichier.nom_fichier == None:
            print("pas de fichier choisie")
        else:
            print(le_fichier.repertoire)
            print(le_fichier.nom_fichier)

###raw>template_hook.ano_emploi###