Besoin d'aide pour afficher fichiers .csv avec listbox

Bonjour ,
j’enregistre des datas provenant d’une sonde dans un dossier Data sur raspberry 5 .
J’utilise un script listbox trouvé sur le net (je remercie le concepteur)pour afficher les fichiers dans Data.
Je ne comprends pas pourquoi les fichiers qui s’affichent dans la listbox ne sont pas dans l’ordre établi dans le dossier Data à savoir qu’ils horodatés . idem si je mets des fichiers.jpg ou autres. Je joins le script .
Si quelqu’un peut m’aider je serais ravi. Merci par avance. Jean

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import os
import glob
from tkinter import *
from tkinter.scrolledtext import ScrolledText
from tkinter import filedialog
 
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 = "*.csv"
 
# on commence par établir l'interface graphique (GUI)
# on crée la fenêtre principale
fenetre = Tk()
fenetre.title("Liste Data.csv")
# 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)

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="fichier .csv :"
).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 ("./")
# remplir_liste("/home/mpv/Data")
 # pour finir
# on lance la boucle événementielle principale
fenetre.mainloop()

Yo @grandjean ,

A priori, ton dossier est configuré pour un affichage selon TES choix.
Mais ce script fait juste SON job.
Tu peux ajouter une fonction pour que le script fasse comme tu veux.
J’imagine que cela se fait en utilisant la méthode os.path.getmtime() pour obtenir l’horodatage de modification de chaque fichier.

Pour ta remarque

Je ne comprends pas trop.
Le script précise bien : motif_fichiers = "*.csv" ; ce qui signifie qu’il ne va afficher QUE les fichiers en CSV.
Si tu veux du CSV et du JPG, alors, il te faut une liste : motifs_fichiers = ["*.csv", "*.jpg"].

Espérant avoir compris ta requête,

++

Bonjour et merci pour ta réponse.
Je pense que je n’ai pas très bien exposé mon problème .
En fait quelque soit le type de fichier que je mets dans un dossier à savoir si je veux que ma listbox affiche du .jpg je le précise dans le motif_fichiers. Ça c’est bon.
Le problème est le suivant : j’enregistre 3 fichiers nommés A, B, C dans (pi) mpv pour moi.
lorsque j’ouvre ce dossier les fichiers sont dans l’ordre A, B, C par contre quand j’ouvre ma listbox ils s’affichent dans ordre aléatoire.
A présent je veux que ma listbox affiche du .csvje le précise dans le motif_fichiers.
même chose pour les fichiers .csv (horodatés par la sonde) sont envoyés dans le dossier, se rangent dans l’ordre même sur plusieurs jours . Exemple 3 fichiers .csv (30.01.2025-10.32.20.csv), (07.02.2025-08.32.10.csv), (09.02.2025-12.40.csv).
Maintenant si je lance la listbox l’affichage me donne ceci par exemple :(07.02.2025-08.32.10.csv), (30.01.2025-10.32.20.csv),(09.02.2025-12.40.csv).
J’espère avoir été plus clair à présent.
Si vous avez une idée je prends, par avance merci
Jean Grandjean

Yo,
L’ordre d’affichage dans ton dossier est une affaire de réglage système.
L’ordre d’affichage dans ton encart « Listbox » est une affaire de programmation (c’est lié au script).
Tu vas devoir ajouter une fonction pour que le script fasse la liste comme tu veux.
A propri, en utilisant la méthode os.path.getmtime() tu permettras au script d’obtenir l’info d’horodatage (ce qui sera la base pour faire un tri).
++

Merci Nabla pour ta réponse,
Aujourd’hui mon programme pour la sonde fait déjà une partie du boulot a savoir :
#Horodateur
Time = (datetime.datetime.now().strftime(« %s.%f »)[:-3])
self.filename = strftime(« %m-%d-%Y-%H-%M ») + ‹ .csv ›
self.file = None
if self.file is None:
print(« Opening %s for write. » % (self.filename))
self.file = open(self.filename, ‹ w ›)
data = [str(AngX)]
self.file.write(str(Time) + ‹ ; › + ‹ ; ›.join(data) + ‹ \n ›)
Alors mes programmes se trouvent dans le même dossier par exemple Data.
Les enregistrements de la sonde se retrouvent dans Data sous la forme :
strftime(« %m-%d-%Y-%H-%M ») + ‹ .csv ›, ils sont donc dans l’ordre par date et heure .
Mais effectivement ceci provient du système.
Je dois donc travailler sur la prog listbox. Si je lance le programme de lecture par listbox je vois tous les enregistrements mais en désordre.
Je dois modifier mon prog pour inclure os.path.getmtime() dans mon programme listbox
mais j’avoue que je sèche à ce niveau.
Je continu mes recherches car je pense que le problème se trouve par là
+++

Bonjour Nabla,
Alors j’ai fini par trouver, je remplace la ligne suivante
_liste_fichiers = glob.glob(normaliser(dossier, motif_fichiers))
par :
_liste_fichiers.sort(key=os.path.getmtime)

  • mes fichiers sont à présent classer par date
    Merci encore pour ton info
    ++

Nice!

Merci pour ton retour et la solution explicite.
C’est bien l’idée d’un forum :wink: