Problème avec itemconfig du module Tkinter

Résolu
Bonjour,

J'ai un programme qui est censé changer l'apparence d'une image avec la commande itemconfig de Tkinter, mais au lieu de cela, l'image disparaît.
Quelqu'un pourrait m'aider ?

Configuration: Windows / Edge 97.0.1072.55

6 réponses

  1. Contributeur
    bonjour,
    le programme a toujours fonctionné, et cela vient de changer brusquement?
    0
    1. Ok, voici le code. La commande défectueuse se situe aux lignes 286 et 290.
      # Le projet jeufiliforme.py est un jeu de plateau mettant en scène un personnage du nom de M. Filiforme,
      # qui a pour but de courir vers la sortie.
      
      
      # Importation des modules en global
      from tkinter import *
      import random
      import time
      
      
      # Boucle principale, mise en place de la fenêtre
      class Jeu:
          def __init__(self):
              self.tk = Tk()
              self.tk.title("M. Filiforme court vers la sortie")
              self.tk.resizable(0, 0)
              self.tk.wm_attributes("-topmost", 1)
              self.canvas = Canvas(self.tk, width=500, height=500, highlightthickness=0)
              self.canvas.pack()
              self.tk.update()
              self.hauteur_canvas = 500
              self.largeur_canvas = 500
              self.ap = PhotoImage(file="arriere-plan1.gif")
              larg = self.ap.width()
              haut = self.ap.height()
              for x in range(0, 5):
                  for y in range(0, 5):
                      self.canvas.create_image(x * larg, y * haut, image=self.ap, anchor='nw')
      
              self.lutins = []
              self.enfonction = True
              self.centre = (self.largeur_canvas / 2, self.hauteur_canvas / 2)
      
          def partie_terminee(self):
              porte.ouvrir()
              self.tk.update_idletasks()
              self.tk.update()
              time.sleep(0.5)
              self.canvas.delete(personnage.image)
              self.tk.update_idletasks()
              self.tk.update()
              time.sleep(0.5)
              porte.fermer()
              self.tk.update_idletasks()
              self.tk.update()
              time.sleep(0.5)
              self.canvas.delete(ALL)
              self.canvas.create_text(self.centre, text='Tu as gagné !', fill='blue', font=('Helvetica', 30))
      
          def boucle_principale(self):
              while 1:
                  if self.enfonction:
                      for lutin in self.lutins:
                          lutin.deplacer()
                  self.tk.update_idletasks()
                  self.tk.update()
                  time.sleep(0.01)
      
      
      # Définition des coordonnées
      class Coords:
          def __init__(self, x1=0, y1=0, x2=0, y2=0):
              self.x1 = x1
              self.y1 = y1
              self.x2 = x2
              self.y2 = y2
      
      
      # Les fonctions suivantes vérifient s'il y a des collisions entre les lutins
      def dans_x(co1, co2):
          if (co1.x1 > co2.x1 and co1.x1 < co2.x2) \
              or (co1.x2 > co2.x1 and co1.x2 < co2.x2) \
              or (co2.x1 > co1.x1 and co2.x1 < co1.x2) \
              or (co2.x2 > co1.x1 and co2.x2 < co1.x1):
              return True
          else:
              return False
      
      
      def dans_y(co1, co2):
          if (co1.y1 > co2.y1 and co1.y1 < co2.y2) \
                 or (co1.y2 > co2.y1 and co1.y2 < co2.y2) \
                 or (co2.y1 > co1.y1 and co2.y1 < co1.y2) \
                 or (co2.y2 > co1.y1 and co2.y2 < co1.y1):
              return True
          else:
              return False
      
      
      def collision_gauche(co1, co2):
          if dans_y(co1, co2):
              if co1.x1 <= co2.x2 and co1.x1 >= co2.x1:
                  return True
          return False
      
      
      def collision_droite(co1, co2):
          if dans_y(co1, co2):
              if co1.x2 >= co2.x1 and co1.x2 <= co2.x2:
                  return True
          return False
      
      
      def collision_haut(co1, co2):
          if dans_x(co1, co2):
              if co1.y1 <= co2.y2 and co1.y1 >= co2.y1:
                  return True
          return False
      
      
      def collision_bas(y, co1, co2):
          if dans_x(co1, co2):
              y_calc = co1.y2 + y
              if y_calc >= co2.y1 and y_calc <= co2.y2:
                  return True
          return False
      
      
      # La classe des lutins
      class Lutin:
          def __init__(self, jeu):
              self.jeu = jeu
              self.finjeu = False
              self.coordonnees = None
      
          def deplacer(self):
              pass
      
          def coords(self):
              return self.coordonnees
      
      
      # La classe des plateformes
      class LutinPlateForme(Lutin):
          def __init__(self, jeu, image_photo, x, y, largeur, hauteur):
              Lutin.__init__(self, jeu)
              self.image_photo = image_photo
              self.image = jeu.canvas.create_image(x, y, image=self.image_photo, anchor='nw')
              self.coordonnees = Coords(x, y, x + largeur, y + hauteur)
      
      
      # La classe de M. Filiforme
      class LutinPersonnage(Lutin):
          def __init__(self, jeu):
              Lutin.__init__(self, jeu)
              self.images_gauche = [
                  PhotoImage(file="fil-G1.gif"),
                  PhotoImage(file="fil-G2.gif"),
                  PhotoImage(file="fil-G3.gif")
              ]
              self.images_droite = [
                  PhotoImage(file="fil-D1.gif"),
                  PhotoImage(file="fil-D2.gif"),
                  PhotoImage(file="fil-D3.gif")
              ]
              self.image = jeu.canvas.create_image(200, 470, \
                      image=self.images_gauche[0], anchor='nw')
              self.x = -2
              self.y = 0
              self.image_courante = 0
              self.ajout_image_courante = 1
              self.compte_sauts = 0
              self.derniere_heure = time.time()
              self.coordonnees = Coords()
              jeu.canvas.bind_all('<KeyPress-Left>', self.tourner_a_gauche)
              jeu.canvas.bind_all('<KeyPress-Right>', self.tourner_a_droite)
              jeu.canvas.bind_all('<space>', self.sauter)
      
          def tourner_a_gauche(self, evt):
              if self.y == 0:
                  self.x = -2
      
          def tourner_a_droite(self, evt):
              if self.y == 0:
                  self.x = 2
      
          def sauter(self, evt):
              if self.y == 0:
                  self.y = -4
                  self.compte_sauts = 0
      
          def animer(self):
              if self.x != 0 and self.y == 0:
                  if time.time() - self.derniere_heure > 0.1:
                      self.derniere_heure = time.time()
                      self.image_courante += self.ajout_image_courante
                      if self.image_courante >= 2:
                          self.ajout_image_courante = -1
                      if self.image_courante <= 0:
                          self.ajout_image_courante = 1
              if self.x < 0:
                  if self.y != 0:
                      self.jeu.canvas.itemconfig(self.image, \
                          image=self.images_gauche[2])
                  else:
                      self.jeu.canvas.itemconfig(self.image, \
                          image=self.images_gauche[self.image_courante])
              elif self.x > 0:
                  if self.y != 0:
                      self.jeu.canvas.itemconfig(self.image, \
                          image=self.images_droite[2])
                  else:
                      self.jeu.canvas.itemconfig(self.image, \
                          image=self.images_droite[self.image_courante])
      
          def coords(self):
              xy = self.jeu.canvas.coords(self.image)
              self.coordonnees.x1 = xy[0]
              self.coordonnees.y1 = xy[1]
              self.coordonnees.x2 = xy[0] + 27
              self.coordonnees.y2 = xy[1] + 30
              return self.coordonnees
      
          def deplacer(self):
              self.animer()
              if self.y < 0:
                  self.compte_sauts += 1
                  if self.compte_sauts > 20:
                      self.y = 4
              if self.y > 0:
                  self.compte_sauts -= 1
              co = self.coords()
              gauche = True
              droite = True
              haut = True
              bas = True
              tombe = True
              if self.y > 0 and co.y2 >= self.jeu.hauteur_canvas:
                  self.y = 0
                  bas = False
              elif self.y < 0 and co.y1 <= 0:
                  self.y = 0
                  haut = False
              if self.x > 0 and co.x2 >= self.jeu.largeur_canvas:
                  self.x = 0
                  droite = False
              elif self.x < 0 and co.x1 <= 0:
                  self.x = 0
                  gauche = False
              for lutin in self.jeu.lutins:
                  if lutin == self:
                      continue
                  co_lutin = lutin.coords()
                  if haut and self.y < 0 and collision_haut(co, co_lutin):
                      self.y = -self.y
                      haut = False
                  if bas and self.y > 0 and collision_bas(self.y, co, co_lutin):
                      self.y = co_lutin.y1 - co.y2
                      if self.y < 0:
                          self.y = 0
                      bas = False
                      haut = False
                  if bas and tombe and self.y == 0 \
                          and co.y2 < self.jeu.hauteur_canvas \
                          and collision_bas(1, co, co_lutin):
                      tombe = False
                  if gauche and self.x < 0 and collision_gauche(co, co_lutin):
                      self.x = 0
                      gauche = False
                      if lutin.finjeu:
                          self.jeu.enfonction = False
                          self.jeu.partie_terminee()
                  if droite and self.x > 0 and collision_droite(co, co_lutin):
                      self.x = 0
                      droite = False
                      if lutin.finjeu:
                          self.jeu.enfonction = False
                          self.jeu.partie_terminee()
              if tombe and bas and self.y == 0 \
                      and co.y2 < self.jeu.hauteur_canvas:
                  self.y = 4
              self.jeu.canvas.move(self.image, self.x, self.y)
      
      
      class LutinPorte(Lutin):
          def __init__(self, jeu, image_photo, x, y, largeur, hauteur,):
              Lutin.__init__(self, jeu)
              self.image_photo = image_photo
              self.image = jeu.canvas.create_image(x, y, \
                      image=self.image_photo, anchor='nw')
              self.coordonnees = Coords(x, y, x + (largeur / 2), y + hauteur)
              self.finjeu = True
      
      # Voilà les fonctions qui posent problème
          def ouvrir(self):
              self.jeu.canvas.itemconfig(self.image, image=PhotoImage(file="porte2.gif"))
              print('porte ouverte')
      
          def fermer(self):
              self.jeu.canvas.itemconfig(self.image, image=PhotoImage(file="porte1.gif"))
              print('porte fermée')
      
      
      # Création des objets de "Jeu" et de "Lutin"
      jeu = Jeu()
      plateforme1 = LutinPlateForme(jeu, PhotoImage(file="plate-forme1.gif"), \
          0, 480, 100, 10)
      plateforme2 = LutinPlateForme(jeu, PhotoImage(file="plate-forme1.gif"), \
          150, 440, 100, 10)
      plateforme3 = LutinPlateForme(jeu, PhotoImage(file="plate-forme1.gif"), \
          300, 400, 100, 10)
      plateforme4 = LutinPlateForme(jeu, PhotoImage(file="plate-forme1.gif"), \
          300, 160, 100, 10)
      plateforme5 = LutinPlateForme(jeu, PhotoImage(file="plate-forme2.gif"), \
          175, 350, 66, 10)
      plateforme6 = LutinPlateForme(jeu, PhotoImage(file="plate-forme2.gif"), \
          50, 300, 66, 10)
      plateforme7 = LutinPlateForme(jeu, PhotoImage(file="plate-forme2.gif"), \
          170, 120, 66, 10)
      plateforme8 = LutinPlateForme(jeu, PhotoImage(file="plate-forme2.gif"), \
          45, 60, 66, 10)
      plateforme9 = LutinPlateForme(jeu, PhotoImage(file="plate-forme3.gif"), \
          170, 250, 32, 10)
      plateforme10 = LutinPlateForme(jeu, PhotoImage(file="plate-forme3.gif"), \
          230, 200, 32, 10)
      jeu.lutins.append(plateforme1)
      jeu.lutins.append(plateforme2)
      jeu.lutins.append(plateforme3)
      jeu.lutins.append(plateforme4)
      jeu.lutins.append(plateforme5)
      jeu.lutins.append(plateforme6)
      jeu.lutins.append(plateforme7)
      jeu.lutins.append(plateforme8)
      jeu.lutins.append(plateforme9)
      jeu.lutins.append(plateforme10)
      porte = LutinPorte(jeu, PhotoImage(file="porte1.gif"), 45, 30, 40, 35)
      jeu.lutins.append(porte)
      personnage = LutinPersonnage(jeu)
      jeu.lutins.append(personnage)
      jeu.boucle_principale()
      0
      1. Contributeur
        Tu n'as pas tenté de simplifier ton programme afin d'y laisser le minimum montrant le problème?
        Peux-tu partager les fichiers requis pour tester le programme?
        0
    2. voici le lien du dossier du programme sur google drive :
      https://drive.google.com/drive/folders/13wkBSapWI1DXLN3gwMTU85i498rbPqcA?usp=sharing
      0
      1. Contributeur
        En faisant ainsi
            def ouvrir(self):
                self.jeu.canvas.itemconfig(self.image, image=PhotoImage(file="porte2.gif"))
        
        l'image est "perdue" dès que tu quittes la fonction.

        En faisant ainsi
            def ouvrir(self):
                self.image_photo=PhotoImage(file="porte2.gif")
                self.jeu.canvas.itemconfig(self.image, image=self.image_photo)
        
        l'image est mémorisée (comme tu fais quand tu crées la porte).
        0
        1. ça fonctionne ! Merci beaucoup pour m'avoir aidé, ça faisait longtemps que j'étais resté bloqué sur cette erreur, je vais maintenant pouvoir avancer, merci encore !
          0