Problème avec itemconfig du module Tkinter

Résolu/Fermé
FriFy - 10 janv. 2022 à 19:48
 FriFy - 13 janv. 2022 à 10:12
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

yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 Ambassadeur 1 556
10 janv. 2022 à 20:19
bonjour,
le programme a toujours fonctionné, et cela vient de changer brusquement?
0
pas exactement : j'ai d'abord ajouté le bout de code sensé changer l'image, et à ce moment là, au lieu de la changer, ça la fait disparaître. Voulez-vous que je vous envoie le programme ?
0
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 1 556
10 janv. 2022 à 21:32
Merci d'utiliser les balises de code si tu partages le programme ici: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code.
0
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
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 1 556
11 janv. 2022 à 19:06
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
voici le lien du dossier du programme sur google drive :
https://drive.google.com/drive/folders/13wkBSapWI1DXLN3gwMTU85i498rbPqcA?usp=sharing
0

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

Posez votre question
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 Ambassadeur 1 556
13 janv. 2022 à 09:52
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
ç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