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

GUI Python Discussion :

Tkinter / affichage d'une image dans un canevas [Python 3.X]


Sujet :

GUI Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 10
    Points
    10
    Par défaut Tkinter / affichage d'une image dans un canevas
    Bonjour à tous,
    je viens chercher un peu d'aide concernant un petit programme que j'essaie de rédiger.
    à partir d'un script précédent que j'avais créé dans un contexte d'enseignement pour traiter des images et qui fonctionnait en mode console, je souhaite l'adapter avec une interface graphique.
    J'ai trouvé quelques tutos pour Tkinter que j'ai essayé de mettre en place mais je bute sur l'affichage de l'image dans la fenêtre via un canevas ...
    Il doit y avoir un problème de portée de mon objet Canvas "cnv" mais je ne vois pas comment le résoudre....
    Le canevas est déclaré lignes 119 & 120 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cnv=Canvas(fen1)
    cnv.pack(padx=5,pady=5)
    et l'affichage se fait dans la fonction ouvrirImage lignes 84 & 85 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cnv.create_image(0,0,anchor=NW,image=photo)
    cnv.config(height=img.height,width=img.width)
    je joins le fichier si besoin
    Merci d'avance pour votre aide

    P.S :
    - le slicing de la ligne 83 est dû au fait que j'utilise un EDI via wine sous ubuntu pour diverses raisons
    - au niveau de l'import des modules, je ne suis pas sûr de faire l'import de tkinter correctement. Notamment le fait de mettre devrait suffire plutôt que d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import tkinter.messagebox
    import tkinter.filedialog as fd
    Fichiers attachés Fichiers attachés

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

    Pour illustrer votre problème d'image et de Canvas, pas la peine de poster tout votre code. Vous pourriez le réduire aux seules instructions nécessaires pour reproduire et/ou illustrer de votre soucis.

    Citation Envoyé par willy31 Voir le message
    Il doit y avoir un problème de portée de mon objet Canvas "cnv" mais je ne vois pas comment le résoudre....
    afficher une image nécessite effectivement que la variable qui référence l'image survive à la sortie de la fonction qui la crée (et dans le lien vous trouverez une entrée de la FAQ qui raconte une des méthodes pour s'en sortir).

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Pour illustrer votre problème d'image et de Canvas, pas la peine de poster tout votre code. Vous pourriez le réduire aux seules instructions nécessaires pour reproduire et/ou illustrer de votre soucis.
    Hello,
    désolé pour l'abondance alors ;-)
    voici donc une version light :

    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
     
    ...
    from PIL import Image as Img
    from PIL import ImageTk as Itk
    from tkinter import *
    ...
     
    # Liste des traitements -------------------------------
    ...
     
    # Gestion des actions des boutons -------------------------
    def ouvrirImage():
        """
        méthode d'ouverture du fichier à traiter
        """
        cnv.delete(ALL)        # effacement de la zone de canevas
     
        ...
     
        # ouverture de l'image
        img = Img.open(cheminImage)
     
        ...
     
        # Gestion du canevas pour affichage de l'image
        photo=Itk.PhotoImage(file=cheminImage)
        cnv.config(height=img.height,width=img.width)
        cnv.create_image(0,0,anchor=NW,image=photo)
        fen1.title("Image "+str(img.width)+" x "+str(img.height))
     
    ...
     
    # Corps du programme --------------------------------------
    fen1 = Tk()                 # Déclaration de la fenêtre
     
    ...
     
    menuFichier.add_command(label="Ouvrir une image",command=ouvrirImage())
     
    ...
     
    # Affichage du menu
    fen1.config(menu=barreDeMenu)
     
    # Création du widget Canevas
    cnv=Canvas(fen1)
    cnv.pack(padx=5,pady=5)
     
    fen1.mainloop()     #*Affichage de la fenêtre
    espérant que cela soit plus clair
    Je suis aussi allé voir sur votre lien et cela semble confirmer qu'il me faut déclarer l'image dans le corps du programme pour qu'elle survive à l’exécution de la fonction
    Toutefois, je ne sais pas lequel des deux cas s'applique à mon cas : utilisation d'un dictionnaire pour garder la référence ou bien d'un label ? ou via la canevas ?

    Merci encore
    W@m

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par willy31 Voir le message
    Toutefois, je ne sais pas lequel des deux cas s'applique à mon cas : utilisation d'un dictionnaire pour garder la référence ou bien d'un label ? ou via la canevas ?
    Un objet survit à la sortie d'une fonction est stocké dans une variable globale (pour faire simple).
    Si c'est une simple variable, il faudra utiliser le mot clef global pour que la fonction puisse assigner la nouvelle image. Si c'est un dictionnaire, on va le modifier sans avoir besoin d'assigner autre chose à la variable (globale) qui permet d'y accéder (en lecture).
    Dans votre tuto. préféré, il doit y avoir un chapitre qui parle de portée des variables et de globals, locals. Le relire serait un plus pour mieux comprendre.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 10
    Points
    10
    Par défaut
    C'est bon j'y suis enfin arrivé et je pense que le problème venait de ce que j'empaquetais le canvas que dans le corps du programme et non juste après avoir créé l'image.
    J'ai donc modifié la fonction ainsi :
    (je passe notamment le canevas et la fenetre en paramètres)
    (j'ai ajouté un dictionnaire pour garder la référence de l'image hors de la fonction)

    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
    def ouvrirImage(cnv,fen1):
        """
        méthode d'ouverture du fichier à traiter
        transforme l'image en un tableau de type numpy.array pour les traitements
        """
        cnv.delete(ALL)        # effacement de la zone de canevas
        cheminImage=fd.askopenfile(title="Ouvrir une image",filetypes=[("all files",".*")])
    
        # ouverture de l'image
        img = Img.open(cheminImage.name[2:len(cheminImage.name)])
    
        # Gestion du canevas pour affichage de l'image
        photo=Itk.PhotoImage(file=cheminImage.name[2:len(cheminImage.name)])
    
        # mise à jour du lien image
        imgDict[cheminImage.name[2:len(cheminImage.name)]] = photo
        cnv.config(height=img.height,width=img.width)
        cnv.create_image(0,0,anchor=NW,image=photo)
        cnv.pack(padx=10,pady=10)
        fen1.title("Image "+str(img.width)+" x "+str(img.height))
    la déclaration du canevas se fait hors de la fonction, dans le corps du programme juste après avoir déclaré la fenêtre elle-même

    Merci pour votre aide

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par willy31 Voir le message
    C'est bon j'y suis enfin arrivé et je pense que le problème venait de ce que j'empaquetais le canvas que dans le corps du programme et non juste après avoir créé l'image.
    L'intérêt d'un exemple en quelques lignes est de pouvoir tester (et invalider) ces petites théories (penser que...) qu'on peut faire sur le comportement de tel ou tel objet.

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

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

Discussions similaires

  1. Exemple affichage d'une image dans un bouton
    Par had182 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2006, 18h38
  2. Réponses: 4
    Dernier message: 16/12/2005, 22h52
  3. [PHP-JS] Affichage d'une image dans une popup à la taille
    Par urbanspike dans le forum Langage
    Réponses: 3
    Dernier message: 27/09/2005, 20h53
  4. Réponses: 1
    Dernier message: 11/05/2005, 17h28
  5. [DEBUTANT][HTML] affichage d'une image dans une page
    Par nimport nawak dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 19h50

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