Erreur dans code Tkinter

willow -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -

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. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140
     

    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
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

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

    0
    1. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140
       

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

      0
  3. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140
     

    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()
    0
    1. willow
       

      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é ?

      0
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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()
    0
    1. willow
       

      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

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. willow
     

    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()
    
    
    
    
    0
  7. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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

    0
    1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
       

      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()
      
      1
      1. willow > Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention  
         

        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  

        0
      2. willow > Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention  
         

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

        0
      3. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140 > 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.

        1
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour,

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

    0