简体   繁体   中英

Switching between frames in python with functions

I wish to have two functions in which I have frames that I can easily switch between. I can remove the "go" frame but I am unsure how to show another frame afterward.

from tkinter import *

class Trip:
    def __init__(self, parent):
        self.go = Frame(parent, width=500, height=450)
        self.go.grid(row=0, column=0)
        self.go.grid_propagate(0)  # to reserve space required for frame
        menuButton = Button(self.go, text="Continue", command=self.menuScreen)
         menuButton.grid(row=1, column=0)


    def menuScreen(self):
        self.go.grid_remove()
        self.menu = Frame(parent, width=500, height=450, bg='orchid')
        self.menu.grid(row=0, column=0)
        self.menu.grid_propagate(0)  # to reserve space required for frame

        self.addMore = Button(self.menuScreen, text="Return", command=self.__init__)
        self.addmore.grid(row=1, column=0)


if __name__ == "__main__":
    root = Tk()
    root.title("Traveller Details")
    play = Trip(root)
    root.geometry("500x450+0+0")
    root.mainloop()

Scope of parent seems to be confined to constructor initialization. You are calling parent again in menuScreen function.

Try defining a local variable within class say parent and pass parent1 as argument to the constructor. That way parent attribute is visible throughout the class.

I was able to advance to next screen using above, although it ran into some other issues which I believe may be dependent on other part of your code that's not presented here.

Here is modified code.

from tkinter import *

class Trip:
    def __init__(self, parent1):
        self.parent = parent1
        self.go = Frame(self.parent, width=500, height=450)
        self.go.grid(row=0, column=0)
        self.go.grid_propagate(0)  # to reserve space required for frame
        menuButton = Button(self.go, text="Continue", command=self.menuScreen)
        menuButton.grid(row=1, column=0)


    def menuScreen(self):
        self.go.grid_remove()
        self.menu = Frame(self.parent, width=500, height=450, bg='orchid')
        self.menu.grid(row=0, column=0)
        self.menu.grid_propagate(0)  # to reserve space required for frame

        self.addMore = Button(self.menuScreen, text="Return", command=self.__init__)
        self.addmore.grid(row=1, column=0)


if __name__ == "__main__":
    root = Tk()
    root.title("Traveller Details")
    play = Trip(root)
    root.geometry("500x450+0+0")
    root.mainloop()

Output:

在此处输入图片说明

You need to create the two frames in __init__ first; then show the tk window with the first frame.

A clickable button on each frame allows you to switch back and forth between the two frames.

"""
demonstrate switching back and forth between tkinter frames
"""

import tkinter as tk

class Trip:
    """
    A class to demonstrate switching back and forth between tkinter frames
    """

    def __init__(self, parent):
        self.parent = parent
        self.parent.title("Traveller Details")
        self.parent.geometry("500x450+0+0")        

        self.go_frame = tk.Frame(self.parent, width=500, height=450, bg='light blue')
        self.goto_menu_frame_button = tk.Button(self.go_frame, text="Continue", command=self.menu_screen)

        self.menu_frame = tk.Frame(self.parent, width=500, height=450, bg='light steel blue')
        self.goto_go_frame_button = tk.Button(self.menu_frame, text="Return", command=self.go_screen)

        self.current_frame = None
        self.go_screen()

    def go_screen(self):
        """
        The first screen to be visible - has a clickable button to switch 
        to the other screen 
        """
        self.remove_current_frame()
        self.current_frame = self.go_frame
        self.go_frame.grid(row=0, column=0)
        self.go_frame.grid_propagate(0)  # to reserve space required for frame
        self.goto_menu_frame_button.grid(row=1, column=0)

    def menu_screen(self):
        """
        The second screen - has a clickable button to switch back to the first screen 
        """
        self.remove_current_frame()
        self.current_frame = self.menu_frame
        self.menu_frame.grid(row=0, column=0)
        self.menu_frame.grid_propagate(0)  # to reserve space required for frame
        self.goto_go_frame_button.grid(row=0, column=0)

    def remove_current_frame(self):
        """
        removes the current frame from the grid if it exists
        """
        if self.current_frame is not None:
            self.current_frame.grid_remove()

    def start(self):
        """
        launches the GUI
        """
        self.parent.mainloop()


if __name__ == "__main__":
    trip = Trip(tk.Tk())
    trip.start()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM