Python tkinter naviguer avec le clavier dans os.listdir

aya92 Messages postés 8 Statut Membre -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -

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. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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
  2. aya92 Messages postés 8 Statut Membre
     

    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
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour Aya,

    Alors, résultat des courses ?  :-)

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. aya92 Messages postés 8 Statut Membre
     

    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
  7. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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
  9. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

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

    0