"not enough free memory for image buffer"

Fermé
Florine - 29 avril 2019 à 00:42
 Florine - 29 avril 2019 à 01:52
Bonsoir,

dans mon programme je rencontre un petit problème. Python m'affiche comme message d'erreur :
Traceback (most recent call last):
  File "C:\Users\flori\Documents\Scolaire\Terminale S\ISN\projet.png\Premiere page.py", line 253, in <module>
    photo6=PhotoImage(file="horlogesansfond.png").zoom(35).subsample(32)
  File "C:\Users\flori\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3568, in zoom
    self.tk.call(destImage, 'copy', self.name, '-zoom',x,y)
_tkinter.TclError: not enough free memory for image buffer
>>> 


Je suppose que c'est que la mémoire image est atteinte. Or il me reste encore beaucoup d'image à afficher…
comment puis-je faire pour résoudre ce problème ? Faut-il supprimer les images au fur et à mesure ? si oui comment faire s'il-vous-plaît ?

voici un extrait de mon programme pour que ça puisse vous aider :

from tkinter import* #importer la bibliothèque tkinter
from tkinter.messagebox import*
import pygame
import webbrowser
from time import gmtime,strftime

pygame.init() #initialiser pygame

main=Tk() #Ouvrir une fenêtre 
main.title("Infected World")#donner un nom à la fenêtre, ici le nom du jeu
main.geometry("600x480") #dimension de la fenêtre
main.iconbitmap("épidémie.ico") #Modification de l'icone de la fenêtre
main.configure (bg="dark slate gray")

#Intégrer une bande sonore dès l'ouverture de la fenêtre, qui tourne en boucle
sons_n1=pygame.mixer.Sound("laboratoire.wav")
sons_n1.set_volume(0.2)
sons_n1.play(-1)

#--------------------------------première fenêtre---------------------------------------------------------

#Création d'une fonction effacer, qui efface le bouton et l'image de la fenêtre
def effacer():
     canvas1.delete()
     page1.destroy()
     page2.pack()
     
#Création d'une fonction "quitter", qui détruit la page principale
def quitter():
    main.destroy()

#Création d'un Menu et d'un sous-menu,en cascade
menu=Menu(main)
sousmenu=Menu(menu, tearoff=0)
menu.add_cascade(label="Menu",menu=sousmenu)
sousmenu.add_command(label="Quitter",command=quitter)
main.config(menu=menu)


#Création d'une frame
page1=Frame(main,width=600,height=480,bg="dark slate gray")
page1.pack()

#Création du titre
Labeltitre=Label(page1,text="Infected World",font=("Stencil",55),fg="white",bg="dark slate gray")
Labeltitre.pack(expand=YES)

#Importation d'une photo
photo=PhotoImage(file="porte.png").zoom(35).subsample(32)
canvas1=Canvas(page1,width=600,height=450,bd=0,highlightthickness=0)
canvas1.create_image(300,225,image=photo)
canvas1.pack(expand=YES)

#Création d'un premier bouton au centre de la page
bouton1=Button(page1,text="Jouer",height = "2", width = "20",font=("Stencil",20),command=effacer)
bouton1.pack(expand=YES)


#----------------------------------deuxième fenêtre--------------------------------------------
#Création d'une deuxième frame
page2=Frame(main,width=600,height=600,bg="dark slate gray")
page2.forget()

#Création d'une fonction lettre, qui efface le bouton et l'image de la fenêtre
def Lettre():
     canvas2.delete()
     page2.destroy()
     page3.pack()
     textelettre.deiconify() #fait réapparaitre la fenetre du texte

#Création d'un label pour expliquer
Labeltitre=Label(page2,text="Vous êtes entrés dans le laboratoire.\n Vous trouvez une lettre sur le bureau...",font=("Stencil",15),fg="white",bg="dark slate gray")
Labeltitre.pack(expand=YES)

#Importation d'une photo
photo2=PhotoImage(file="fond labo.png").zoom(35).subsample(32)
canvas2=Canvas(page2,width=600,height=450,bd=0,highlightthickness=0,bg="dark slate gray")
canvas2.create_image(300,225,image=photo2)
canvas2.pack(expand=YES)

#Création d'un premier bouton au centre de la page
bouton2=Button(page2,text="Lettre",height = "2", width = "20",font=("Stencil",20),command=Lettre)
bouton2.pack(expand=YES)





Configuration: Windows / Edge 17.17134

1 réponse

quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 346
29 avril 2019 à 01:37
Bonjour,
c'est au moment où vous faites un zoom de 35 sur l'image que ça prends énormément de place, surtout que en multipliant par 35 la taille de l'image, vous multipliez par 35^2 soit 1225 le nombre de pixel. Je ne sais pas quelle est la limite de taille mais ce n'est pas étonnant que ça dépasse rapidement cette limite.
Supprimer les images au fur et à mesure ne changera probablement rien, en revanche vous divisez ensuite la taille par 32 pour avoir un rapport final de 35/32.
Ce rapport est il réellement important ? Vous pourriez par exemple réduire ce rapport à 12/11 par exemple qui est assez proche, ou même avec des nombres encore plus petits.
Vous pouvez aussi redimentionner l'image à la main pour que le programme n'ai pas besoins de la redimentionner lui même.
Sinon vous pouvez chercher une autre manière de redimentionner directement avec un ratio non entier. Il me semble que PIL permet de faire ça.
2
J'ai réduit le rapport à 9/8 et ça marche pour le moment, merci beaucoup et bonne soirée !
0