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'une image avec extension du cadre [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Par défaut affichage d'une image avec extension du cadre
    Bonjour,
    je fais face à un certain nombre de difficultés pour afficher une image jpg avec :
    1. la possibilité d'en étendre l'affichage quand on étend le cadre
    2. la forme des barres de scrolling
    Pour l'instant je bloque sur le problème suivant : ce programme fonctionne correctement (extension et barres)
    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
    #! python3
    # coding: utf-8
     
    '''
    afficher des images
    '''
     
    import os
    from tkinter import * 
    from PIL import Image, ImageTk
     
    racine = '/mnt/0ea0b27f-3be6-4d2c-b157-a62559e56142/Photos/Paris/2022/mars 2022/'
     
     
    if __name__ == "__main__": # création du main
        global images
        images = os.listdir(racine)
        image_courante = 0
        fenetre = Tk() 
        ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        cadre = Frame(fenetre)
        cadre.rowconfigure(0, weight=1)
        cadre.columnconfigure(0, weight=1)
        cadre.pack(expand=1, fill=BOTH)
        canvas = Canvas(cadre)
        canvas.grid(row=0, column=0, sticky=N+S+E+W)
        canvas.create_image(0, 0, image=ara)
        scroll_x = Scrollbar(cadre, orient=HORIZONTAL, command=canvas.xview)
        scroll_x.grid(row=1, column=0, sticky=E+W)
        scroll_y = Scrollbar(cadre, orient=VERTICAL, command=canvas.yview)
        scroll_y.grid(row=0, column=1, sticky=N+S)
        canvas["xscrollcommand"] = scroll_x.set
        canvas["yscrollcommand"] = scroll_y.set
        canvas["scrollregion"] = canvas.bbox(ALL)
        bouton = Button(fenetre, text="Quitter", command=fenetre.quit)
        bouton.pack()
        mainloop()
    Par contre, si je déplace le code GUI dans une fonction, il n'y a plus d'affichage du contenu, le cadre et les barres étant affichées correctement :
    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
    #! python3
    # coding: utf-8
     
    '''
    afficher des images
    '''
     
    import os
    from tkinter import * 
    from PIL import Image, ImageTk
     
    racine = '/mnt/0ea0b27f-3be6-4d2c-b157-a62559e56142/Photos/Paris/2022/mars 2022/'
     
     
    def fenetrage(): 
        fenetre = Tk() 
        ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        cadre = Frame(fenetre)
        cadre.rowconfigure(0, weight=1)
        cadre.columnconfigure(0, weight=1)
        cadre.pack(expand=1, fill=BOTH)
        canvas = Canvas(cadre)
        canvas.grid(row=0, column=0, sticky=N+S+E+W)
        canvas.create_image(0, 0, image=ara)
        scroll_x = Scrollbar(cadre, orient=HORIZONTAL, command=canvas.xview)
        scroll_x.grid(row=1, column=0, sticky=E+W)
        scroll_y = Scrollbar(cadre, orient=VERTICAL, command=canvas.yview)
        scroll_y.grid(row=0, column=1, sticky=N+S)
        canvas["xscrollcommand"] = scroll_x.set
        canvas["yscrollcommand"] = scroll_y.set
        canvas["scrollregion"] = canvas.bbox(ALL)
        bouton = Button(fenetre, text="Quitter", command=fenetre.quit)
        bouton.pack()
     
     
     
    if __name__ == "__main__": # création du main
        global images
        images = os.listdir(racine)
        image_courante = 0
     
        fenetrage()
        mainloop()
    Merci pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Citation Envoyé par jam7575 Voir le message
    Par contre, si je déplace le code GUI dans une fonction, il n'y a plus d'affichage du contenu, le cadre et les barres étant affichées correctement
    Ben oui: ara, variable associée à l'image, est "locale": à la sortie de la fonction, l'objet Image n'aura plus de référence (et aucune raison de la garder en mémoire) et sera détruite.
    Déplacez l'appel à mainloop à la fin de la fonction: du coup, on n'en sort plus et l'image devrait être visible.

    Citation Envoyé par jam7575 Voir le message
    la possibilité d'en étendre l'affichage quand on étend le cadre
    A la base, l'image est un tableau de MxN pixels. Affichez là avec un Label ou un Button (avec image=...) tkinter dimensionnera le widget en fonction de ces MxN pixels.
    Si on veut agrandir l'image, il ne suffira pas de redimensionner le widget, il faudra aussi créer l'image avec cette dimension (et les éventuels soucis de "blurring"...) avec PIL.

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Par défaut affichage avec canvas dans une fonction
    Merci pour ce retour,
    mais quelque chose m'échappe : 'ara' est locale certes, mais je n'arrive pas à comprendre pourquoi il n'y a pas d'affichage,
    il n'y a aucune erreur de compilation, tout semble cohérent. Quelle est la raison pour laquelle tout fonctionne dans le programme principal
    et ne fonctionne plus dans la fonction ?
    Si je comprends bien votre explication, c'est parce que le fait de sortir de la fonction 'efface' tout ? Pourtant, la fenêtre et le canvas, définis seulement dans
    la fonction, restent bien affichés eux.
    Il y a une logique que je ne saisis pas.

    Ceci dit, vous avez raison, le fait d'ajouter "global ara" dans la fonction 'force' l'affichage.

    Je reviendrai plus tard sur mes histoires d'extension de cadre et de forme de barre.

    Merci encore et bonne soirée

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    Si je comprends bien votre explication, c'est parce que le fait de sortir de la fonction 'efface' tout ? Pourtant, la fenêtre et le canvas, définis seulement dans
    la fonction, restent bien affichés eux.
    Les widgets restent référencés "automatiquement" par tkinter. Ce n'est pas le cas pour les Images et les Variables.
    La logique du truc est difficile. Ce sont des choix des développeurs du module (tkinter) qu'on peut commencer à comprendre en se mettant à leur place (pour réaliser le module).

    L'utilisateur (du module) peut se contenter de lire la documentation et s'en sortir très bien sans comprendre.

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

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Les widgets restent référencés "automatiquement" par tkinter. Ce n'est pas le cas pour les Images et les Variables.
    La logique du truc est difficile. Ce sont des choix des développeurs du module (tkinter) qu'on peut commencer à comprendre en se mettant à leur place (pour réaliser le module).

    L'utilisateur (du module) peut se contenter de lire la documentation et s'en sortir très bien sans comprendre.

    - W
    Merci,
    je comprends.
    Jusqu'ici les experts python me présentaient une cohérence totale. D'où mon trouble.

    Merci encore

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    Jusqu'ici les experts python me présentaient une cohérence totale. D'où mon trouble.
    C'est cohérent avec la documentation point barre.

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

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    Merci,
    je comprends.
    Jusqu'ici les experts python me présentaient une cohérence totale. D'où mon trouble.

    Merci encore
    Puisque vous le dites...
    J'avoue ne pas avoir lu toute la doc en profondeur et jusqu'ici je n'avais jamais fait face à cette caractéristique.
    Le point suivant est abordé dans mon message un peu plus haut et concerne l'affichage des barres de scrolling.
    Cette fois j'ai isolé dans une fonction l'affichage seul de l'image et les barres ne fonctionnent plus :

    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
    #! python3
    # coding: utf-8
     
    '''
    afficher des images
    '''
     
    import os
    from tkinter import * 
    from PIL import Image, ImageTk
     
    racine = '/mnt/0ea0b27f-3be6-4d2c-b157-a62559e56142/Photos/Paris/2022/mars 2022/'
     
    def affiche1():
        global ara, canvas
        ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        canvas.create_image(0, 0, image=ara) 
     
    if __name__ == "__main__": # création du main
        global images
        images = os.listdir(racine)
        image_courante = 0
        fenetre = Tk() 
        #ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        cadre = Frame(fenetre)
        cadre.rowconfigure(0, weight=1)
        cadre.columnconfigure(0, weight=1)
        cadre.pack(expand=1, fill=BOTH)
        canvas = Canvas(cadre)
        canvas.grid(row=0, column=0, sticky=N+S+E+W)
        #canvas.create_image(0, 0, image=ara)
        scroll_x = Scrollbar(cadre, orient=HORIZONTAL, command=canvas.xview)
        scroll_x.grid(row=1, column=0, sticky=E+W)
        scroll_y = Scrollbar(cadre, orient=VERTICAL, command=canvas.yview)
        scroll_y.grid(row=0, column=1, sticky=N+S)
        canvas["xscrollcommand"] = scroll_x.set
        canvas["yscrollcommand"] = scroll_y.set
        canvas["scrollregion"] = canvas.bbox(ALL)
        bouton = Button(fenetre, text="Quitter", command=fenetre.quit)
        bouton.pack(side=LEFT)
        afficher = Button(fenetre, text="Afficher", command=affiche1)
        afficher.pack(side=LEFT)
        mainloop()
    Nom : affichage.png
Affichages : 733
Taille : 327,6 Ko

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 129
    Par défaut tkinter canvas, affichage extensible avec barre de scrolling correctes
    Bonsoir,
    je reprends. Avec vos remarques, le programme suivant m'affiche une image convenable :
    1. extensible
    2. barres de scrolling correctes

    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
    #! python3
    # coding: utf-8
     
    '''
    afficher une image avec extension possible et barres de scrolling correctes
    '''
     
    import os
    from tkinter import * 
    from PIL import Image, ImageTk
     
    racine = '/mnt/0ea0b27f-3be6-4d2c-b157-a62559e56142/Photos/Paris/2022/mars 2022/'
     
     
    def fenetrage(): 
        global ara, canvas
        fenetre = Tk() 
        ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        cadre = Frame(fenetre)
        cadre.rowconfigure(0, weight=1)
        cadre.columnconfigure(0, weight=1)
        cadre.pack(expand=1, fill=BOTH)
        canvas = Canvas(cadre)
        canvas.grid(row=0, column=0, sticky=N+S+E+W)
        canvas.create_image(0, 0, image=ara)
        scroll_x = Scrollbar(cadre, orient=HORIZONTAL, command=canvas.xview)
        scroll_x.grid(row=1, column=0, sticky=E+W)
        scroll_y = Scrollbar(cadre, orient=VERTICAL, command=canvas.yview)
        scroll_y.grid(row=0, column=1, sticky=N+S)
        canvas["xscrollcommand"] = scroll_x.set
        canvas["yscrollcommand"] = scroll_y.set
        canvas["scrollregion"] = canvas.bbox(ALL)
        bouton = Button(fenetre, text="Quitter", command=fenetre.quit)
        bouton.pack(side=LEFT
        age(0, 0, image=ara)
     
    if __name__ == "__main__": # création du main
        global images
        images = os.listdir(racine)
        image_courante = 0
     
        fenetrage()
        mainloop()
    Si maintenant, je déplace l'affichage du contenu via un bouton 'affichage' et une fonction assurant cet affichage :
    1. l'image reste extensible,
    2. mais les barres de scrolling 'disparaissent'

    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
    #! python3
    # coding: utf-8
     
    '''
    afficher une image avec extension possible et barres de scrolling correctes
    '''
     
    import os
    from tkinter import * 
    from PIL import Image, ImageTk
     
    racine = '/mnt/0ea0b27f-3be6-4d2c-b157-a62559e56142/Photos/Paris/2022/mars 2022/'
     
     
    def fenetrage(): 
        global canvas
        fenetre = Tk() 
        #ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        cadre = Frame(fenetre)
        cadre.rowconfigure(0, weight=1)
        cadre.columnconfigure(0, weight=1)
        cadre.pack(expand=1, fill=BOTH)
        canvas = Canvas(cadre)
        canvas.grid(row=0, column=0, sticky=N+S+E+W)
        #canvas.create_image(0, 0, image=ara)
        scroll_x = Scrollbar(cadre, orient=HORIZONTAL, command=canvas.xview)
        scroll_x.grid(row=1, column=0, sticky=E+W)
        scroll_y = Scrollbar(cadre, orient=VERTICAL, command=canvas.yview)
        scroll_y.grid(row=0, column=1, sticky=N+S)
        canvas["xscrollcommand"] = scroll_x.set
        canvas["yscrollcommand"] = scroll_y.set
        canvas["scrollregion"] = canvas.bbox(ALL)
        bouton = Button(fenetre, text="Quitter", command=fenetre.quit)
        bouton.pack(side=LEFT)
        afficher = Button(fenetre, text="Afficher", command=affiche1)
        afficher.pack(side=LEFT)
     
    def affiche1():
        global ara, canvas
        ara = ImageTk.PhotoImage(Image.open(racine+images[image_courante]))
        canvas.create_image(0, 0, image=ara)
     
    if __name__ == "__main__": # création du main
        global images
        images = os.listdir(racine)
        image_courante = 0
     
        fenetrage()
        mainloop()
    Nom : affichage.png
Affichages : 774
Taille : 274,4 Ko

    Sans doute un problème du même tonneau...

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

Discussions similaires

  1. affichage d'une image avec du swing
    Par burzno dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 26/05/2007, 18h04
  2. Problème d'affichage d'une image avec Glade.
    Par tistri dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 21/04/2007, 18h56
  3. affichage d'une image avec les servlets
    Par hassanovich dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 03/11/2006, 10h35
  4. Affichage d'une image avec changement quand le pointeur est dessus
    Par mauriiice dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2006, 20h21
  5. [GD] Problème d'affichage d'une image avec gd2
    Par turini dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h59

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