IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Affichage d'images et bizarreté


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Affichage d'images et bizarreté
    Bonsoir,
    Je reviens vers vous pour un problème que je ne m'explique pas, toujours dans le même cadre de mon appli cabinet (cf https://www.developpez.net/forums/d2...s-ineffective/)
    Pour chaque personne qui vient, je stocke des images, principalement de l'examen des cordes vocales. Les images sont référencées dans une table avec liaison sur l'id de chaque personne, j'affiche la liste dans un Treeview et voudrais en cliquant sur le nom d'une photo la voir s'afficher dans un canvas à côté.
    La base pour afficher des images ne pose pas de problème (je vous ai épargné les photos de cordes vocales et ai mis des persos Disney à la place, ça évitera les cris d'horreur !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import tkinter as tk
    from tkinter import ttk
    from PIL import Image,ImageTk
     
    FenetreBC_root = tk.Tk()
    FenetreBC_root.geometry('1280x777')
    FenetreBC_root.title('Cabinet de Phoniatrie Bruno')
    FenetreGestion_Photo = ttk.Frame(FenetreBC_root)
    FenetreGestion_Photo.place(x = 0, y = 0, width = 1280, height = 877)
     
     
    # Construction Table à onglets
    OngletAffichageBase = ttk.Notebook(FenetreGestion_Photo)
    OngletAffichageBase.place(x = 50, y = 100, width = 800, height = 500)
    Onglet1 = ttk.Frame(OngletAffichageBase)
    Onglet1.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet1, text = "Etat-civil")
    Onglet2 = ttk.Frame(OngletAffichageBase)
    Onglet2.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet2, text = "Diagnostic et correspondants")
    Onglet3 = ttk.Frame(OngletAffichageBase)
    Onglet3.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet3, text = "Actes")
    Onglet4 = ttk.Frame(OngletAffichageBase)
    Onglet4.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet4, text = "Courriers")
    Onglet5 = ttk.Frame(OngletAffichageBase)
    Onglet5.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet5, text = "Photos")
     
    # Création du canvas
    chAffPhoto= tk.Canvas(Onglet5, width= 300, height= 300)
    chAffPhoto.place(x=40,y=40)
     
    # Chargement d'une des images
    imagePerso= ImageTk.PhotoImage(Image.open("Donald300.jpg"))
     
    # Mise en place de l'image dans le Canvas
    chAffPhoto.create_image(10,10,anchor=tk.NW,image=imagePerso)
     
    FenetreBC_root.mainloop()
    Ça se complique quand je mets les onglets et le Treeview dans l'onglet 'Photos', l'affichage se fait par l'appel d'une fonction depuis l'événement de sélection dans le Treeview, et là aucune photo affichée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    import tkinter as tk
    from tkinter import ttk
    from PIL import Image,ImageTk
     
    listePersos=[("Mickey","Mickey300.jpg"),("Donald","Donald300.jpg"),("Picsou","Picsou300.jpg")]
     
    def affichPhoto(actionRealisee):
        """
        """     
        # Récupération des données du perso sélectionné dans le TreeView
        itemSelectionne = listePhotos.focus()
        refPhoto = listePhotos.item(itemSelectionne, 'values')
        # Chemin et nom de l'image
        cheminImage=str(refPhoto[1])
        # Construction de l'image
        trPhotoAAff = ImageTk.PhotoImage(Image.open(cheminImage))
        cnAffPhoto.create_image(10,10,anchor=tk.NW,image=trPhotoAAff)
     
    FenetreBC_root = tk.Tk()
    FenetreBC_root.geometry('1280x777')
    FenetreBC_root.title('Cabinet de Phoniatrie Bruno')
    FenetreGestion_Photo = ttk.Frame(FenetreBC_root)
    FenetreGestion_Photo.place(x = 0, y = 0, width = 1280, height = 877)
     
     
    # Construction Table à onglets
    OngletAffichageBase = ttk.Notebook(FenetreGestion_Photo)
    OngletAffichageBase.place(x = 50, y = 100, width = 800, height = 500)
    Onglet1 = ttk.Frame(OngletAffichageBase)
    Onglet1.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet1, text = "Etat-civil")
    Onglet2 = ttk.Frame(OngletAffichageBase)
    Onglet2.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet2, text = "Diagnostic et correspondants")
    Onglet3 = ttk.Frame(OngletAffichageBase)
    Onglet3.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet3, text = "Actes")
    Onglet4 = ttk.Frame(OngletAffichageBase)
    Onglet4.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet4, text = "Courriers")
    Onglet5 = ttk.Frame(OngletAffichageBase)
    Onglet5.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet5, text = "Photos")
     
    # Liste multicolonnes des photos
    colonnes = ('IdPerso','NomFichier')
    listePhotos=ttk.Treeview(Onglet5, columns=colonnes, show='')
    # Constitutions des colonnes, avec entêtes non affichées
    listePhotos.heading('#0', text='')
    listePhotos.heading('IdPerso', text='Identification du perso')
    listePhotos.heading('NomFichier', text="Nom du fichier")
    listePhotos.column('#0', minwidth=0,width=0, stretch=tk.NO)
    listePhotos.column('IdPerso', minwidth=0,width=130)
    listePhotos.column('NomFichier', minwidth=0,width=0, stretch=tk.NO)
    listePhotos.place(x = 440, y = 100, width = 210, height = 260)
    listePhotos.bind("<<TreeviewSelect>>", affichPhoto)
    # Rajout d'une barre de défilement vertical
    photVertScrlbar = ttk.Scrollbar(listePhotos,orient ="vertical",command = listePhotos.yview)
    photVertScrlbar.pack(side ='right', fill ='y')
    listePhotos.configure(yscrollcommand = photVertScrlbar.set) 
     
    for item in enumerate(listePersos):
        addPersoListe=[item[1][0],item[1][1]]
        listePhotos.insert('',tk.END,values=addPersoListe)
     
    # Création du canvas
    cnAffPhoto= tk.Canvas(Onglet5, width= 300, height= 300)
    cnAffPhoto.place(x=40,y=40)
     
    FenetreBC_root.mainloop()
    Mais le plus surprenant, j'ai essayé de mettre un bout de code pour faire un update ou une manip pour voir mes photos, je me suis planté (j'ai laissé le bout de code erroné lignes 18-19), et là l'erreur m'a été indiquée (rien que de très normal...), mais mes photos sont apparues... D'où ma question, comment l'expliquer et comment faire apparaître mes photos sans avoir à générer une erreur (que je pourrais sans doute intercepter, mais ça n'est guère élégant) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    import tkinter as tk
    from tkinter import ttk
    from PIL import Image,ImageTk
     
    listePersos=[("Mickey","Mickey300.jpg"),("Donald","Donald300.jpg"),("Picsou","Picsou300.jpg")]
     
    def affichPhoto(actionRealisee):
        """
        """     
        # Récupération des données du perso sélectionné dans le TreeView
        itemSelectionne = listePhotos.focus()
        refPhoto = listePhotos.item(itemSelectionne, 'values')
        # Chemin et nom de l'image
        cheminImage=str(refPhoto[1])
        # Construction de l'image
        trPhotoAAff = ImageTk.PhotoImage(Image.open(cheminImage))
        cnAffPhoto.create_image(10,10,anchor=tk.NW,image=trPhotoAAff)
        if FenetreBC_root.cnAffPhoto.winfo_exists():
            FenetreBC_root.cnAffPhoto.focus_set()
     
    FenetreBC_root = tk.Tk()
    FenetreBC_root.geometry('1280x777')
    FenetreBC_root.title('Cabinet de Phoniatrie Bruno')
    FenetreGestion_Photo = ttk.Frame(FenetreBC_root)
    FenetreGestion_Photo.place(x = 0, y = 0, width = 1280, height = 877)
     
     
    # Construction Table à onglets
    OngletAffichageBase = ttk.Notebook(FenetreGestion_Photo)
    OngletAffichageBase.place(x = 50, y = 100, width = 800, height = 500)
    Onglet1 = ttk.Frame(OngletAffichageBase)
    Onglet1.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet1, text = "Etat-civil")
    Onglet2 = ttk.Frame(OngletAffichageBase)
    Onglet2.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet2, text = "Diagnostic et correspondants")
    Onglet3 = ttk.Frame(OngletAffichageBase)
    Onglet3.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet3, text = "Actes")
    Onglet4 = ttk.Frame(OngletAffichageBase)
    Onglet4.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet4, text = "Courriers")
    Onglet5 = ttk.Frame(OngletAffichageBase)
    Onglet5.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet5, text = "Photos")
     
    # Liste multicolonnes des photos
    colonnes = ('IdPerso','NomFichier')
    listePhotos=ttk.Treeview(Onglet5, columns=colonnes, show='')
    # Constitutions des colonnes, avec entêtes non affichées
    listePhotos.heading('#0', text='')
    listePhotos.heading('IdPerso', text='Identification du perso')
    listePhotos.heading('NomFichier', text="Nom du fichier")
    listePhotos.column('#0', minwidth=0,width=0, stretch=tk.NO)
    listePhotos.column('IdPerso', minwidth=0,width=130)
    listePhotos.column('NomFichier', minwidth=0,width=0, stretch=tk.NO)
    listePhotos.place(x = 440, y = 100, width = 210, height = 260)
    listePhotos.bind("<<TreeviewSelect>>", affichPhoto)
    # Rajout d'une barre de défilement vertical
    photVertScrlbar = ttk.Scrollbar(listePhotos,orient ="vertical",command = listePhotos.yview)
    photVertScrlbar.pack(side ='right', fill ='y')
    listePhotos.configure(yscrollcommand = photVertScrlbar.set) 
     
    for item in enumerate(listePersos):
        addPersoListe=[item[1][0],item[1][1]]
        listePhotos.insert('',tk.END,values=addPersoListe)
     
    # Création du canvas
    cnAffPhoto= tk.Canvas(Onglet5, width= 300, height= 300)
    cnAffPhoto.place(x=40,y=40)
     
    FenetreBC_root.mainloop()
    Merci d'avance pour vos lumières et explications !
    Bruno
    Images attachées Images attachées    

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Pour que les photo restent affichées, il faut garder une référence à l'objet PhotoImage.
    Dans votre code, la référence est une variable locale qui n'existera plus à la sortie de la fonction (provoquant la destruction de l'objet associé).

    notes: information qui est dans la documentation et dans la FAQ.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Pour que les photo restent affichées, il faut garder une référence à l'objet PhotoImage.
    - W
    Merci @wiztricks. Je me doutais qu'il y avait un truc du genre et suis en train d'y travailler.

    Toutefois, ma question était sur un autre point. Je comprends que la référence soit perdue puisqu'on a affaire à une variable locale, mais pourquoi l'erreur générée par une tentative vaine de ma part de passer par un select(), ou dans le cas mis en référence (code no3, lignes 18 et 19) d'une attribution de focus qui ne marche pas et pour cause... fait apparaître mes photos ? En toute logique, ça n'aurait rien dû changer, puisque la référence devrait rester perdue !

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Bordeaux
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Bordeaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par bcoulom Voir le message
    Merci @wiztricks. Je me doutais qu'il y avait un truc du genre et suis en train d'y travailler.

    Toutefois, ma question était sur un autre point. Je comprends que la référence soit perdue puisqu'on a affaire à une variable locale, mais pourquoi l'erreur générée par une tentative vaine de ma part de passer par un select(), ou dans le cas mis en référence (code no3, lignes 18 et 19) d'une attribution de focus qui ne marche pas et pour cause... fait apparaître mes photos ? En toute logique, ça n'aurait rien dû changer, puisque la référence devrait rester perdue !
    Tout cela se passe à la vitesse de la lumière, elle apparaît et disparaît...en sortant de la fonction.
    En cas d"erreur, c'est comme s'il y a avait un standby sur la fonction mais le reste du code s'exécute quand même dans le mainloop! C'est ce que j'en comprends, sans vouloir me substituer à d'autres spécialistes.
    Une instruction qui déclenche une erreur à cette endroit ne change pas le résultat, par exemple si je mets Mélenchon=Grosmenteur à la place de votre if..., une erreur apparaît et l'image reste affichée!
    Bonne journée.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par bcoulom Voir le message
    mais pourquoi l'erreur générée par une tentative vaine de ma part de passer par un select(), ou dans le cas mis en référence (code no3, lignes 18 et 19) d'une attribution de focus qui ne marche pas et pour cause... fait apparaître mes photos ? En toute logique, ça n'aurait rien dû changer, puisque la référence devrait rester perdue !
    Croyez vous que le traitement des erreurs soit intelligent et se fasse sans effets de bords?
    L'objectif est juste de vous donner une indication sur ce qui ne fonctionne pas... Et c'est déjà pas si mal. Après, si vous voulez comprendre les interactions entre TCL/Tk, tkinter et la gestion d'erreurs Python, allez-y il y a les sources!
    Mais pour l'instant, vous feriez mieux de passer du temps à apprendre à programmer avec tkinter (sans trop vous soucier de la tonne de quincaillerie qu'il y a derrière).

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par brunop33 Voir le message
    Tout cela se passe à la vitesse de la lumière, elle apparaît et disparaît...en sortant de la fonction.
    En cas d"erreur, c'est comme s'il y a avait un standby sur la fonction mais le reste du code s'exécute quand même dans le mainloop! C'est ce que j'en comprends, sans vouloir me substituer à d'autres spécialistes.
    .
    Grosse journée de boulot, je n'ai pas pu répondre avant.
    Merci brunop33, je comprends mieux le mécanisme. Et un grand merci pour le temps passé !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Bonsoir wiztricks.
    Citation Envoyé par wiztricks Voir le message
    Mais pour l'instant, vous feriez mieux de passer du temps à apprendre à programmer avec tkinter (sans trop vous soucier de la tonne de quincaillerie qu'il y a derrière).
    - W
    C'est ce que je fais, ou crois faire, même je dois commettre quelques maladresses parfois (souvent ?).
    Je vous suis reconnaissant de l'aide apportée, désolé si vous avez l'impression de perdre votre temps, il me semble que je me creuse la tête avant de poser des questions, dont j'imagine bien que les experts les trouvent faciles. C'est un peu la même chose dans mon domaine, où certains étudiants me paraissent parfois peu inspirés, cela m'apprendra la patience avec eux !
    Quoi qu'il en soit, vos conseils m'ont permis en gardant la référence à mon objet PhotoImage de résoudre mon problème, grand merci !
    Bonne soirée.Bruno

  8. #8
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Une solution
    Désolé, j'ai oublié de mettre le code qui finalement fonctionne, grâce à la déclaration de l'objet image en global dans la fonction appelée.
    J'ai lu qu'il fallait éviter le recours aux déclarations de variables en global, je ne sais pas s'il y a une solution plus "valable", mais celle-ci marche sans erreur renvoyée.
    Merci de nouveau à wiztricks et brunop33

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    import tkinter as tk
    from tkinter import ttk
    from PIL import Image,ImageTk
    from functools import partial
     
    listePersos=[("Mickey","Mickey300.jpg"),("Donald","Donald300.jpg"),("Picsou","Picsou300.jpg")]
     
    def affichPhoto(actionRealisee):     
        global trPhotoAAff
        # Récupération des données du perso sélectionné dans le TreeView
        itemSelectionne = listePhotos.focus()
        refPhoto = listePhotos.item(itemSelectionne, 'values')
        # Chemin et nom de l'image
        cheminImage=str(refPhoto[1])
        trPhotoAAff = ImageTk.PhotoImage(Image.open(cheminImage))
        cnAffPhoto.create_image(10,10,anchor=tk.NW,image=trPhotoAAff)
     
    FenetreBC_root = tk.Tk()
    FenetreBC_root.geometry('1280x777')
    FenetreBC_root.title('Cabinet de Phoniatrie Bruno')
    FenetreGestion_Photo = ttk.Frame(FenetreBC_root)
    FenetreGestion_Photo.place(x = 0, y = 0, width = 1280, height = 877)
     
    # Construction Table à onglets
    OngletAffichageBase = ttk.Notebook(FenetreGestion_Photo)
    OngletAffichageBase.place(x = 50, y = 100, width = 800, height = 500)
    Onglet1 = ttk.Frame(OngletAffichageBase)
    Onglet1.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet1, text = "Etat-civil")
    Onglet2 = ttk.Frame(OngletAffichageBase)
    Onglet2.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet2, text = "Diagnostic et correspondants")
    Onglet3 = ttk.Frame(OngletAffichageBase)
    Onglet3.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet3, text = "Actes")
    Onglet4 = ttk.Frame(OngletAffichageBase)
    Onglet4.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet4, text = "Courriers")
    Onglet5 = ttk.Frame(OngletAffichageBase)
    Onglet5.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet5, text = "Photos")
     
    # Référence de la photo affichée
    #referencePhotoAff = tk.StringVar()
    #refPhotoAffichee = ttk.Entry(FenetreGestion_Photo,textvariable = referencePhotoAff)
    #refPhotoAffichee.place(x=0,y=0,width=100,height=22)
    #referencePhotoAff.set("Mickey300.jpg")
     
    # Création du canvas
    cnAffPhoto= tk.Canvas(Onglet5, width= 300, height= 300)
    cnAffPhoto.place(x=40,y=40)
    # Construction de l'image
    trPhotoAAff = ImageTk.PhotoImage(Image.open("Mickey300.jpg"))
    cnAffPhoto.create_image(10,10,anchor=tk.NW,image=trPhotoAAff)
     
    # Liste multicolonnes des photos
    colonnes = ('IdPerso','NomFichier')
    listePhotos=ttk.Treeview(Onglet5, columns=colonnes, show='')
    # Constitutions des colonnes, avec entêtes non affichées
    listePhotos.heading('#0', text='')
    listePhotos.heading('IdPerso', text='Identification du perso')
    listePhotos.heading('NomFichier', text="Nom du fichier")
    listePhotos.column('#0', minwidth=0,width=0, stretch=tk.NO)
    listePhotos.column('IdPerso', minwidth=0,width=130)
    listePhotos.column('NomFichier', minwidth=0,width=0, stretch=tk.NO)
    listePhotos.place(x = 440, y = 100, width = 210, height = 260)
    listePhotos.bind("<<TreeviewSelect>>", affichPhoto)
    # Rajout d'une barre de défilement vertical
    photVertScrlbar = ttk.Scrollbar(listePhotos,orient ="vertical",command = listePhotos.yview)
    photVertScrlbar.pack(side ='right', fill ='y')
    listePhotos.configure(yscrollcommand = photVertScrlbar.set) 
     
    for item in enumerate(listePersos):
        addPersoListe=[item[1][0],item[1][1]]
        listePhotos.insert('',tk.END,values=addPersoListe)
     
    FenetreBC_root.mainloop()

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par bcoulom Voir le message
    C'est ce que je fais, ou crois faire, même je dois commettre quelques maladresses parfois (souvent ?).
    Le soucis est que vous partez dans des théories qui vous conduisent à imaginer des solutions de contournement discutables:

    D'où ma question, comment l'expliquer et comment faire apparaître mes photos sans avoir à générer une erreur (que je pourrais sans doute intercepter, mais ça n'est guère élégant) ?
    qui s'éloignent du problème initial.

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

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 100
    Points : 4 445
    Points
    4 445
    Par défaut
    Bonjour, Note générale sur tes variables

    Avec 5 onglets et 36 widgets dans chaque, tu vas te retrouver avec une tonne de variables globales (sur le même plan)
    Onglet1 .. Onglet5 c'est clairement le top !

    - Onglets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Onglet1 = ttk.Frame(OngletAffichageBase)
    Onglet1.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet1, text = "Etat-civil")
    Onglet2 = ttk.Frame(OngletAffichageBase)
    Il est plus simple , plus compréhensible pour le codeur de regrouper les variables dans un dico
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    onglets = {}
    onglet["etat-civil"] = ttk.Frame(OngletAffichageBase)
    onglet["etat-civil"].place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(onglet["etat-civil"], text = "Etat-civil")
    onglet["Diagnostic"] = ttk.Frame(OngletAffichageBase)
    ------------------

    Même chose, pour un code plus clair.
    Il est possible aussi de sauvegarder une référence aux variables(widgets ou nom) dans le widget parent en ajoutant un attribut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FenetreGestion_Photo.onglets = {}
    FenetreGestion_Photo.onglets["etat-civil"] = ttk.Frame(OngletAffichageBase)
    FenetreGestion_Photo.onglets["photos"].listePhotos = ttk.Treeview(FenetreGestion_Photo.onglets["photos"], columns=colonnes, show='')
    ...
     
    itemSelectionne = FenetreGestion_Photo.onglets["photos"].listePhotos.focus()
    refPhoto = FenetreGestion_Photo.onglets["photos"].listePhotos.item(itemSelectionne, 'values')
    # ou , même chose, dans une fonction, utiliser une variable locale
    mon_onglet = FenetreGestion_Photo.onglets["photos"]
    itemSelectionne = mon_onglet.listePhotos.focus()
    refPhoto = mon_onglet.listePhotos.item(itemSelectionne, 'values')
    Note: pour les onglets (ou widgets), il n'est pas obligatoire de préférer un attribut dictionnaire à plusieurs attributs, c'est selon le développeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FenetreGestion_Photo.onglets = {}
    FenetreGestion_Photo.onglets["photos"] = ttk.Frame(OngletAffichageBase)
    FenetreGestion_Photo.onglets["photos"].show()
    # ou
    FenetreGestion_Photo.onglet_photos = ttk.Frame(OngletAffichageBase)
    FenetreGestion_Photo.onglet_photos.show()
    $moi= ( !== ) ? : ;

  11. #11
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Bonjour, Note générale sur tes variables

    Avec 5 onglets et 36 widgets dans chaque, tu vas te retrouver avec une tonne de variables globales (sur le même plan)
    Onglet1 .. Onglet5 c'est clairement le top !
    Merci papajoker !
    Désolé pour le délai, la semaine a été tendue, j'ai ouvert Spyder le matin pour le refermer le soir
    En fait, je l'ai fait pour mes widgets suivants, en utilisant une liste plutôt qu'un dictionnaire. Je n'avais pas pensé le faire pour les onglets, mais pourquoi pas. Je reconnais que les noms Onglet1, 2, 3... manquaient de poésie, mais bon, il n'y en avait que 5
    Je vais changer ça, et merci pour tes conseils.
    Bon WE

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX] Affichage d'images par loadMovie
    Par n_tony dans le forum Flash
    Réponses: 7
    Dernier message: 23/09/2004, 15h34
  2. XSL: pb d'affichage d'images
    Par enez dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 12/09/2004, 14h17
  3. PB affichage d'image avec IE
    Par arturo dans le forum Modules
    Réponses: 6
    Dernier message: 25/09/2003, 17h28
  4. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo