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 :

[Tkinter] Afficher la liste des fichiers d'un dossier dans une fenêtre.


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut [Tkinter] Afficher la liste des fichiers d'un dossier dans une fenêtre.
    Bonjour,
    Je débute en Python.
    Je voudrais, après avoir lu un répertoire contenant des fichiers .txt, afficher dans une fenêtre la liste de ces fichiers.
    Pouvez-vous m'aider ( avec éventuellement des exemples ). Je n'ai rien trouvé pour le moment.
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par niduab Voir le message
    Bonjour,
    Je débute en Python.
    Je voudrais, après avoir lu un répertoire contenant des fichiers .txt, afficher dans une fenêtre la liste de ces fichiers.
    Pouvez-vous m'aider ( avec éventuellement des exemples ). Je n'ai rien trouvé pour le moment.
    Merci
    Bonjour,

    Avez-vous du code pour nous montrer où vous en êtes dans vos recherches ?

    Si vous ne savez pas par où commencer :

    documentation officielle sur les modules os, os.path :

    https://docs.python.org/3/library/os...nd-directories

    https://docs.python.org/3/library/os.path.html

    documentation officielle Tkinter pour les fenêtres graphiques :

    http://infohost.nmt.edu/tcc/help/pub...web/index.html

    D'après votre demande, le mieux reste encore d'acquérir les premières connaissances par vous-même, vous irez beaucoup plus vite une fois les bases assimilées.

    Écrivez au moins le code qui permet d'obtenir une liste de fichiers *.txt d'un dossier donné et ensuite je vous montrerais comment on écrit la partie GUI (Graphical User Interface), c'est-à-dire les fenêtres graphiques et tout ce qui est beaucoup moins évident à assimiler au départ.

    @+.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    Merci pour votre aide. Ci-dessous le code de mon 1° programme ( vraiment basique ), qui affiche une fenêtre avec 3 options:
    1 liste des recettes
    2 créer une recette
    3 quitter
    Lorsque je clique sur "liste des recettes", j'ai une fenêtre blanche qui s'ouvre.
    Comment récupérer la liste des fichiers pour les afficher dans la fénêtre ?
    Merci


    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
     
    from tkinter import *
    import os
    def creer():
        print("creer")
     
    def liste():
        Bliste.forget()
        Bcreer.forget()
        Bquitter.forget()   
        for filename in os.listdir("C:\Python34\Scripts\Recettes"):
            print(filename)
     
    fen = Tk()    
    fen.title("Menu")
     
    Bliste = Button(fen, text = "Liste des recettes ", bg = "green", font ="Arial 20 italic",relief = RIDGE ,borderwidth = 10, command = liste)
    Bliste.pack(expand = TRUE,fill = BOTH)#bouton liste des recettes
     
    Bcreer = Button(fen, text = "Créer une recette ", bg = "green", font ="Arial 20 italic",relief = RIDGE ,borderwidth = 10, command = creer)
    Bcreer.pack(expand = TRUE,fill = BOTH)   #bouton creer recette
     
    Bquitter = Button(fen, text = "Quitter", bg = "red", font ="Arial 20 italic",relief = RIDGE ,borderwidth = 10, command = fen.destroy)
    Bquitter.pack(expand = TRUE,fill = BOTH)   #bouton quitter
     
    fen.mainloop()

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Si tu parles de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        for filename in os.listdir("C:\Python34\Scripts\Recettes"):
            print(filename)
    c'est dans le terminal que Python print la liste, pas dans le fenêtre TK. Pour cela il faut y ajouter un widget adéquat et y envoyer la liste sous forme de texte.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Pour afficher une liste de... on peut utiliser le widget Text et une logique proche de:
    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
    import tkinter as tk
    import os
     
    def do_afficher():
        for s in os.listdir():
            display.insert('end', s + '\n')
     
    def create_display(app):
     
        display = tk.Text(app)
        return display
     
    if __name__ == '__main__':
        app = tk.Tk()
     
        display = create_display(app)
        btn = tk.Button(app, text='afficher', command=do_afficher)
        btn.pack()
        display.pack()
     
        app.mainloop()
    Après tout dépend des interactions que l'utilisateur aura avec... pour savoir si Text est approprié plutôt que Listbox ou autre...

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    Et merci pour vos réponses.
    Ce que je voudrais c'est afficher la liste dans un widget ListBox, afin de pouvoir sélectionner un fichier et l'afficher.
    Et c'est ça que je n'arrive pas à faire. Je vais m'inspirer de vos exemples, afin d'avancer. Mais bien sur je suis preneur d'autres exemples si vous en avez.
    Encore merci.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par niduab Voir le message
    Bonjour,
    Et merci pour vos réponses.
    Ce que je voudrais c'est afficher la liste dans un widget ListBox, afin de pouvoir sélectionner un fichier et l'afficher.
    Et c'est ça que je n'arrive pas à faire. Je vais m'inspirer de vos exemples, afin d'avancer. Mais bien sur je suis preneur d'autres exemples si vous en avez.
    Encore merci.
    Bonjour,

    Voici un exemple commenté pour vous aider à comprendre comment tout cela fonctionne :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import os
    import glob
    from tkinter import *
    from tkinter.scrolledtext import ScrolledText
    from tkinter import filedialog
     
    # zone de définition de fonctions
     
    def choisir_dossier ():
        "ouvre un dialogue de sélection de répertoire"
        # voir http://tkinter.unpythonic.net/wiki/tkFileDialog
        dossier = filedialog.askdirectory(
            title="Sélectionnez un dossier de recettes de cuisine",
            mustexist=True,
            parent=fenetre,
        )
        # un dossier a vraiment été sélectionné ?
        if dossier:
            # on remplit la liste de fichiers
            remplir_liste(dossier)
        # end if
    # end def
     
    def remplir_liste (dossier):
        """
            remplit la liste de fichiers à partir de l'emplacement
            @dossier fourni en paramètre de fonction;
        """
        # init globales
        global dossier_actuel
        # on conserve le dossier en cours de traitement
        dossier_actuel = dossier
        # on récupère la liste des fichiers
        _liste_fichiers = glob.glob(normaliser(dossier, motif_fichiers))
        # on met à jour la listbox à travers la variable de contrôle
        cvar_fichiers.set(" ".join(map(os.path.basename, _liste_fichiers)))
    # end def
     
    def normaliser (chemin, *args):
        "met un chemin de fichier en conformité avec l'OS utilisé"
        return os.path.normpath(os.path.join(chemin, *args))
    # end def
     
    def afficher_fichier (event):
        "affiche le contenu du fichier sélectionné"
        # on récupère le nom du fichier
        fichier = normaliser(
            dossier_actuel,
            liste_fichiers.get(liste_fichiers.curselection() or 0)
        )
        # est-ce réellement un fichier ?
        if os.path.isfile(fichier):
            # oui, on peut l'ouvrir
            with open(fichier) as file_in:
                # on efface d'abord la zone de texte
                affichage_texte.delete("1.0", END)
                # on insère le nouveau contenu texte du fichier
                affichage_texte.insert("1.0", file_in.read())
            # end with
        # end if
    # end def
     
    # début du programme
     
    # init variables globales
    dossier_actuel = ""
    motif_fichiers = "*.txt"
     
    # on commence par établir l'interface graphique (GUI)
    # on crée la fenêtre principale
    fenetre = Tk()
    fenetre.title("Mon livre de recettes")
    # SVP, NE FORCEZ PAS LA GÉOMÉTRIE de la fenêtre /!\
    # elle va s'adapter toute seule...
    #~ fenetre.geometry("1000x800") --> c'est NON !
    # d'autant plus qu'elle sera REDIMENSIONNABLE ensuite
    # on ajoute des composants graphiques à la fenêtre principale
    # on crée un conteneur pour la gestion des fichiers
    conteneur_fichiers = Frame(fenetre)
    # on rend le conteneur redimensionnable
    conteneur_fichiers.columnconfigure(0, weight=1)
    conteneur_fichiers.rowconfigure(1, weight=1)
    # on crée une étiquette texte dans ce conteneur
    Label(
        conteneur_fichiers,
        text="Veuillez sélectionner un fichier :"
    ).grid(row=0, column=0, sticky=EW)
    # on crée la liste des fichiers
    cvar_fichiers = StringVar()
    liste_fichiers = Listbox(conteneur_fichiers, listvariable=cvar_fichiers)
    liste_fichiers.grid(row=1, column=0, sticky=NS+EW)
    # avec sa scrollbar
    vbar_fichiers = Scrollbar(conteneur_fichiers, orient=VERTICAL)
    vbar_fichiers.grid(row=1, column=1, sticky=NS+W)
    # on connecte la scrollbar à la liste des fichiers
    liste_fichiers.configure(yscrollcommand=vbar_fichiers.set)
    vbar_fichiers.configure(command=liste_fichiers.yview)
    # on va gérer l'affichage des recettes sur simple clic
    # sur un fichier de la liste
    liste_fichiers.bind("<ButtonRelease-1>", afficher_fichier)
    # on crée un bouton de type 'Parcourir'
    Button(
        conteneur_fichiers,
        text="Sélectionner un dossier",
        command=choisir_dossier,
    ).grid(row=2, column=0)
    # on place le conteneur dans la fenêtre principale
    # avec des marges padx et pady
    conteneur_fichiers.grid(row=0, column=0, sticky=NS+EW, padx=5, pady=5)
    # on crée un conteneur pour l'affichage
    conteneur_affichage = Frame(fenetre)
    # on rend le conteneur redimensionnable
    conteneur_affichage.columnconfigure(0, weight=1)
    conteneur_affichage.rowconfigure(1, weight=1)
    # on crée une étiquette texte dans ce conteneur
    Label(
        conteneur_affichage,
        text="Recette du jour :"
    ).grid(row=0, column=0, sticky=EW)
    # on crée la zone d'affichage de texte
    affichage_texte = ScrolledText(
        conteneur_affichage,
        bg="white",
        fg="blue",
        font="sans 12 bold",
        height=10,
        width=20,
    )
    affichage_texte.grid(row=1, column=0, sticky=NS+EW)
    # on ajoute un bouton 'quitter'
    Button(
        conteneur_affichage,
        text="Quitter",
        command=fenetre.destroy
    ).grid(row=2, column=0, sticky=E)
    # on place le conteneur dans la fenêtre principale
    # avec des marges padx et pady
    conteneur_affichage.grid(row=0, column=1, sticky=NS+EW, padx=5, pady=5)
    # on rend la fenêtre redimensionnable
    fenetre.rowconfigure(0, weight=1)
    fenetre.columnconfigure(1, weight=1)
    # pour finir
    # on lance la boucle événementielle principale
    fenetre.mainloop()
    Essayez aussi - par la même occasion - de prendre dès à présent de bonnes habitudes en programmation Python (PEP 8) : http://legacy.python.org/dev/peps/pep-0008/

    Ainsi que PEP 0263 : http://legacy.python.org/dev/peps/pep-0263/

    Bon courage.

    @+.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Ce que je voudrais c'est afficher la liste dans un widget ListBox, afin de pouvoir sélectionner un fichier et l'afficher.
    Et c'est ça que je n'arrive pas à faire. Je vais m'inspirer de vos exemples, afin d'avancer. Mais bien sur je suis preneur d'autres exemples si vous en avez.
    Si on remplace Text par Listbox, çà ne change pas la forme du code, juste les détails de ce qu'on fait dans les fonctions appelées:
    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
     
    import tkinter as tk
    import os
     
    def do_afficher():
        display.insert(0, *os.listdir())
     
    def create_display(app):
        display = tk.Listbox(app)
        return display
     
    if __name__ == '__main__':
        app = tk.Tk()
     
        display = create_display(app)
        btn = tk.Button(app, text='afficher', command=do_afficher)
        btn.pack()
        display.pack()
     
        app.mainloop()
    Après faut essayer de décolérer les différentes opérations.
    La liste de fichiers n'est qu'une liste de chaînes de caractères.
    Une fois affichée dans la listbox, comment permettre à l'utilisateur de sélectionner et lancer une action associée à...
    C'est un cas d'utilisation assez classique d'une Listbox.
    En général, vous avez une réponse dans la FAQ: Comment récupérer un élément cliqué dans une Listbox ?

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Bonjour tarball69,
    Merci pour votre aide.
    Je vais m'inspirer de votre code pour essayer de l'adapter à mon projet, et surtout comprendre le fonctionnement
    Je vous tiens au courant.
    Merci à tous.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Merci Wiztricks,
    Je vais également regarder votre solution

  11. #11
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    @tarball69,

    J'ai adapté votre code à mon environnement. Mais malgré cela, lorsque la fenêtre "Mon livre de recettes" s'affiche, il n'y a rien.


    Nom : FenetreVide.jpg
Affichages : 6272
Taille : 25,9 Ko

    Je dois cliquer sur "Sélectionner un dossier", pour avoir la liste de tous les dossiers
    Ci-dessous le code que j'ai modifié. Ais-je loupé quelque chose ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # init variables globales
    dossier_actuel = "C:\Python34\Scripts\Recettes"
    motif_fichiers = "*.txt"
    #
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def normaliser (chemin, *args):
        "met un chemin de fichier en conformité avec l'OS utilisé"
        return os.path.normpath(os.path.join("C:\Python34\Scripts\Recettes", *args))

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par niduab Voir le message
    Bonjour,
    @tarball69,

    J'ai adapté votre code à mon environnement. Mais malgré cela, lorsque la fenêtre "Mon livre de recettes" s'affiche, il n'y a rien.
    C'est normal, c'est un exemple générique.

    Si vous voulez charger un dossier particulier dès le départ, mettez simplement ceci juste avant fenetre.mainloop() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # je veux...
    remplir_liste(r"C:\Python34\Scripts\Recettes")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def normaliser (chemin, *args):
        "met un chemin de fichier en conformité avec l'OS utilisé"
        return os.path.normpath(os.path.join("C:\Python34\Scripts\Recettes", *args))
    Euh là, non. Ne modifiez pas normaliser(), svp.

    Voici votre code adapté (regardez tout en bas du script) :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import os
    import glob
    from tkinter import *
    from tkinter.scrolledtext import ScrolledText
    from tkinter import filedialog
     
    # zone de définition de fonctions
     
    def choisir_dossier ():
        "ouvre un dialogue de sélection de répertoire"
        # voir http://tkinter.unpythonic.net/wiki/tkFileDialog
        dossier = filedialog.askdirectory(
            title="Sélectionnez un dossier de recettes de cuisine",
            mustexist=True,
            parent=fenetre,
        )
        # un dossier a vraiment été sélectionné ?
        if dossier:
            # on remplit la liste de fichiers
            remplir_liste(dossier)
        # end if
    # end def
     
    def remplir_liste (dossier):
        """
            remplit la liste de fichiers à partir de l'emplacement
            @dossier fourni en paramètre de fonction;
        """
        # init globales
        global dossier_actuel
        # on conserve le dossier en cours de traitement
        dossier_actuel = dossier
        # on récupère la liste des fichiers
        _liste_fichiers = glob.glob(normaliser(dossier, motif_fichiers))
        # on met à jour la listbox à travers la variable de contrôle
        cvar_fichiers.set(" ".join(map(os.path.basename, _liste_fichiers)))
    # end def
     
    def normaliser (chemin, *args):
        "met un chemin de fichier en conformité avec l'OS utilisé"
        return os.path.normpath(os.path.join(chemin, *args))
    # end def
     
    def afficher_fichier (event):
        "affiche le contenu du fichier sélectionné"
        # on récupère le nom du fichier
        fichier = normaliser(
            dossier_actuel,
            liste_fichiers.get(liste_fichiers.curselection() or 0)
        )
        # est-ce réellement un fichier ?
        if os.path.isfile(fichier):
            # oui, on peut l'ouvrir
            with open(fichier) as file_in:
                # on efface d'abord la zone de texte
                affichage_texte.delete("1.0", END)
                # on insère le nouveau contenu texte du fichier
                affichage_texte.insert("1.0", file_in.read())
            # end with
        # end if
    # end def
     
    # début du programme
     
    # init variables globales
    dossier_actuel = ""
    motif_fichiers = "*.txt"
     
    # on commence par établir l'interface graphique (GUI)
    # on crée la fenêtre principale
    fenetre = Tk()
    fenetre.title("Mon livre de recettes")
    # SVP, NE FORCEZ PAS LA GÉOMÉTRIE de la fenêtre /!\
    # elle va s'adapter toute seule...
    #~ fenetre.geometry("1000x800") --> c'est NON !
    # d'autant plus qu'elle sera REDIMENSIONNABLE ensuite
    # on ajoute des composants graphiques à la fenêtre principale
    # on crée un conteneur pour la gestion des fichiers
    conteneur_fichiers = Frame(fenetre)
    # on rend le conteneur redimensionnable
    conteneur_fichiers.columnconfigure(0, weight=1)
    conteneur_fichiers.rowconfigure(1, weight=1)
    # on crée une étiquette texte dans ce conteneur
    Label(
        conteneur_fichiers,
        text="Veuillez sélectionner un fichier :"
    ).grid(row=0, column=0, sticky=EW)
    # on crée la liste des fichiers
    cvar_fichiers = StringVar()
    liste_fichiers = Listbox(conteneur_fichiers, listvariable=cvar_fichiers)
    liste_fichiers.grid(row=1, column=0, sticky=NS+EW)
    # avec sa scrollbar
    vbar_fichiers = Scrollbar(conteneur_fichiers, orient=VERTICAL)
    vbar_fichiers.grid(row=1, column=1, sticky=NS+W)
    # on connecte la scrollbar à la liste des fichiers
    liste_fichiers.configure(yscrollcommand=vbar_fichiers.set)
    vbar_fichiers.configure(command=liste_fichiers.yview)
    # on va gérer l'affichage des recettes sur simple clic
    # sur un fichier de la liste
    liste_fichiers.bind("<ButtonRelease-1>", afficher_fichier)
    # on crée un bouton de type 'Parcourir'
    Button(
        conteneur_fichiers,
        text="Sélectionner un dossier",
        command=choisir_dossier,
    ).grid(row=2, column=0)
    # on place le conteneur dans la fenêtre principale
    # avec des marges padx et pady
    conteneur_fichiers.grid(row=0, column=0, sticky=NS+EW, padx=5, pady=5)
    # on crée un conteneur pour l'affichage
    conteneur_affichage = Frame(fenetre)
    # on rend le conteneur redimensionnable
    conteneur_affichage.columnconfigure(0, weight=1)
    conteneur_affichage.rowconfigure(1, weight=1)
    # on crée une étiquette texte dans ce conteneur
    Label(
        conteneur_affichage,
        text="Recette du jour :"
    ).grid(row=0, column=0, sticky=EW)
    # on crée la zone d'affichage de texte
    affichage_texte = ScrolledText(
        conteneur_affichage,
        bg="white",
        fg="blue",
        font="sans 12 bold",
        height=10,
        width=20,
    )
    affichage_texte.grid(row=1, column=0, sticky=NS+EW)
    # on ajoute un bouton 'quitter'
    Button(
        conteneur_affichage,
        text="Quitter",
        command=fenetre.destroy
    ).grid(row=2, column=0, sticky=E)
    # on place le conteneur dans la fenêtre principale
    # avec des marges padx et pady
    conteneur_affichage.grid(row=0, column=1, sticky=NS+EW, padx=5, pady=5)
    # on rend la fenêtre redimensionnable
    fenetre.rowconfigure(0, weight=1)
    fenetre.columnconfigure(1, weight=1)
     
    # pour démarrer avec un dossier par défaut,
    # ajoutez simplement ceci :
    # je veux...
    remplir_liste(r"C:\Python34\Scripts\Recettes")
     
    # pour finir
    # on lance la boucle événementielle principale
    fenetre.mainloop()
    à condition bien évidemment que ledit dossier contienne bien les fichiers attendus.

    @+.
    Dernière modification par Invité ; 18/08/2014 à 11h42. Motif: oubli du rawstring r"texte\texte"

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par niduab Voir le message
    Bonjour,
    @tarball69,
    Je dois cliquer sur "Sélectionner un dossier", pour avoir la liste de tous les dossiers
    Désolé, j'ai zappé une réponse.

    Le bouton "Sélectionner un dossier" sert à sélectionner le dossier qui est censé contenir vos recettes en fichiers *.txt, tout simplement.

    La boîte de dialogue qui s'ouvre vous permet de parcourir votre système de fichiers pour montrer au programme où se trouve le dossier qui contient vos fichiers.

    Mais, effectivement, si vous préférez désigner un dossier par défaut, faites simplement comme indiqué précédemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # je veux...
    remplir_liste(r"C:\Python34\Scripts\Recettes")
    juste avant le fenetre.mainloop(), ça devrait amplement suffire dans un premier temps.

    EDIT: euh, je viens de remarquer un truc pas très recommandé : vous mettez vos recettes dans "C:\Python34\Scripts\Recettes" ?

    évitez de placer vos données personnelles dans le dossier du langage Python.

    créez-vous plutôt un dossier personnel 'Recettes' dans "Mes Documents" ou sur le "Bureau" de votre session, ce sera plus prudent.

    @+.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Super, c'est exactement ce que je voulais obtenir.
    Dans la fenêtre de gauche, j'ai la liste de mes recettes, et dans celle de droite le contenu de la recette sélectionnée.
    Nom : FenetreOk.jpg
Affichages : 7689
Taille : 29,6 Ko
    Je vais adapter ce code à mon projet, et je vous tiens au courant.
    Je vais également tenir compte de votre remarque et créer un dossier en dehors de python.
    Encore merci.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par niduab Voir le message
    Super, c'est exactement ce que je voulais obtenir.
    Dans la fenêtre de gauche, j'ai la liste de mes recettes, et dans celle de droite le contenu de la recette sélectionnée.
    Nom : FenetreOk.jpg
Affichages : 7689
Taille : 29,6 Ko
    Je vais adapter ce code à mon projet, et je vous tiens au courant.
    Je vais également tenir compte de votre remarque et créer un dossier en dehors de python.
    Encore merci.
    Super.

    Pensez à cliquer si vous estimez que cette discussion est close.

    @+.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 9
    Points : 14
    Points
    14
    Par défaut
    Bonjour tarball69,
    Je reviens vers vous. Je rencontre un peu souci. Lorsque le nom de mes fichiers comporte des espaces, ( exemple : salade de papaye.txt ) j'obtiens ceci dans l'affichage de ma Listbox.

    Nom : Salade de papaye.gif
Affichages : 6995
Taille : 8,2 Ko

    C'est à dire 3 fichiers "salade", "de" et "papaye.txt" au lieu du fichier "salade de papaye.txt".
    Je n'arrive pas à afficher ce fichier sur une même ligne.
    Merci pour votre aide.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par niduab Voir le message
    Bonjour tarball69,
    Je reviens vers vous. Je rencontre un peu souci. Lorsque le nom de mes fichiers comporte des espaces, ( exemple : salade de papaye.txt ) j'obtiens ceci dans l'affichage de ma Listbox.

    Nom : Salade de papaye.gif
Affichages : 6995
Taille : 8,2 Ko

    C'est à dire 3 fichiers "salade", "de" et "papaye.txt" au lieu du fichier "salade de papaye.txt".
    Je n'arrive pas à afficher ce fichier sur une même ligne.
    Merci pour votre aide.
    Bonjour,

    C'est malheureusement le fonctionnement par défaut de la variable de contrôle de la Listbox() tkinter qui engendre cet effet de bord : http://infohost.nmt.edu/tcc/help/pub...b/listbox.html

    Extrait :

    option: listvariable

    A StringVar that is connected to the complete list of values in the listbox (see Section 52, “Control variables: the values behind the widgets”.

    If you call the .get() method of the listvariable, you will get back a string of the form "('v0', 'v1', ...)", where each vi is the contents of one line of the listbox.

    To change the entire set of lines in the listbox at once, call .set(s) on the listvariable, where s is a string containing the line values with spaces between them.

    For example, if listCon is a StringVar associated with a listbox's listvariable option, this call would set the listbox to contain three lines:

    listCon.set('ant bee cicada')
    This call would return the string "('ant', 'bee', 'cicada')":

    listCon.get()
    C'est un fonctionnement qui oblige paradoxalement à se passer de variable de contrôle et à utiliser les méthodes de la listbox en direct :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import os
    import glob
    from tkinter import *
    from tkinter.scrolledtext import ScrolledText
    from tkinter import filedialog
     
    # zone de définition de fonctions
     
    def choisir_dossier ():
        "ouvre un dialogue de sélection de répertoire"
        # voir http://tkinter.unpythonic.net/wiki/tkFileDialog
        dossier = filedialog.askdirectory(
            title="Sélectionnez un dossier de recettes de cuisine",
            mustexist=True,
            parent=fenetre,
        )
        # un dossier a vraiment été sélectionné ?
        if dossier:
            # on remplit la liste de fichiers
            remplir_liste(dossier)
        # end if
    # end def
     
    def remplir_liste (dossier):
        """
            remplit la liste de fichiers à partir de l'emplacement
            @dossier fourni en paramètre de fonction;
        """
        # init globales
        global dossier_actuel
        # on conserve le dossier en cours de traitement
        dossier_actuel = dossier
        # on récupère la liste des fichiers
        _liste_fichiers = glob.glob(normaliser(dossier, motif_fichiers))
        # on vide d'abord la listbox
        listbox_fichiers.delete(0, END)
        # on remplit via les méthodes de la listbox
        listbox_fichiers.insert(END, *_liste_fichiers)
    # end def
     
    def normaliser (chemin, *args):
        "met un chemin de fichier en conformité avec l'OS utilisé"
        return os.path.normpath(os.path.join(chemin, *args))
    # end def
     
    def afficher_fichier (event):
        "affiche le contenu du fichier sélectionné"
        # on récupère le nom du fichier
        fichier = normaliser(
            dossier_actuel,
            listbox_fichiers.get(listbox_fichiers.curselection() or 0)
        )
        # est-ce réellement un fichier ?
        if os.path.isfile(fichier):
            # oui, on peut l'ouvrir
            with open(fichier) as file_in:
                # on efface d'abord la zone de texte
                affichage_texte.delete("1.0", END)
                # on insère le nouveau contenu texte du fichier
                affichage_texte.insert("1.0", file_in.read())
            # end with
        # end if
    # end def
     
    # début du programme
     
    # init variables globales
    dossier_actuel = ""
    motif_fichiers = "*.txt"
     
    # on commence par établir l'interface graphique (GUI)
    # on crée la fenêtre principale
    fenetre = Tk()
    fenetre.title("Mon livre de recettes")
    # SVP, NE FORCEZ PAS LA GÉOMÉTRIE de la fenêtre /!\
    # elle va s'adapter toute seule...
    #~ fenetre.geometry("1000x800") --> c'est NON !
    # d'autant plus qu'elle sera REDIMENSIONNABLE ensuite
    # on ajoute des composants graphiques à la fenêtre principale
    # on crée un conteneur pour la gestion des fichiers
    conteneur_fichiers = Frame(fenetre)
    # on rend le conteneur redimensionnable
    conteneur_fichiers.columnconfigure(0, weight=1)
    conteneur_fichiers.rowconfigure(1, weight=1)
    # on crée une étiquette texte dans ce conteneur
    Label(
        conteneur_fichiers,
        text="Veuillez sélectionner un fichier :"
    ).grid(row=0, column=0, sticky=EW)
    # on crée la liste des fichiers
    #~ cvar_fichiers = StringVar() # devenu INUTILE (vous pouvez supprimer)
    #~ listbox_fichiers = Listbox(conteneur_fichiers, listvariable=cvar_fichiers) # IDEM ici (à supprimer)
     
    # ATTENTION: le NOM de la globale a été CHANGÉ
    # de 'liste_fichiers' à 'listbox_fichiers' /!\
    # tenez-en compte lors de la mise à jour de vos propres scripts /!\
    listbox_fichiers = Listbox(conteneur_fichiers)
    listbox_fichiers.grid(row=1, column=0, sticky=NS+EW)
     
    # avec sa scrollbar
    vbar_fichiers = Scrollbar(conteneur_fichiers, orient=VERTICAL)
    vbar_fichiers.grid(row=1, column=1, sticky=NS+W)
    # on connecte la scrollbar à la liste des fichiers
    listbox_fichiers.configure(yscrollcommand=vbar_fichiers.set)
    vbar_fichiers.configure(command=listbox_fichiers.yview)
    # on va gérer l'affichage des recettes sur simple clic
    # sur un fichier de la liste
    listbox_fichiers.bind("<ButtonRelease-1>", afficher_fichier)
    # on crée un bouton de type 'Parcourir'
    Button(
        conteneur_fichiers,
        text="Sélectionner un dossier",
        command=choisir_dossier,
    ).grid(row=2, column=0)
    # on place le conteneur dans la fenêtre principale
    # avec des marges padx et pady
    conteneur_fichiers.grid(row=0, column=0, sticky=NS+EW, padx=5, pady=5)
    # on crée un conteneur pour l'affichage
    conteneur_affichage = Frame(fenetre)
    # on rend le conteneur redimensionnable
    conteneur_affichage.columnconfigure(0, weight=1)
    conteneur_affichage.rowconfigure(1, weight=1)
    # on crée une étiquette texte dans ce conteneur
    Label(
        conteneur_affichage,
        text="Recette du jour :"
    ).grid(row=0, column=0, sticky=EW)
    # on crée la zone d'affichage de texte
    affichage_texte = ScrolledText(
        conteneur_affichage,
        bg="white",
        fg="blue",
        font="sans 12 bold",
        height=10,
        width=20,
    )
    affichage_texte.grid(row=1, column=0, sticky=NS+EW)
    # on ajoute un bouton 'quitter'
    Button(
        conteneur_affichage,
        text="Quitter",
        command=fenetre.destroy
    ).grid(row=2, column=0, sticky=E)
    # on place le conteneur dans la fenêtre principale
    # avec des marges padx et pady
    conteneur_affichage.grid(row=0, column=1, sticky=NS+EW, padx=5, pady=5)
    # on rend la fenêtre redimensionnable
    fenetre.rowconfigure(0, weight=1)
    fenetre.columnconfigure(1, weight=1)
     
    # pour démarrer avec un dossier par défaut,
    # ajoutez simplement ceci :
    # je veux...
    remplir_liste(r"C:\Python34\Scripts\Recettes")
    # test débogage tarball69 ne pas enlever - merci
    #~ remplir_liste("./")
     
    # pour finir
    # on lance la boucle événementielle principale
    fenetre.mainloop()
    La belle théorie voudrait que l'on pilote les objets visuels tkinter à travers leurs variables de contrôle respectives.

    Le cas tkinter.Listbox est une bien malheureuse contradiction de ce concept.

    Mais bon, tant qu'on peut trouver d'autres solutions, il n'y a pas de quoi se rouler par terre de désespoir.

    @+.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    C'est malheureusement le fonctionnement par défaut de la variable de contrôle de la Listbox() tkinter qui engendre cet effet de bord : http://infohost.nmt.edu/tcc/help/pub...b/listbox.html

    La belle théorie voudrait que l'on pilote les objets visuels tkinter à travers leurs variables de contrôle respectives.

    Le cas tkinter.Listbox est une bien malheureuse contradiction de ce concept.

    Mais bon, tant qu'on peut trouver d'autres solutions, il n'y a pas de quoi se rouler par terre de désespoir.
    Des "espaces" (et autre caractères non alphanumériques) dans les noms de fichiers ne sont pas "recommandables" pour des noms de fichiers accédés "programmatiquement": çà fout la grouille dans pleins d'interfaces "anciennes" mais bien plus efficaces "sans" avoir à gérer tous ces cas.

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

  19. #19
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Sujet intéressant. J'ai testé pour voir et cela ne marche pas chez moi (ubuntu). J'ai oublié quelque chose ?
    Pas d'aide par mp.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Sujet intéressant. J'ai testé pour voir et cela ne marche pas chez moi (ubuntu). J'ai oublié quelque chose ?
    Bonjour,

    Si vous regardez bien en bas du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # pour démarrer avec un dossier par défaut,
    # ajoutez simplement ceci :
    # je veux...
    remplir_liste(r"C:\Python34\Scripts\Recettes")
    # test débogage tarball69 ne pas enlever - merci
    #~ remplir_liste("./")
     
    # pour finir
    # on lance la boucle événementielle principale
    fenetre.mainloop()
    Le code est adapté à Windows

    Pour linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # pour démarrer avec un dossier par défaut,
    # ajoutez simplement ceci :
    # je veux...
    ##remplir_liste(r"C:\Python34\Scripts\Recettes")
    # test débogage tarball69 ne pas enlever - merci
    remplir_liste("./")
     
    # pour finir
    # on lance la boucle événementielle principale
    fenetre.mainloop()
    mettez ensuite des fichiers texte bidons + un contenu texte différent pour chaque fichier texte (pour bien visualiser les exemples), le tout dans le même répertoire que votre script et cela devrait fonctionner.

    @+.

Discussions similaires

  1. liste récursive des fichiers d'un dossier dans une liste
    Par identifiant_bidon dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2010, 16h33
  2. récupérer la liste des fichiers d'un dossier dans un fichier texte
    Par mathieu_r dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 26/04/2009, 19h47
  3. Réponses: 1
    Dernier message: 06/02/2009, 17h58
  4. [E-03] ListBox avec liste des fichiers d'un dossier
    Par Daejung dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/11/2008, 01h43
  5. Réponses: 4
    Dernier message: 11/07/2007, 19h28

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