Erreur dans code Tkinter

Bonjour,

Je suis en train de créer une interface graphique, et au début de mon programme, j'ai déjà des messages d'erreur bizarres. J'ai essayé anaconda, spyder, ainsi que VsCode mais rien n'y fait. Quelqu'un saurait-il m'aider ?

L'erreur en question est :"TclError: image "pyimage9" doesn't exist". Par moment l'interface correctement, et à l'essai d'après, elle réapparaît.

Bien entendu, l'image est dans le même répertoire que le fichier py, et l'erreur persiste même en spécifiant le chemin d'accès

Voici mon code :

import tkinter as tk
from tkinter.filedialog import *
from PIL import Image, ImageTk

virvolt = tk.Tk()

# Taille de la fenêtre
virvolt.geometry("350x600")

# Logo
logo = ImageTk.PhotoImage(file="C:\HDD\DATA\ESME\INGE2\Stage\Virvolt\logopourvirvolt.png")
acceuil = tk.Canvas(virvolt, width=240, height=50)
acceuil.create_image(150, 30, image=logo)
acceuil.pack()

# Les 3 boutons pour choisir le programme :
b1 = tk.Button(virvolt, text='programme Soft')
b2 = tk.Button(virvolt, text='programme medium')
b3 = tk.Button(virvolt, text='programme sport')

b1.pack()
b2.pack()
b3.pack()
virvolt.mainloop()

Merci à tous par avance
Windows / Chrome 114.0.0.0

7 réponses

  1. J'ai vu sur le net que certains avaient corrigé le problème en précisant le master dans PhotoImage()

    À tester :

    logo = ImageTk.PhotoImage(im, master=virvolt)
    1. Contributeur

      bonjour,

      bizarre, d'où vient ce nom, pyimage9?

      1. C'est une référence interne à Tcl 

    2. Salut,

      Déjà, je doublerai les anti-slash :

      ImageTk.PhotoImage(file="C:\\HDD\\DATA\\ESME\\INGE2\\Stage\\Virvolt\\logopourvirvolt.png")

      L'une des raisons pourrait être que plusieurs instances de Tk() sont toujours en mémoire surement parce qu'elles ont probablement planté avant le mainloop().

      Si c'est bien le cas, il suffit d'exécuter le code ci-dessous et de fermer toutes les fenêtres Tkinter qui apparaissent :

      import tkinter as tk
      root = tk.Tk()
      root.mainloop()
      1. merci beaucoup pour votre réponse, je vais essayer les doubles backslash, 

        la seconde partie de code est à implanter dans mon code d'origine ? ou juste à executer dans un autre fichier à coté ?

    3. Bonjour,

      Ca doit marcher, normalement (ici avec une image de mon cru) :

      import tkinter as tk
      from tkinter.filedialog import *
      from PIL import Image, ImageTk
      
      main_win = tk.Tk()
      main_win.geometry("350x300")
      
      accueil = tk.Canvas(main_win, width=240, height=150)
      accueil.pack()
      
      im = Image.open("stone.jpg")
      logo = ImageTk.PhotoImage(im)
      accueil.create_image(10, 10, anchor = NW, image=logo)
      
      tk.Button(main_win, text='programme soft').pack()
      tk.Button(main_win, text='programme medium').pack()
      tk.Button(main_win, text='programme sport').pack()
      
      main_win.mainloop()
      1. Bonjour, merci beaucoup pour votre réponse, helas en prenant votre code et une image à moi, l'erreur apparait à nouveau

        Tcl Error : "pyimage4" doesn't exist

    4. Jai d'ailleurs changé de manière d'importation, je vous fournis mon code mis à jour pour plus de précisions la partie posant problème est laissée en commentaire à la fin : 

      # -*- coding: utf-8 -*-
      """
      Created on Wed Jun 28 14:56:00 2023
      
      @author: 
      """
      
      from tkinter import *
      from tkinter.ttk import *
      from tkinter.filedialog import *
      from PIL import Image, ImageTk
      virvolt = Tk()
      
      
      virvolt.geometry('360x600')
      virvolt.minsize(width=360, height=600)
      virvolt.configure(bg='#012AFF')
      #boutons
      
      b1= Button(virvolt, text='Assistance faible',)
      b2= Button(virvolt, text='Assistance medium')
      b3= Button(virvolt, text='Assistance haute')
      
      
      
      # Fonction pour ajuster la position des boutons en fonction de la taille de la fenêtre
      def position_boutons(event=None):
          window_width = virvolt.winfo_width()
          window_height = virvolt.winfo_height()
          b3_width = b3.winfo_width()
          b2_width = b2.winfo_width()
      
          b3_x = window_width - b3_width 
          b2_x = (window_width - b2_width)//2
          
          # Calcul des nouvelles coordonnées des boutons en fonction de la taille de la fenêtre
          b1_x = int(window_width * 0)
          b1_y = int(window_height * 0.95)
      
      
          b2_y = int(window_height * 0.95)
      
          b3_y = int(window_height * 0.95)
      
          # Définition des nouvelles coordonnées des boutons
          b1.place(x=b1_x, y=b1_y)
          b2.place(x=b2_x, y=b2_y)
          b3.place(x=b3_x, y=b3_y)
      
      # Événement de redimensionnement de la fenêtre pour ajuster la position des boutons
      virvolt.bind('<Configure>', position_boutons)
      
      
      # Premier ajustement de la position des boutons lors du démarrage
      virvolt.update()
      position_boutons()
      
      style = Style()
       
      style.configure('TButton', font =
                     ('calibri', 11, 'bold'),
                          borderwidth = '4')
       
      # Changes will be reflected
      # by the movement of mouse.
      style.map('TButton', foreground = [('active', '!disabled', '#4ABD00')],
                           background = [('active', 'black')])
      """
      #logo
      
      logo = PhotoImage(file="virvoltlogo.png")
      acceuil=Canvas(virvolt, width=175, height=45)
      acceuil.create_image(0,0,anchor=NW, image=logo)
      acceuil.pack()"""
      
      virvolt.mainloop()
      
      
      
      
      1. Bonjour,

        OK, mais pourrais-tu simplement copier/coller les 19 lignes mon code tel qu'il est

        sans rien y changer, sauf le nom de l'image, car je vois qu'il te manque la ligne

         Image.open():

        im = Image.open("virvoltlogo.png")
        logo = ImageTk.PhotoImage(im)
        accueil.create_image(10, 10, anchor = NW, image=logo)

        Tu fais exactement ça et tu me dis ce que ça donne

        1. ton code dans un ordre plus logique et regarde bien les lignes 42,43,44

          # -*- coding: utf-8 -*-
          """
          Created on Wed Jun 28 14:56:00 2023
          @author: 
          """
          
          from tkinter import *
          from tkinter.ttk import *
          from tkinter.filedialog import *
          from PIL import Image, ImageTk
           
          def position_boutons(event=None):
              ''' ajuste la position des boutons en fonction de la taille de la fenêtre '''
          
              window_width = virvolt.winfo_width()
              window_height = virvolt.winfo_height()
              b3_width = b3.winfo_width()
              b2_width = b2.winfo_width()
          
              b3_x = window_width - b3_width 
              b2_x = (window_width - b2_width)//2
              
              # Calcul des nouvelles coordonnées des boutons en fonction de la taille de la fenêtre
              b1_x = int(window_width * 0)
              b1_y = int(window_height * 0.95)
              b2_y = int(window_height * 0.95)
              b3_y = int(window_height * 0.95)
          
              # Définition des nouvelles coordonnées des boutons
              b1.place(x=b1_x, y=b1_y)
              b2.place(x=b2_x, y=b2_y)
              b3.place(x=b3_x, y=b3_y)
          
          virvolt = Tk()
          virvolt.geometry('360x600')
          virvolt.minsize(width=360, height=400)
          virvolt.configure(bg='#012AFF')
          
          accueil=Canvas(virvolt, width=175, height=45)
          accueil.pack()
          
          im = Image.open("virvoltlogo.png")
          logo = ImageTk.PhotoImage(im)
          accueil.create_image(0,0,anchor=NW, image=logo)
          
          b1= Button(virvolt, text='Assistance faible',)
          b2= Button(virvolt, text='Assistance medium')
          b3= Button(virvolt, text='Assistance haute')
          
          virvolt.bind('<Configure>', position_boutons)
          virvolt.update()
          position_boutons()
          
          style = Style()
          style.configure('TButton', font = ('calibri', 11, 'bold'), borderwidth = '4')
          style.map('TButton', foreground = [('active', '!disabled', '#4ABD00')], background = [('active', 'black')])
          
          virvolt.mainloop()
          
        2. @Phil_1857

          Ca marche niquel avec le code que tu m'as refourni, en esperant que l'erreur ne resurgissent pas de nulle part comme elle l'avait fait au départ. 

          Un grand merci à tous pour votre aide précieuse Phil et Diablo !!! <3  

        3. @Phil_1857

          Fausse joie, après quelques ouverture de check, l'erreur Tcl réapparait...

        4. @willow

          Ce qui pourrait-être intéressant quand l'erreur apparait, c'est de lancer le gestionnaire des tâches et dans l'onglet Processus voir combien d'instances de tk apparaissent.

      2. Bonjour,

        Par contre, si tu pouvais écrire accueil et non pas acceuil .... :-)