Affichage d'une image tkinter (python)

Le problème exposé dans ce sujet a été résolu.

Bonjour, ce code-ci est censé afficher une image sur un canvas tkinter:

import tkinter as tk

class Scrabble:
    def __init__(self):
        self.fen = tk.Tk()
        image = tk.PhotoImage(file="lettres/plateau.png")
        self.can = tk.Canvas(self.fen,width=640,height=640)
        self.can.create_image(320,320,image=image)        
        self.can.pack()


jeu = Scrabble()
jeu.fen.mainloop()

Mais ce que je ne comprend pas, c’est pourquoi ça ne marche pas ; pas de message d’erreur, juste un Canvas vide. en revanche, le meme code en dehors de la classe "Scrabble" fonctionne très bien… Merci pour vos lumières ^^

+0 -0

Bonjour @narcibrook.

Un moyen d’afficher l’image est de créer dans la classe une propriété self.image au lieu de la variable temporaire image, en effet il semble que que l’image TK soit purgée par le garbage Collector dès que la variable qui y fait référence n’est plus utilisée, en la stockant dans une proprièté de Scrabble cela évite son eéfacement contrairement à image qui n’existe que dans Scrabble.__init__ et pas dans dans j’objet jeu.

Mon hypothèse est à confirmer (https://effbot.org/tkinterbook/photoimage.htm) mais la méthode fonctionne.

+0 -0

Bonsoir @kayou, merci pour ta réponse rapide, et surtout l’explication du pourquoi du comment ^^ Du coup j’ai rectifié et ça fontionne:

import tkinter as tk

class Scrabble(tk.Tk):
    def __init__(self,image):
        tk.Tk.__init__(self)
        self.background = tk.PhotoImage(file=image)
        
    def new_table(self,background):
        return Table(self.background)
        
class Table(tk.Canvas):
    def __init__(self,image):
        tk.Canvas.__init__(self)
        self.configure(width=640,height=640)
        self.create_image(320,320,image=image)


img_source = "lettres/plateau.png"
jeu = Scrabble(img_source)
table = jeu.new_table(jeu.background)
table.pack()

Il faudrait que je me trouve un bon tuto sur ce fameux "Garbage Collector" car je pratique un peu en dilettante pour le moment ^^

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte