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.