Python Forum

Full Version: Problem about image and button
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi,
I am doing a project on Tkinter, and I am facing 2 problems :

1- When I define a class and insert an image, it doesn't work. But, when I just define the frame, not with class, it works very well. Btw, it isn't a problem with where the image is saved.

2 - And here is a question now. I have a menu page and I want to make that if one button is clicked, it shows a new widget several frames later. I tried something that you can see in my code but it isn't working.

It would be awesome if you can help me.

Thanks a lot and have a nice day

Here is the code :
For question 1 :
The images aren't working but the text and button is working :
class Brittachoix(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        tableau = PhotoImage(file="tableau.png").zoom(4) 
        Canvasbritta = Canvas(self, width=largeur, height=hauteur, bg="#FFFFFF")
        TABLEAU = Canvasbritta.create_image(540,340, image=tableau)
        txt = Canvasbritta.create_text(540,570,text="Bonjour", font="Arial 28 italic", fill="red")
        Button(self, text='Femme suivante', command=lambda: master.switch_frame(Shirleychoix)).pack()
        Canvasbritta.pack()
        self.pack()
But when I put it out of the class, it is working !

BittaPerry = Frame(bvfenetre, bg="#FFFFFF")
largeur = 1080 
hauteur = 680 
tableau = PhotoImage(file="tableau.png").zoom(4) 
Canvasbritta = Canvas(BittaPerry, width=largeur, height=hauteur, bg="#FFFFFF")
TABLEAU = Canvasbritta.create_image(540,340, image=tableau)
txt = Canvasbritta.create_text(540,570,text="Britta Perry", font="Arial 28 italic", fill="red")
Canvasbritta.pack()
BittaPerry.pack(expand=YES)
2 - That is what I tried to do but it isn't working :

class Anniechoix(Frame):
        def __init__(self,master):
            Frame.__init__(self,master)
            Canvannie = Canvas(self, width=largeur, height=hauteur, bg="#FFFFFF")
            # TABLEAU = Canvannie.create_image(540,340, image=tableau)
            txt = Canvannie.create_text(540,570,text=nom[6], font="Arial 28 italic", fill="red")
            if i==1:
                Suivant = Button(self, text='Personnage suivant', command=lambda:master.switch_frame(Jeffchoix))
                Suivant.place(x=960,y=600)
            self.pack()
And previously, in the functino to switch to Anniechoix, I said destroy the previous, open the new one and i = 1 :

class SampleApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self._frame = None
        self.switch_frame(Bienvenue)
        
    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None : 
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()
        i = 1
I don't know if this is the problem, but you did not do this in your class.
BittaPerry.pack(expand=YES)  # is self.pack() in the class Brittachoix
Thanks for your answer but this wasn't the problem.

And btw, I solved the question 2, but I still have no idea of the problem for the first question
You need to keep the image variable. I think tableau, the image, was destroyed when the local variable tableau no longer exists. I tested the code below and it works for me
class Brittachoix(Frame):
    def __init__(self, root):
        super().__init__(root)
        self.tableau = PhotoImage(file="image.png").zoom(4) 
        Canvasbritta = Canvas(self, width=largeur, height=hauteur, bg="#FFFFFF")
        TABLEAU = Canvasbritta.create_image(540,340, image=self.tableau)
        txt = Canvasbritta.create_text(540,570,text="Bonjour", font="Arial 28 italic", fill="red")
        Canvasbritta.pack()
        self.pack()
I was not able to get the tk.PhotoImage to work in a class. I went the PIL route. Couple extra lines but worked in the class.
(Apr-27-2020, 09:31 AM)deanhystad Wrote: [ -> ]You need to keep the image variable. I think tableau, the image, was destroyed when the local variable tableau no longer exists. I tested the code below and it works for me
class Brittachoix(Frame):
    def __init__(self, root):
        super().__init__(root)
        self.tableau = PhotoImage(file="image.png").zoom(4) 
        Canvasbritta = Canvas(self, width=largeur, height=hauteur, bg="#FFFFFF")
        TABLEAU = Canvasbritta.create_image(540,340, image=self.tableau)
        txt = Canvasbritta.create_text(540,570,text="Bonjour", font="Arial 28 italic", fill="red")
        Canvasbritta.pack()
        self.pack()

Thanks a lot, it is indeed working !