Home > Blockchain >  How do I switch frame using "place" in tkinter?
How do I switch frame using "place" in tkinter?

Time:03-09

I'm new to Tkinter and python. I'm following overlap frames

I'm finding a way to switch color frames without overlapping each other. And, when I go back to the Start Page, all color frames should be destroyed/hidden. Please help me. Thank you so much.

CodePudding user response:

For the frame switching inside PageOne, you need to hide the current frame before showing the requested frame. Also it is better to create the three color frames in the __init__() and show it in the corresponding function:

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        ...

        # create the three color frames with initially hidden
        self.blueFrame = tk.Frame(self, relief=RIDGE, bd=1, bg="blue")
        self.redFrame = tk.Frame(self, relief=RIDGE, bd=1, bg="red")
        self.yellowFrame = tk.Frame(self, relief=RIDGE, bd=1, bg="yellow")

    def blue(self):
        self.hide_all_frames()
        self.blueFrame.place(x=160, y=0, width=1190, height=720)

    def red(self):
        self.hide_all_frames()
        self.redFrame.place(x=200, y=0, width=1150, height=720)

    def yellow(self):
        self.hide_all_frames()
        self.yellowFrame.place(x=240, y=0, width=1110, height=720)

    def hide_all_frames(self, event=None):
        self.redFrame.place_forget()
        self.blueFrame.place_forget()
        self.yellowFrame.place_forget()

If you want to hide all color frames after switching frames, i.e. PageOne -> MainPage -> PageOne, you can notify the PageOne using virtual event when it is raised. Then PageOne hides all the color frames upon receiving such virtual event:

class SampleApp(tk.Tk):
    ...

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()
        # notify the raised frame via virtual event
        frame.event_generate('<<Raised>>') 

...

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        ...

        self.blueFrame = tk.Frame(self, relief=RIDGE, bd=1, bg="blue")
        self.redFrame = tk.Frame(self, relief=RIDGE, bd=1, bg="red")
        self.yellowFrame = tk.Frame(self, relief=RIDGE, bd=1, bg="yellow")

        self.bind('<<Raised>>', self.hide_all_frames)
  • Related