I have designed a login page and signup page. When I open the login page iam able to click on signup and login page automatically closes. I have created a button on the signup page to allow me to return to login page. If i click on that button i get an error message saying
ModuleNotFoundError: No module named 'signup_page'
How best can i switch between the login and signup page below is my code for the two files signup_page and login_page.
My Login Page
from tkinter import *
from tkinter import ttk, messagebox
from turtle import width
import pymysql
import os
from signup_page import SignUp
import credentials as cr
from PIL import Image, ImageTk
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
'''
image_path= img_resource_path('picture3.png')#........................Frame1 Image
image = Image.open(image_path)
# Resize the image using resize() method
resize_image = image.resize((500, 380))
img = ImageTk.PhotoImage(resize_image)
image_label =ttk.Label(frame1,image=img,padding=5, text="Eating Healthy Food",font="Albertus 18", compound="bottom")
image_label.place(x=50, y=100)
'''
class login_page:
def __init__(self, root):
self.window = root
self.window.title("Chegutu Municipality Complains Management System / Service Delivery Monitoring System")
# Set the window size
# Here 0,0 represents the starting point of the window
self.window.geometry("1280x800+0+0")
self.window.config(bg = "white")
self.window.iconbitmap(img_resource_path("chegutuicon.ico"))
#============================================================================
#==============================DESIGN PART===================================
#============================================================================
self.frame1 = Frame(self.window,bg="#daf7d9")
self.frame1.place(x=0, y=0, width=450, relheight =1)
#image_path= img_resource_path('chegutulogo.png')#........................Frame1 Image
#logo = Image.open("C:/Users/Giants/chegutulogo.png")
self.bg_img2 = ImageTk.PhotoImage(file=img_resource_path("waterworks.jpg"))
background = Label(self.frame1,image=self.bg_img2).place(x=0,y=0,relwidth=1,relheight=1)
label1 = Label(self.frame1, text= "Chegutu", font=("times new roman", 40, "bold"), bg="yellow", fg="black").place(x=50,y=300)
label2 = Label(self.frame1, text= "Municipality", font=("times new roman", 40, "bold"), bg="yellow", fg="#173156").place(x=150,y=362)
label3 = Label(self.frame1, text= "Service Delivery Monitoring System", font=("times new roman", 13, "bold"), bg="yellow", fg="brown4").place(x=100,y=420)
#=============Entry Field & Buttons============
self.frame2 = Frame(self.window, bg = "#008000") #"gray95""#aa5500"
self.frame2.place(x=450,y=0,relwidth=1, relheight=1)
self.Title_label = Label(self.frame2,text="Complains Management System / Service Delivery Monitoring System", font=("Albertus",17,"bold"),bg="#daf7d9", fg="black").place(x=50,y=40)
self.frame3 = Frame(self.frame2, bg="white")
self.frame3.place(x=140,y=150,width=500,height=450)
self.email_label = Label(self.frame3,text="Email Address", font=("helvetica",20,"bold"),bg="white", fg="gray").place(x=50,y=40)
self.email_entry = Entry(self.frame3,font=("times new roman",15,"bold"),bg="white",fg="gray")
self.email_entry.place(x=50, y=80, width=300)
self.password_label = Label(self.frame3,text="Password", font=("helvetica",20,"bold"),bg="white", fg="gray").place(x=50,y=120)
self.password_entry = Entry(self.frame3,font=("times new roman",15,"bold"),bg="white",fg="gray",show="*")
self.password_entry.place(x=50, y=160, width=300)
#================Buttons===================
self.login_button = Button(self.frame3,text="Log In",command=self.login_func,font=("times new roman",15, "bold"),bd=0,cursor="hand2",bg="#173156",fg="white").place(x=50,y=200,width=300)
self.forgotten_pass = Button(self.frame3,text="Forgotten password?",command=self.forgot_func,font=("times new roman",10, "bold"),bd=0,cursor="hand2",bg="white",fg="blue").place(x=125,y=260,width=150)
self.create_button = Button(self.frame3,text="Create New Account",command=self.redirect_window,font=("times new roman",18, "bold"),bd=0,cursor="hand2",bg="#daf7d9",fg="white").place(x=80,y=320,width=250)
def login_func(self):
if self.email_entry.get()=="" or self.password_entry.get()=="":
messagebox.showerror("Error!","All fields are required",parent=self.window)
else:
try:
connection=pymysql.connect(host=cr.host, user=cr.user, password=cr.password, database=cr.database)
cur = connection.cursor()
cur.execute("select * from student_register where email=%s and password=%s",(self.email_entry.get(),self.password_entry.get()))
row=cur.fetchone()
if row == None:
messagebox.showerror("Error!","Invalid USERNAME & PASSWORD",parent=self.window)
else:
messagebox.showinfo("Success","Wellcome to the PySeek family",parent=self.window)
# Clear all the entries
self.reset_fields()
connection.close()
except Exception as e:
messagebox.showerror("Error!",f"Error due to {str(e)}",parent=self.window)
def forgot_func(self):
if self.email_entry.get()=="":
messagebox.showerror("Error!", "Please enter your Email Id",parent=self.window)
else:
try:
connection = pymysql.connect(host=cr.host, user=cr.user, password=cr.password, database=cr.database)
cur = connection.cursor()
cur.execute("select * from student_register where email=%s", self.email_entry.get())
row=cur.fetchone()
if row == None:
messagebox.showerror("Error!", "Email Id doesn't exists")
else:
connection.close()
#=========================SECOND WINDOW===============================
#------------Toplevel:create a window top of another window-----------
#------------focus_force:Helps to to focus on the current window------
#-----Grab:Helps to grab the current window until user ungrab it------
self.root=Toplevel()
self.root.title("Forget Password?")
self.root.geometry("400x440+450+200")
self.root.config(bg="white")
self.root.focus_force()
self.root.grab_set()
title3 = Label(self.root,text="Change your password",font=("times new roman",20,"bold"),bg="white").place(x=10,y=10)
title4 = Label(self.root,text="It's quick and easy",font=("times new roman",12),bg="white").place(x=10,y=45)
title5 = Label(self.root, text="Select your question", font=("times new roman", 15, "bold"), bg="white").place(x=10,y=85)
self.sec_ques = ttk.Combobox(self.root,font=("times new roman",13),state='readonly',justify=CENTER)
self.sec_ques['values'] = ("Select","What's your pet name?","Your first teacher name","Your birthplace", "Your favorite movie")
self.sec_ques.place(x=10,y=120, width=270)
self.sec_ques.current(0)
title6 = Label(self.root, text="Answer", font=("times new roman", 15, "bold"), bg="white").place(x=10,y=160)
self.ans = Entry(self.root,font=("arial"))
self.ans.place(x=10,y=195,width=270)
title7 = Label(self.root, text="New Password", font=("times new roman", 15, "bold"), bg="white").place(x=10,y=235)
self.new_pass = Entry(self.root,font=("arial"))
self.new_pass.place(x=10,y=270,width=270)
self.create_button = Button(self.root,text="Submit",command=self.change_pass,font=("times new roman",18, "bold"),bd=0,cursor="hand2",bg="green2",fg="white").place(x=95,y=340,width=200)
#=========================================================================
except Exception as e:
messagebox.showerror("Error", f"{e}")
def change_pass(self):
if self.email_entry.get() == "" or self.sec_ques.get() == "Select" or self.new_pass.get() == "":
messagebox.showerror("Error!", "Please fill the all entry field correctly")
else:
try:
connection = pymysql.connect(host=cr.host, user=cr.user, password=cr.password, database=cr.database)
cur = connection.cursor()
cur.execute("select * from student_register where email=%s and question=%s and answer=%s", (self.email_entry.get(),self.sec_ques.get(),self.ans.get()))
row=cur.fetchone()
if row == None:
messagebox.showerror("Error!", "Please fill the all entry field correctly")
else:
try:
cur.execute("update student_register set password=%s where email=%s", (self.new_pass.get(),self.email_entry.get()))
connection.commit()
messagebox.showinfo("Successful", "Password has changed successfully")
connection.close()
self.reset_fields()
self.root.destroy()
except Exception as er:
messagebox.showerror("Error!", f"{er}")
except Exception as er:
messagebox.showerror("Error!", f"{er}")
def redirect_window(self):
self.window.destroy()
# Importing the signup window.
# The page must be in the same directory
root = Tk()
obj = SignUp(root)
root.mainloop()
def reset_fields(self):
self.email_entry.delete(0,END)
self.password_entry.delete(0,END)
# The main function
if __name__ == "__main__":
root = Tk()
obj = login_page(root)
root.mainloop()
signup_page on a seperate file
from tkinter import *
from PIL import Image, ImageTk
from tkinter import ttk, messagebox
import pymysql, os
import credentials as cr
from subprocess import call
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
class SignUp:
def __init__(self, root):
self.window = root
self.window.title("Sign Up")
self.window.geometry("1280x800+0+0")
self.window.config(bg = "white")
self.bg_img = ImageTk.PhotoImage(file=img_resource_path("townhouse2.jpg"))
background = Label(self.window,image=self.bg_img).place(x=0,y=0,relwidth=1,relheight=1)
frame = Frame(self.window, bg="white")
frame.place(x=350,y=100,width=500,height=550)
title1 = Label(frame, text="Sign Up", font=("times new roman",25,"bold"),bg="white").place(x=20, y=10)
title2 = Label(frame, text="To use the System", font=("times new roman",13),bg="white", fg="gray").place(x=20, y=50)
f_name = Label(frame, text="First name", font=("helvetica",15,"bold"),bg="white").place(x=20, y=100)
l_name = Label(frame, text="Last name", font=("helvetica",15,"bold"),bg="white").place(x=240, y=100)
self.fname_txt = Entry(frame,font=("arial"))
self.fname_txt.place(x=20, y=130, width=200)
self.lname_txt = Entry(frame,font=("arial"))
self.lname_txt.place(x=240, y=130, width=200)
email = Label(frame, text="Email", font=("helvetica",15,"bold"),bg="white").place(x=20, y=180)
self.email_txt = Entry(frame,font=("arial"))
self.email_txt.place(x=20, y=210, width=420)
sec_question = Label(frame, text="Security questions", font=("helvetica",15,"bold"),bg="white").place(x=20, y=260)
answer = Label(frame, text="Answer", font=("helvetica",15,"bold"),bg="white").place(x=240, y=260)
self.questions = ttk.Combobox(frame,font=("helvetica",13),state='readonly',justify=CENTER)
self.questions['values'] = ("Select","What's your pet name?","Your first teacher name","Your birthplace", "Your favorite movie")
self.questions.place(x=20,y=290,width=200)
self.questions.current(0)
self.answer_txt = Entry(frame,font=("arial"))
self.answer_txt.place(x=240, y=290, width=200)
password = Label(frame, text="New password", font=("helvetica",15,"bold"),bg="white").place(x=20, y=340)
self.password_txt = Entry(frame,font=("arial"))
self.password_txt.place(x=20, y=370, width=420)
self.terms = IntVar()
terms_and_con = Checkbutton(frame,text="I Agree The Terms & Conditions",variable=self.terms,onvalue=1,offvalue=0,bg="white",font=("times new roman",12)).place(x=20,y=420)
self.signup = Button(frame,text="Sign Up",command=self.signup_func,font=("times new roman",18, "bold"),bd=0,cursor="hand2",bg="green2",fg="white").place(x=120,y=470,width=250)
self.login = Button(frame,text="Return to Login Page",command=self.redirect_window,font=("times new roman",12, "bold"),bd=0,cursor="hand2",bg="green2",fg="white").place(x=120,y=520,width=250)
def signup_func(self):
if self.fname_txt.get()=="" or self.lname_txt.get()=="" or self.email_txt.get()=="" or self.questions.get()=="Select" or self.answer_txt.get()=="" or self.password_txt.get() == "":
messagebox.showerror("Error!","Sorry!, All fields are required",parent=self.window)
elif self.terms.get() == 0:
messagebox.showerror("Error!","Please Agree with our Terms & Conditions",parent=self.window)
else:
try:
connection = pymysql.connect(host=cr.host, user=cr.user, password=cr.password, database=cr.database)
cur = connection.cursor()
cur.execute("select * from student_register where email=%s",self.email_txt.get())
row=cur.fetchone()
# Check if th entered email id is already exists or not.
if row!=None:
messagebox.showerror("Error!","The email id is already exists, please try again with another email id",parent=self.window)
else:
cur.execute("insert into student_register (f_name,l_name,email,question,answer,password) values(%s,%s,%s,%s,%s,%s)",
(
self.fname_txt.get(),
self.lname_txt.get(),
self.email_txt.get(),
self.questions.get(),
self.answer_txt.get(),
self.password_txt.get()
))
connection.commit()
connection.close()
messagebox.showinfo("Congratulations!","Register Successful",parent=self.window)
self.reset_fields()
except Exception as es:
messagebox.showerror("Error!",f"Error due to {es}",parent=self.window)
def reset_fields(self):
self.fname_txt.delete(0, END)
self.lname_txt.delete(0, END)
self.email_txt.delete(0, END)
self.questions.current(0)
self.answer_txt.delete(0, END)
self.password_txt.delete(0, END)
def redirect_window(self):
self.window.destroy()
# Importing the signup window.
# The page must be in the same directory
call(["python", "login_page.py"])
if __name__ == "__main__":
root = Tk()
obj = SignUp(root)