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:
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:
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
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
1 pièce(s) jointe(s)
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:
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:
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() |
Pièce jointe 616150
Sans doute un problème du même tonneau...