Python tkinter naviguer avec le clavier dans os.listdir

Bonjour à tous !

Etant débutant en programmation python, je tente de créer une interface me permettant de parcourir et exécuter des fichiers. 

Le programme fonctionne plutôt correctement, à part que je ne parviens absolument pas a :

  • Utiliser le clavier dans le cadre de la navigation et l'exécution des fichiers. 
  • Faire apparaître une scrollbar pour parcourir l'intégralité du contenu du dossier.

J'ai tenté des pistes trouvées sur le net mais sans succès

Je me permets d'ajouter la fonction concernée. Mes excuses par avance si mon code n'est pas académique :)

Merci pour votre aide !

def list_files_exe():
    global frame, image_references  
    frame.destroy()  

    selection_window2 = tk.Toplevel(root)
    selection_window2.title("Selectionnez une option")
    selection_window2.attributes('-fullscreen', True)
    folder_path = "chemin_du_dossier"  
    files = os.listdir(folder_path)

# Filtre des fichiers avec l'extension ".exe"
    exe_files = [file for file in files if file.endswith(".exe")]

    image_references = []  # Réinitialiser la liste des références d'images
    
#chemin vers le dossier "covers" 
    covers_folder_path = "chemin_des_covers" 
 

#Association des fichiers avec une image
    for file in exe_files:
        cover_path = os.path.join(covers_folder_path, file.replace(".exe", ".jpg"))

        try:
            cover_image = Image.open(cover_path)
            cover_image = cover_image.resize((650, 300))  
            photo_cover = ImageTk.PhotoImage(cover_image)
            image_references.append(photo_cover) 

        except Exception as e:
            
            print(f"Erreur lors du chargement de l'image pour {file}: {e}")
            default_image = Image.open("image_de_substitution")  
            default_image = default_image.resize((150, 150))  
            photo_cover = ImageTk.PhotoImage(default_image)
            image_references.append(photo_cover)  

    frame = tk.Frame(selection_window2, bg='black')
    frame.pack(fill=tk.BOTH, expand=True)

    frame.columnconfigure(0, weight=1)
    frame.columnconfigure(1, weight=1)
    frame.columnconfigure(2, weight=1)
    frame.rowconfigure(0, weight=1)
    frame.rowconfigure(1, weight=1)
    frame.rowconfigure(2, weight=1)

    for i, file in enumerate(exe_files):
        label = tk.Label(frame, text=file, image=image_references[i], compound="top")
        label.grid(row=i // 3, column=i % 3, padx=10, pady=5, sticky="nsew")
        def open_file(file_path):
            os.startfile(file_path)


        label.grid_propagate(False)  # Empêcher le réglage automatique de la taille du label
        label.grid_rowconfigure(0, weight=1)
        label.grid_columnconfigure(0, weight=1)
        label.configure(image=image_references[i])

        label.bind("<Button-1>", lambda event, file_path=os.path.join(folder_path, file): open_file(file_path))

8 réponses

  1. Bah, un jour on aura bien une réponse ....

    0
    1. L'idéal serait que tu nous explique exactement et en détails ce que

      ton code est censé faire

      Pour moi, tu veux afficher les exécutables d'un répertoire, et en exécuter

      en cliquant sur le nom dans la liste, c'est ça ?

      Si c'est ça, ça doit se faire plus simplement ...

      Est-ce que ça pourrait être ça ? :

      import os
      from tkinter import *
      from tkinter import filedialog
      
      def run_exe():
      
          filename= filedialog.askopenfilename(initialdir="C:/Phil/Dev/Python/tests", title="Selectionner un exe",
          filetypes=(("executables","*.exe"), ("all files", "*.*")))
          os.system(filename)
      
      WIDTH, HEIGHT = 400, 400
      
      main_win = Tk()
      main_win.title('Test : appuyer sur Entrée')
      main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+400+100')
      
      Button(main_win, text="Lancer un executable", command=run_exe).place(x=100, y=100)
      
      main_win.mainloop()
      0
      1. Bonjour,

        Si tu as vraiment copié/collé mon code sans rien y changer, tu appuies

        sur Entrée et tu vois la liste des fichiers de ton répertoire courant

        C'est juste un exemple

        Chez moi ça donne ceci:

        Ca, c'est bizarre, tu veux faire quoi exactement ? : 

        ​button1.bind("<Enter>", on_enter_btn1)
        

        Ton code remis en ordre

        Pas facile à tester, on n'a pas tes images ni les mêmes chemins que toi :

        import tkinter as tk
        from PIL import Image, ImageTk
        import os
        
        def Sous_menu_jeux():
            ''' Fonction pour afficher le sous-menu des jeux '''
           
            global frame, button_snes, button_n64, button_nswitch, button_PS1, button_PS2, button_PS3, button_Xbox, button_Multijoueur  # Utiliser les variables globales frame et button_snes
           
            #Fond SNES    
            fond_snes = Image.open('snes.jpg')
            fond_snes = fond_snes.resize((450, 150))
            photo_snes = ImageTk.PhotoImage(fond_snes)
            image_references.append(photo_snes)  # Ajouter la référence de l'image à la liste
        
            #Fond N64
            fond_n64 = Image.open('cc.jpg')
            fond_n64 = fond_n64.resize((450, 150))
            photo_n64 = ImageTk.PhotoImage(fond_n64)
            image_references.append(photo_n64)  # Ajouter la référence de l'image à la liste
        
            #nswitch
            fond_nswitch = Image.open('NSwitch.png')
            fond_nswitch = fond_nswitch.resize((450, 150))
            photo_nswitch = ImageTk.PhotoImage(fond_nswitch)
            image_references.append(photo_nswitch)  # Ajouter la référence de l'image à la liste
        
            #PS1
            fond_ps1 = Image.open('play1.jpg')
            fond_ps1 = fond_ps1.resize((450, 150))
            photo_ps1 = ImageTk.PhotoImage(fond_ps1)
            image_references.append(photo_ps1)  # Ajouter la référence de l'image à la liste
        
            #PS2
            fond_ps2 = Image.open('ps22.png')
            fond_ps2 = fond_ps2.resize((450, 150))
            photo_ps2 = ImageTk.PhotoImage(fond_ps2)
            image_references.append(photo_ps2)  # Ajouter la référence de l'image à la liste
        
            #PS3
            fond_ps3 = Image.open('ps3-logo2.png')
            fond_ps3 = fond_ps3.resize((450, 150))
            photo_ps3 = ImageTk.PhotoImage(fond_ps3)
            image_references.append(photo_ps3)  # Ajouter la référence de l'image à la liste
        
            #Xbox
            fond_xbox = Image.open('xbox.png')
            fond_xbox = fond_xbox.resize((450, 150))
            photo_xbox = ImageTk.PhotoImage(fond_xbox)
            image_references.append(photo_xbox)  # Ajouter la référence de l'image à la liste
        
            #Multi
            fond_multi = Image.open('online.png')
            fond_multi = fond_multi.resize((450, 150))
            photo_multi = ImageTk.PhotoImage(fond_multi)
            image_references.append(photo_multi)  # Ajouter la référence de l'image à la liste
        
            #Home
            fond_home = Image.open('home.png')
            fond_home = fond_home.resize((450, 150))
            photo_home = ImageTk.PhotoImage(fond_home)
            image_references.append(photo_home)  # Ajouter la référence de l'image à la liste
        
            # Créer une fenêtre pour le sous-menu
            selection_window = tk.Toplevel(root)
            selection_window.title("Selectionnez une option")
            selection_window.attributes('-fullscreen', True)
        
            frame = tk.Frame(selection_window, bg='white')
            frame.pack(fill=tk.BOTH, expand=True)
            # Configurer les options de colonnes et lignes pour que les boutons s'étendent correctement
            frame.columnconfigure(0, weight=1)
            frame.columnconfigure(1, weight=1)
            frame.columnconfigure(2, weight=1)
            frame.rowconfigure(0, weight=1)
            frame.rowconfigure(1, weight=1)
            frame.rowconfigure(2, weight=1)
        
            # Bouton "Super Nintendo"
            button_snes = tk.Button(frame, image=photo_snes, text="Super Nintendo", compound='top', font=("Arial", 24), bg='black', fg='white', command=lambda:[list_files_snes(),selection_window.destroy()])
            button_snes.grid(row=0, column=0, sticky="nsew")
        
            # Autres boutons pour les consoles de jeux
            button_n64 = tk.Button(frame, image=photo_n64, text="Nintendo 64",compound='top', font=("Arial", 24),bg='black',fg='white', command=lambda:[list_files_n64(),selection_window.destroy()])
            button_n64.grid(row=0, column=1, sticky="nsew")
        
            button_nswitch = tk.Button(frame, image=photo_nswitch, text="Nintendo Switch",compound="top", font=("Arial", 24),bg='black',fg='white')
            button_nswitch.grid(row=0, column=2, sticky="nsew")
        
            button_PS1 = tk.Button(frame, image=photo_ps1, text="PlayStation 1", compound="top", font=("Arial", 24),bg='black',fg='white')
            button_PS1.grid(row=1, column=0, sticky="nsew")
        
            button_PS2 = tk.Button(frame, image=photo_ps2, text="PlayStation 2",compound="top", font=("Arial", 24),bg='black',fg='white')
            button_PS2.grid(row=1, column=1, sticky="nsew")
        
            button_PS3 = tk.Button(frame, image=photo_ps3, text="PlayStation 3", compound="top", font=("Arial", 24),bg='black',fg='white')
            button_PS3.grid(row=1, column=2, sticky="nsew")
        
            button_Xbox = tk.Button(frame, image=photo_xbox, text="X box", font=("Arial", 24), compound="top", bg='black',fg='white')
            button_Xbox.grid(row=2, column=0, sticky="nsew")
        
            button_Multijoueur = tk.Button(frame,image=photo_multi, text="Multi-joueur", font=("Arial", 24), compound="top", bg='black',fg='white')
            button_Multijoueur.grid(row=2, column=1, sticky="nsew")
        
            button_home = tk.Button(frame, image=photo_home, text="Accueil", font=("Arial", 24), compound="top", bg='green',fg='white',command=selection_window.destroy)
            button_home.grid(row=2, column=2, sticky="nsew")
        
            # Mettre à jour l'image sur les boutons de CONSOLE
            button_snes.configure(image=photo_snes)
            button_n64.configure(image=photo_n64)
            button_nswitch.configure(image=photo_nswitch)
            button_PS1.configure(image=photo_ps1)
            button_PS2.configure(image=photo_ps2)
            button_PS3.configure(image=photo_ps3)
            button_Xbox.configure(image=photo_xbox)
        
        def list_files_snes():
            ''' Affichage des jeux SNES '''
        
            global frame, image_references  # Utiliser la variable globale frame
            frame.destroy()  # Supprimer le frame actuel pour afficher les labels des fichiers
        
            # Créer une nouvelle fenêtre pour afficher la liste des jeux N64
            selection_window2 = tk.Toplevel(root)
            selection_window2.title("Selectionnez une option")
            selection_window2.attributes('-fullscreen', True)
        
            folder_path = "C:\\Users\\aya\\Desktop\\abox\\Game\\Snes"  # Remplacez par le chemin de votre dossier
            files = os.listdir(folder_path)
        
            # Filtrer les fichiers pour ne garder que ceux avec l'extension ".sfc"
            snes_files = [file for file in files if file.endswith(".sfc")]
        
            image_references = []  # Réinitialiser la liste des références d'images
            covers_folder_path = "C:\\Users\\aya\\source\\repos\\manuel\\snes_cover"  # Spécifiez le chemin complet vers le dossier "covers" sur votre bureau
            for file in snes_files:
                cover_path = os.path.join(covers_folder_path, file.replace(".sfc", ".jpg"))
                try:
                    cover_image = Image.open(cover_path)
                    cover_image = cover_image.resize((650, 300))  # Redimensionner l'image pour l'affichage
                    photo_cover = ImageTk.PhotoImage(cover_image)
                    image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
                except Exception as e:
                    # Si une erreur se produit lors du chargement de l'image, vous pouvez choisir une image de remplacement par défaut.
                    # Vous pouvez également gérer l'erreur d'une autre manière, par exemple, en affichant un message d'erreur.
                    print(f"Erreur lors du chargement de l'image pour {file}: {e}")
                    default_image = Image.open("C:\\Users\\aya\\Desktop\\ps2.jpg")  # Remplacez "default_cover.jpg" par le chemin de votre image de remplacement par défaut
                    default_image = default_image.resize((150, 150))  # Redimensionner l'image pour l'affichage
                    photo_cover = ImageTk.PhotoImage(default_image)
                    image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
        
            frame = tk.Frame(selection_window2, bg='black')
            frame.pack(fill=tk.BOTH, expand=True)
            # Configurer les options de colonnes et lignes pour que les boutons s'étendent correctement
            frame.columnconfigure(0, weight=1)
            frame.columnconfigure(1, weight=1)
            frame.columnconfigure(2, weight=1)
            frame.rowconfigure(0, weight=1)
            frame.rowconfigure(1, weight=1)
            frame.rowconfigure(2, weight=1)
        
            # Afficher les noms des fichiers (jeux) et les couvertures dans des étiquettes (labels)
            for i, file in enumerate(snes_files):
                label = tk.Label(frame, text=file, image=image_references[i], compound="top")
                label.grid(row=i // 3, column=i % 3, padx=10, pady=5, sticky="nsew")
                def open_file(file_path):
                    os.startfile(file_path)
        
                # Remplir la cellule avec l'image en ajustant la taille de l'image pour remplir la cellule
                label.grid_propagate(False)  # Empêcher le réglage automatique de la taille du label
                label.grid_rowconfigure(0, weight=1)
                label.grid_columnconfigure(0, weight=1)
        
                # Redimensionner l'image pour remplir la cellule
                label.configure(image=image_references[i])
        
                # Associer un clic sur l'image à la fonction d'ouverture du fichier
                label.bind("<Button-1>", lambda event, file_path=os.path.join(folder_path, file): open_file(file_path))
        
        def list_files_n64():
            ''' Affichage des jeux N64 '''
        
            global frame, image_references  # Utiliser la variable globale frame
            frame.destroy()  # Supprimer le frame actuel pour afficher les labels des fichiers
        
            # Créer une nouvelle fenêtre pour afficher la liste des jeux N64
            selection_window2 = tk.Toplevel(root)
            selection_window2.title("Selectionnez une option")
            selection_window2.attributes('-fullscreen', True)
        
            folder_path = "C:\\Users\\aya\\Desktop\\abox\\Game\\N64"  # Remplacez par le chemin de votre dossier
            files = os.listdir(folder_path)
        
            # Filtrer les fichiers pour ne garder que ceux avec l'extension ".n64"
            n64_files = [file for file in files if file.endswith(".n64")]
        
            image_references = []  # Réinitialiser la liste des références d'images
            covers_folder_path = "C:\\Users\\aya\\source\\repos\\manuel\\N64_cover"  # Spécifiez le chemin complet vers le dossier "covers" sur votre bureau
            for file in n64_files:
                cover_path = os.path.join(covers_folder_path, file.replace(".n64", ".jpg"))
                try:
                    cover_image = Image.open(cover_path)
                    cover_image = cover_image.resize((650, 300))  # Redimensionner l'image pour l'affichage
                    photo_cover = ImageTk.PhotoImage(cover_image)
                    image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
                except Exception as e:
                    # Si une erreur se produit lors du chargement de l'image, vous pouvez choisir une image de remplacement par défaut.
                    # Vous pouvez également gérer l'erreur d'une autre manière, par exemple, en affichant un message d'erreur.
                    print(f"Erreur lors du chargement de l'image pour {file}: {e}")
                    default_image = Image.open("C:\\Users\\aya\\Desktop\\ps2.jpg")  # Remplacez "default_cover.jpg" par le chemin de votre image de remplacement par défaut
                    default_image = default_image.resize((150, 150))  # Redimensionner l'image pour l'affichage
                    photo_cover = ImageTk.PhotoImage(default_image)
                    image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
        
            frame = tk.Frame(selection_window2, bg='black')
            frame.pack(fill=tk.BOTH, expand=True)
            # Configurer les options de colonnes et lignes pour que les boutons s'étendent correctement
            frame.columnconfigure(0, weight=1)
            frame.columnconfigure(1, weight=1)
            frame.columnconfigure(2, weight=1)
            frame.rowconfigure(0, weight=1)
            frame.rowconfigure(1, weight=1)
            frame.rowconfigure(2, weight=1)
        
            # Afficher les noms des fichiers (jeux) et les couvertures dans des étiquettes (labels)
            for i, file in enumerate(n64_files):
                label = tk.Label(frame, text=file, image=image_references[i], compound="top")
                label.grid(row=i // 3, column=i % 3, padx=10, pady=5, sticky="nsew")
                def open_file(file_path):
                    os.startfile(file_path)
        
                # Remplir la cellule avec l'image en ajustant la taille de l'image pour remplir la cellule
                label.grid_propagate(False)  # Empêcher le réglage automatique de la taille du label
                label.grid_rowconfigure(0, weight=1)
                label.grid_columnconfigure(0, weight=1)
        
                # Redimensionner l'image pour remplir la cellule
                label.configure(image=image_references[i])
        
                # Associer un clic sur l'image à la fonction d'ouverture du fichier
                label.bind("<Button-1>", lambda event, file_path=os.path.join(folder_path, file): open_file(file_path))
        
        def on_enter_btn2(event):
            image = Image.open("videogames.jpg")
            image = image.resize((button2.winfo_width(), button2.winfo_height()))
            photo = ImageTk.PhotoImage(image)
            image_references.append(photo)  # Ajouter la référence de l'image à la liste
            button2.configure(image=photo, bg='blue')
            button2.image = photo
        
        def on_leave_btn2(event):
            button2.configure(image='', bg='SystemButtonFace')
        
        frame = None  # Déclarer la variable frame en tant que variable globale
        button_snes = None  # Déclarer la variable button_snes en tant que variable globale
        button_n64 = None  # Déclarer la variable button_snes en tant que variable globale
        button_nswitch = None  # Déclarer la variable button_snes en tant que variable globale
        button_PS1 = None  # Déclarer la variable button_snes en tant que variable globale
        button_PS2 = None  # Déclarer la variable button_snes en tant que variable globale
        button_PS3 = None  # Déclarer la variable button_snes en tant que variable globale
        button_Xbox = None  # Déclarer la variable button_snes en tant que variable globale
        button_Multijoueur = None  # Déclarer la variable button_snes en tant que variable globale
        image_references = []  # Liste pour stocker les références des images
        
        root = tk.Tk()
        root.title("Console multi plate-forme")
        root.attributes('-fullscreen', True)
        root.config(background='#58D68D')
        
        width = root.winfo_screenwidth()
        height = root.winfo_screenheight()
        root.geometry(f'{width}x{height}')
        
        canvas = tk.Canvas(root, width=width / 2, height=height)
        canvas.create_image(width / 4, height / 2, image=image)  # Centrer l'image horizontalement et verticalement
        canvas.pack(side=tk.LEFT)
        
        canvas2 = tk.Canvas(root, width=width / 2, height=height)
        canvas2.create_image(width / 4, height / 2, image=image2)  # Centrer l'image horizontalement et verticalement
        canvas2.pack(side=tk.RIGHT)
        
        button1 = tk.Button(canvas, text="TV/VOD", font=("Helvetica", 20))
        button1.bind("<Enter>", on_enter_btn1)
        button1.bind("<Leave>", on_leave_btn1)
        button1.configure(bg='SystemButtonFace')
        button1.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # Centrer le bouton horizontalement et verticalement dans le canevas
        
        button2 = tk.Button(canvas2, text="Play", font=("Helvetica", 20), command=Sous_menu_jeux)
        button2.bind("<Enter>", on_enter_btn2)
        button2.bind("<Leave>", on_leave_btn2)
        button2.configure(bg='SystemButtonFace')
        button2.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # Centrer le bouton horizontalement et verticalement dans le canevas
        
        button3 = tk.Button(root, text="Eteindre", font=("Arial", 24), command=root.destroy)
        button3.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # Centrer le bouton horizontalement et verticalement dans le canevas
        
        # Import et personnalisation de l'espace TV
        image = Image.open("TV-c.png")
        image = image.resize((width // 2, height))  # Redimensionner l'image pour l'adapter à la moitié de la largeur de l'écran
        image = ImageTk.PhotoImage(image)
        image2 = Image.open("videogames.jpg")
        image2 = image2.resize((width // 2, height))  # Redimensionner l'image pour l'adapter à la moitié de la largeur de l'écran
        image2 = ImageTk.PhotoImage(image2)
        
        root.mainloop()

        Peut tu préciser ce que tu entends par là:

         "à part que je ne parviens absolument pas a utiliser le clavier dans
        le cadre de la navigation et l'exécution des fichiers. "

        0
        1. Bonjour Phil !

          Merci de suivre le sujet !

          J'ai tenté ( surement maladroitement ) d'utiliser le code que tu m'as envoyé, mais la boite de dialogue m'affiche le chemin de la bibliothèque au lieu du contenu de celle ci. Capture d'ecran : https://ibb.co/xJQWp15

          Je te propose le code complet, il y a probablement beaucoup de choses à revoir dans la mesure ou je me suis dépatouillé comme j'ai pu, mais dans l'ensemble il repond à mon besoin ( mise  a part l'usage du clavier et l'integration d'une scroll bar ). Desolé pour la longueur :)

          import tkinter as tk
          from PIL import Image, ImageTk
          import os
          
          frame = None  # Déclarer la variable frame en tant que variable globale
          button_snes = None  # Déclarer la variable button_snes en tant que variable globale
          button_n64 = None  # Déclarer la variable button_snes en tant que variable globale
          button_nswitch = None  # Déclarer la variable button_snes en tant que variable globale
          button_PS1 = None  # Déclarer la variable button_snes en tant que variable globale
          button_PS2 = None  # Déclarer la variable button_snes en tant que variable globale
          button_PS3 = None  # Déclarer la variable button_snes en tant que variable globale
          button_Xbox = None  # Déclarer la variable button_snes en tant que variable globale
          button_Multijoueur = None  # Déclarer la variable button_snes en tant que variable globale
          
          image_references = []  # Liste pour stocker les références des images
          
          
          
          # Fonction pour afficher le sous-menu des jeux
          def Sous_menu_jeux():
              global frame, button_snes, button_n64, button_nswitch, button_PS1, button_PS2, button_PS3, button_Xbox, button_Multijoueur  # Utiliser les variables globales frame et button_snes
             
              #Fond 
              #SNES    
              fond_snes = Image.open('snes.jpg')
              fond_snes = fond_snes.resize((450, 150))
              photo_snes = ImageTk.PhotoImage(fond_snes)
              image_references.append(photo_snes)  # Ajouter la référence de l'image à la liste
          
              #N64
              fond_n64 = Image.open('cc.jpg')
              fond_n64 = fond_n64.resize((450, 150))
              photo_n64 = ImageTk.PhotoImage(fond_n64)
              image_references.append(photo_n64)  # Ajouter la référence de l'image à la liste
          
              #nswitch
              fond_nswitch = Image.open('NSwitch.png')
              fond_nswitch = fond_nswitch.resize((450, 150))
              photo_nswitch = ImageTk.PhotoImage(fond_nswitch)
              image_references.append(photo_nswitch)  # Ajouter la référence de l'image à la liste
          
              #PS1
              fond_ps1 = Image.open('play1.jpg')
              fond_ps1 = fond_ps1.resize((450, 150))
              photo_ps1 = ImageTk.PhotoImage(fond_ps1)
              image_references.append(photo_ps1)  # Ajouter la référence de l'image à la liste
          
              #PS2
              fond_ps2 = Image.open('ps22.png')
              fond_ps2 = fond_ps2.resize((450, 150))
              photo_ps2 = ImageTk.PhotoImage(fond_ps2)
              image_references.append(photo_ps2)  # Ajouter la référence de l'image à la liste
          
              #PS3
              fond_ps3 = Image.open('ps3-logo2.png')
              fond_ps3 = fond_ps3.resize((450, 150))
              photo_ps3 = ImageTk.PhotoImage(fond_ps3)
              image_references.append(photo_ps3)  # Ajouter la référence de l'image à la liste
          
              #Xbox
              fond_xbox = Image.open('xbox.png')
              fond_xbox = fond_xbox.resize((450, 150))
              photo_xbox = ImageTk.PhotoImage(fond_xbox)
              image_references.append(photo_xbox)  # Ajouter la référence de l'image à la liste
          
              #Multi
              fond_multi = Image.open('online.png')
              fond_multi = fond_multi.resize((450, 150))
              photo_multi = ImageTk.PhotoImage(fond_multi)
              image_references.append(photo_multi)  # Ajouter la référence de l'image à la liste
          
              #Home
              fond_home = Image.open('home.png')
              fond_home = fond_home.resize((450, 150))
              photo_home = ImageTk.PhotoImage(fond_home)
              image_references.append(photo_home)  # Ajouter la référence de l'image à la liste
              
          
              
              # Créer une fenêtre pour le sous-menu
              selection_window = tk.Toplevel(root)
              selection_window.title("Selectionnez une option")
              selection_window.attributes('-fullscreen', True)
          
              frame = tk.Frame(selection_window, bg='white')
              frame.pack(fill=tk.BOTH, expand=True)
              # Configurer les options de colonnes et lignes pour que les boutons s'étendent correctement
              frame.columnconfigure(0, weight=1)
              frame.columnconfigure(1, weight=1)
              frame.columnconfigure(2, weight=1)
              frame.rowconfigure(0, weight=1)
              frame.rowconfigure(1, weight=1)
              frame.rowconfigure(2, weight=1)
          
              # Bouton "Super Nintendo"
              button_snes = tk.Button(frame, image=photo_snes, text="Super Nintendo", compound='top', font=("Arial", 24), bg='black', fg='white', command=lambda:[list_files_snes(),selection_window.destroy()])
              button_snes.grid(row=0, column=0, sticky="nsew")
          
              # Autres boutons pour les consoles de jeux
              button_n64 = tk.Button(frame, image=photo_n64, text="Nintendo 64",compound='top', font=("Arial", 24),bg='black',fg='white', command=lambda:[list_files_n64(),selection_window.destroy()])
              button_n64.grid(row=0, column=1, sticky="nsew")
          
              button_nswitch = tk.Button(frame, image=photo_nswitch, text="Nintendo Switch",compound="top", font=("Arial", 24),bg='black',fg='white')
              button_nswitch.grid(row=0, column=2, sticky="nsew")
          
              button_PS1 = tk.Button(frame, image=photo_ps1, text="PlayStation 1", compound="top", font=("Arial", 24),bg='black',fg='white')
              button_PS1.grid(row=1, column=0, sticky="nsew")
          
              button_PS2 = tk.Button(frame, image=photo_ps2, text="PlayStation 2",compound="top", font=("Arial", 24),bg='black',fg='white')
              button_PS2.grid(row=1, column=1, sticky="nsew")
          
              button_PS3 = tk.Button(frame, image=photo_ps3, text="PlayStation 3", compound="top", font=("Arial", 24),bg='black',fg='white')
              button_PS3.grid(row=1, column=2, sticky="nsew")
          
              button_Xbox = tk.Button(frame, image=photo_xbox, text="X box", font=("Arial", 24), compound="top", bg='black',fg='white')
              button_Xbox.grid(row=2, column=0, sticky="nsew")
          
              button_Multijoueur = tk.Button(frame,image=photo_multi, text="Multi-joueur", font=("Arial", 24), compound="top", bg='black',fg='white')
              button_Multijoueur.grid(row=2, column=1, sticky="nsew")
          
              button_home = tk.Button(frame, image=photo_home, text="Accueil", font=("Arial", 24), compound="top", bg='green',fg='white',command=selection_window.destroy)
              button_home.grid(row=2, column=2, sticky="nsew")
          
              # Mettre à jour l'image sur les boutons de CONSOLE
              button_snes.configure(image=photo_snes)
              button_n64.configure(image=photo_n64)
              button_nswitch.configure(image=photo_nswitch)
              button_PS1.configure(image=photo_ps1)
              button_PS2.configure(image=photo_ps2)
              button_PS3.configure(image=photo_ps3)
              button_Xbox.configure(image=photo_xbox)
          
          # Affichage des jeux SNES
          
          def list_files_snes():
              global frame, image_references  # Utiliser la variable globale frame
              frame.destroy()  # Supprimer le frame actuel pour afficher les labels des fichiers
          
              # Créer une nouvelle fenêtre pour afficher la liste des jeux N64
              selection_window2 = tk.Toplevel(root)
              selection_window2.title("Selectionnez une option")
              selection_window2.attributes('-fullscreen', True)
          
              folder_path = "C:\\Users\\aya\\Desktop\\abox\\Game\\Snes"  # Remplacez par le chemin de votre dossier
              files = os.listdir(folder_path)
          
              # Filtrer les fichiers pour ne garder que ceux avec l'extension ".sfc"
              snes_files = [file for file in files if file.endswith(".sfc")]
          
              image_references = []  # Réinitialiser la liste des références d'images
              covers_folder_path = "C:\\Users\\aya\\source\\repos\\manuel\\snes_cover"  # Spécifiez le chemin complet vers le dossier "covers" sur votre bureau
              for file in snes_files:
                  cover_path = os.path.join(covers_folder_path, file.replace(".sfc", ".jpg"))
                  try:
                      cover_image = Image.open(cover_path)
                      cover_image = cover_image.resize((650, 300))  # Redimensionner l'image pour l'affichage
                      photo_cover = ImageTk.PhotoImage(cover_image)
                      image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
                  except Exception as e:
                      # Si une erreur se produit lors du chargement de l'image, vous pouvez choisir une image de remplacement par défaut.
                      # Vous pouvez également gérer l'erreur d'une autre manière, par exemple, en affichant un message d'erreur.
                      print(f"Erreur lors du chargement de l'image pour {file}: {e}")
                      default_image = Image.open("C:\\Users\\aya\\Desktop\\ps2.jpg")  # Remplacez "default_cover.jpg" par le chemin de votre image de remplacement par défaut
                      default_image = default_image.resize((150, 150))  # Redimensionner l'image pour l'affichage
                      photo_cover = ImageTk.PhotoImage(default_image)
                      image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
          
              frame = tk.Frame(selection_window2, bg='black')
              frame.pack(fill=tk.BOTH, expand=True)
              # Configurer les options de colonnes et lignes pour que les boutons s'étendent correctement
              frame.columnconfigure(0, weight=1)
              frame.columnconfigure(1, weight=1)
              frame.columnconfigure(2, weight=1)
              frame.rowconfigure(0, weight=1)
              frame.rowconfigure(1, weight=1)
              frame.rowconfigure(2, weight=1)
          
          # Afficher les noms des fichiers (jeux) et les couvertures dans des étiquettes (labels)
              for i, file in enumerate(snes_files):
                  label = tk.Label(frame, text=file, image=image_references[i], compound="top")
                  label.grid(row=i // 3, column=i % 3, padx=10, pady=5, sticky="nsew")
                  def open_file(file_path):
                      os.startfile(file_path)
          
          
              # Remplir la cellule avec l'image en ajustant la taille de l'image pour remplir la cellule
                  label.grid_propagate(False)  # Empêcher le réglage automatique de la taille du label
                  label.grid_rowconfigure(0, weight=1)
                  label.grid_columnconfigure(0, weight=1)
          
              # Redimensionner l'image pour remplir la cellule
                  label.configure(image=image_references[i])
          
              # Associer un clic sur l'image à la fonction d'ouverture du fichier
                  label.bind("<Button-1>", lambda event, file_path=os.path.join(folder_path, file): open_file(file_path))
          
          
          # Affichage des jeux N64
          
          def list_files_n64():
              global frame, image_references  # Utiliser la variable globale frame
              frame.destroy()  # Supprimer le frame actuel pour afficher les labels des fichiers
          
              # Créer une nouvelle fenêtre pour afficher la liste des jeux N64
              selection_window2 = tk.Toplevel(root)
              selection_window2.title("Selectionnez une option")
              selection_window2.attributes('-fullscreen', True)
          
              folder_path = "C:\\Users\\aya\\Desktop\\abox\\Game\\N64"  # Remplacez par le chemin de votre dossier
              files = os.listdir(folder_path)
          
              # Filtrer les fichiers pour ne garder que ceux avec l'extension ".n64"
              n64_files = [file for file in files if file.endswith(".n64")]
          
              image_references = []  # Réinitialiser la liste des références d'images
              covers_folder_path = "C:\\Users\\aya\\source\\repos\\manuel\\N64_cover"  # Spécifiez le chemin complet vers le dossier "covers" sur votre bureau
              for file in n64_files:
                  cover_path = os.path.join(covers_folder_path, file.replace(".n64", ".jpg"))
                  try:
                      cover_image = Image.open(cover_path)
                      cover_image = cover_image.resize((650, 300))  # Redimensionner l'image pour l'affichage
                      photo_cover = ImageTk.PhotoImage(cover_image)
                      image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
                  except Exception as e:
                      # Si une erreur se produit lors du chargement de l'image, vous pouvez choisir une image de remplacement par défaut.
                      # Vous pouvez également gérer l'erreur d'une autre manière, par exemple, en affichant un message d'erreur.
                      print(f"Erreur lors du chargement de l'image pour {file}: {e}")
                      default_image = Image.open("C:\\Users\\aya\\Desktop\\ps2.jpg")  # Remplacez "default_cover.jpg" par le chemin de votre image de remplacement par défaut
                      default_image = default_image.resize((150, 150))  # Redimensionner l'image pour l'affichage
                      photo_cover = ImageTk.PhotoImage(default_image)
                      image_references.append(photo_cover)  # Ajouter la référence de l'image à la liste
          
              frame = tk.Frame(selection_window2, bg='black')
              frame.pack(fill=tk.BOTH, expand=True)
              # Configurer les options de colonnes et lignes pour que les boutons s'étendent correctement
              frame.columnconfigure(0, weight=1)
              frame.columnconfigure(1, weight=1)
              frame.columnconfigure(2, weight=1)
              frame.rowconfigure(0, weight=1)
              frame.rowconfigure(1, weight=1)
              frame.rowconfigure(2, weight=1)
          
          # Afficher les noms des fichiers (jeux) et les couvertures dans des étiquettes (labels)
              for i, file in enumerate(n64_files):
                  label = tk.Label(frame, text=file, image=image_references[i], compound="top")
                  label.grid(row=i // 3, column=i % 3, padx=10, pady=5, sticky="nsew")
                  def open_file(file_path):
                      os.startfile(file_path)
          
          
              # Remplir la cellule avec l'image en ajustant la taille de l'image pour remplir la cellule
                  label.grid_propagate(False)  # Empêcher le réglage automatique de la taille du label
                  label.grid_rowconfigure(0, weight=1)
                  label.grid_columnconfigure(0, weight=1)
          
              # Redimensionner l'image pour remplir la cellule
                  label.configure(image=image_references[i])
          
              # Associer un clic sur l'image à la fonction d'ouverture du fichier
                  label.bind("<Button-1>", lambda event, file_path=os.path.join(folder_path, file): open_file(file_path))
          
          
          
          
          # Création de l'interface d'accueil
          root = tk.Tk()
          root.title("Console multi plate-forme")
          root.attributes('-fullscreen', True)
          root.config(background='#58D68D')
          
          # Récupération de la résolution
          width = root.winfo_screenwidth()
          height = root.winfo_screenheight()
          root.geometry(f'{width}x{height}')
          
          # Import et personnalisation de l'espace TV
          image = Image.open("TV-c.png")
          image = image.resize((width // 2, height))  # Redimensionner l'image pour l'adapter à la moitié de la largeur de l'écran
          image = ImageTk.PhotoImage(image)
          canvas = tk.Canvas(root, width=width / 2, height=height)
          canvas.create_image(width / 4, height / 2, image=image)  # Centrer l'image horizontalement et verticalement
          canvas.pack(side=tk.LEFT)
          
          # Import et personnalisation de l'espace "Play"
          image2 = Image.open("videogames.jpg")
          image2 = image2.resize((width // 2, height))  # Redimensionner l'image pour l'adapter à la moitié de la largeur de l'écran
          image2 = ImageTk.PhotoImage(image2)
          canvas2 = tk.Canvas(root, width=width / 2, height=height)
          canvas2.create_image(width / 4, height / 2, image=image2)  # Centrer l'image horizontalement et verticalement
          canvas2.pack(side=tk.RIGHT)
          
          # Bouton de l'accueil
          #TV survol
          def on_enter_btn1(event):
              image = Image.open("TV.jpg")
              image = image.resize((button1.winfo_width(), button1.winfo_height()))
              photo = ImageTk.PhotoImage(image)
              image_references.append(photo)  # Ajouter la référence de l'image à la liste
              button1.configure(image=photo, bg='blue')
              button1.image = photo
          
          def on_leave_btn1(event):
              button1.configure(image='', bg='SystemButtonFace')
          
          # Créer le bouton "TV/VOD"
          button1 = tk.Button(canvas, text="TV/VOD", font=("Helvetica", 20))
          button1.bind("<Enter>", on_enter_btn1)
          button1.bind("<Leave>", on_leave_btn1)
          button1.configure(bg='SystemButtonFace')
          button1.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # Centrer le bouton horizontalement et verticalement dans le canevas
          
          # Jeux survol
          def on_enter_btn2(event):
              image = Image.open("videogames.jpg")
              image = image.resize((button2.winfo_width(), button2.winfo_height()))
              photo = ImageTk.PhotoImage(image)
              image_references.append(photo)  # Ajouter la référence de l'image à la liste
              button2.configure(image=photo, bg='blue')
              button2.image = photo
          
          def on_leave_btn2(event):
              button2.configure(image='', bg='SystemButtonFace')
          
          # Créer le bouton "Play"
          button2 = tk.Button(canvas2, text="Play", font=("Helvetica", 20), command=Sous_menu_jeux)
          button2.bind("<Enter>", on_enter_btn2)
          button2.bind("<Leave>", on_leave_btn2)
          button2.configure(bg='SystemButtonFace')
          button2.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # Centrer le bouton horizontalement et verticalement dans le canevas
          
          # Creer bouton éteindre
          button3 = tk.Button(root, text="Eteindre", font=("Arial", 24), command=root.destroy)
          button3.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # Centrer le bouton horizontalement et verticalement dans le canevas
          
          
          # Afficher la fenêtre
          root.mainloop()
          0
          1. Bonjour Aya,

            Alors, résultat des courses ?  :-)

            0
            1. Bonjour,

              Structure bien ton code:

              les imports

              les définitions de fonctions

              le programme principal: définition des constantes, de la fenêtre, des widgets

              boucle évènementielle

              Un petit exemple qui ressemble un peu à ce que tu veux:

              import os
              from tkinter import *
              
              def list_files(evt):
                  ''' Affiche la liste des fichiers
              	    Pas besoin de définir de scroll bar
              	    dans le widget Text, il suffit de scroller
              	    avec la roulette de la souris '''
              
                  files = os.listdir(wd)
                  for _file in files: t1.insert(END, _file+'\n')
              
              wd = os.getcwd()
              
              WIDTH, HEIGHT = 400, 400
              
              main_win = Tk()
              main_win.title('Test : appuyer sur Entrée')
              main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+400+100')
              
              #Appui sur Entrée pour lister les fichiers
              main_win.bind("<Return>", list_files)
              
              t1 = Text(main_win, width = 45, height = 22)
              t1.place(x = 10, y = 10)
              
              main_win.mainloop()
              0
              1. Hello Phil ! Et merci de ta réponse.

                Le code est effectivement incomplet je n’ai mis que la fonction concernée car le code au complet est assez costaud.

                Si nécessaire, je vais poster le tout dès que je rentre.

                0
                1. Bonjour,

                  Il manque des trucs là-dedans :

                  • Je ne vois pas les imports (tkinter, os, ...), la définition de root,
                  • L'instruction root.mainloop(), ...
                  • Ton code est surement incomplet.
                  • A quoi sert ce Toplevel ligne 5 ?

                  Bref, pas moyen de tester ton code

                  0