So with the code below, I can switch pages from Page1 to Page2, Page2 to Page3, Page3 to Page4 but cannot go from Page4 to Page1.
It displays the error message:
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__
return self.func(*args)
File "F:\CCTV\test\Page4.py", line 29, in buttonLoginClicked
self.controller.show_frame(Page1)
NameError: global name 'Page1' is not defined
I was wondering if this is because I can't switch to the same frame more that once or am I just doing something wrong. if I put all of the classes onto the same page, it seems to fix the issue however I would like to have all of the classes on separate pages. Maybe this has something to do with importing the pages? This is a simplified version of my code to help show the issue:
CCTV:
import tkinter as tk
from tkinter import ttk, messagebox
from Page1 import *
from Page2 import *
from Page3 import *
from Page4 import *
class CCTV(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack()
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (Page1, Page2, Page3, Page4):
frame = F(container, self)
self.frames[F] = frame
frame.grid(column=0, row=0, sticky="nsew")
self.openPage()
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def openPage(self):
self.show_frame(Page1)
app = CCTV()
app.geometry("800x600")
app.mainloop()
Page1:
import tkinter as tk
from tkinter import ttk, messagebox
from Page2 import *
class Page1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 1")
self.buttonLogin = ttk.Button(inner_frame, text="Page 2", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page2)
Page2:
import tkinter as tk
from tkinter import ttk, messagebox
from Page3 import *
class Page2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 2")
self.buttonLogin = ttk.Button(inner_frame, text="Page 3", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page3)
Page3:
import tkinter as tk
from tkinter import ttk, messagebox
from Page4 import *
class Page3(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 3")
self.buttonLogin = ttk.Button(inner_frame, text="Page 4", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page4)
Page4:
import tkinter as tk
from tkinter import ttk, messagebox
from Page1 import *
class Page4(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 4")
self.buttonLogin = ttk.Button(inner_frame, text="Page 1", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page1)