• Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • You can also use markdown to share your code. When using markdown your code will be automatically converted to BBCode. For help with markdown check out the markdown guide.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

Python Issue with A-Level code (3 pages of small code), as self. doesn't want to work for if statements and the registration doesn't work for the database.

harold4653

New Coder
Python:
import tkinter as tk
import tkinter.font as tkfont
import sqlite3

try:
    con = sqlite3.connect('customer.db')
    cur = con.cursor()
    cur.execute('''CREATE TABLE IF NOT EXISTS customer(
                    name text Not Null,
                    email text Primary Key,
                    password text Not Null
                )
            ''')
    con.commit()  # Commit the changes to the database
    print("Database created successfully")
except Exception as e:
    print("Error creating database:", e)



class MusicGenerationApp:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title('Music Generator - Login & Register')
        self.root.geometry('500x500')
        self.root.resizable(True, True)
        self.root.config(background='dark red')
        self.font_small = tkfont.Font(family="Arial", size=20)
        self.font_medium = tkfont.Font(family="Arial", size=30)
        self.font_large = tkfont.Font(family="Arial", size=47, weight='bold')

        self.create_widgets()

    def quit(self):
        self.root.destroy()

    def create_widgets(self):
        self.canvas = tk.Canvas(self.root, height=800, width=1200, bg="dark red")
        self.canvas.pack()

        top_frame = tk.Frame(self.root, bd=2, bg='black', relief=tk.SOLID, padx=5, pady=10)
        tk.Label(top_frame, text="Login or Register\nto Your Account", bg='black', font=self.font_large, fg='white').grid(padx=3, pady=10)
        top_frame.place(x=35, y=25, width=425, height=150)

        login_btn = tk.Button(width=20, text='Login', font=self.font_medium, relief=tk.SOLID, cursor='hand2', command=self.open_login_window)
        login_btn.place(x=66.6, y=250, width=150, height=100)

        register_btn = tk.Button(width=20, text='Register', font=self.font_medium, relief=tk.SOLID, cursor='hand2', command=self.open_registration_window)
        register_btn.place(x=283.2, y=250, width=150, height=100)

        exit_btn = tk.Button(width=20, text='Back', font=self.font_small, relief=tk.SOLID, cursor='hand2', command=self.quit)
        exit_btn.place(x=212.5, y=400, width=75, height=50)

        self.root.mainloop()

    def open_login_window(self):
        from Music_Generator_Login import LoginWindow
        login_window = LoginWindow(self.root, self.back_to_page_1)

    def back_to_page_1(self):
        # Do any cleanup or actions needed when going back to page 1
        pass

    def open_registration_window(self):
        from Music_Generator_Registration import RegistrationWindow
        registration_window = RegistrationWindow(self.root)

    def run(self):
        self.root.mainloop()

if __name__ == "__main__":
    app = MusicGenerationApp()
    app.run()
Python:
import sqlite3
import tkinter as tk
from tkinter import messagebox
import tkinter.font as tkfont
from Music_Generation_App import MusicGenerationApp

class LoginWindow:
    def __init__(self, parent, back_callback):
        self.parent = parent
        self.window = tk.Toplevel(parent)
        self.window.title('Login')
        self.window.geometry('500x500')
        self.window.resizable(False, False)

        self.create_widgets()

    def create_widgets(self):
        self.font_small = tkfont.Font(family="Arial", size=17)
        self.font_medium = tkfont.Font(family="Arial", size=30)
        self.font_large = tkfont.Font(family="Arial", size=38, weight='bold')

        top_frame = tk.Frame(self.window, bd=2, bg='black', relief=tk.SOLID, padx=12, pady=10)
        tk.Label(top_frame, text="Enter Login Details", bg='black', font=self.font_large).grid(padx=12, pady=10)
        top_frame.place(x=50, y=50, width=400, height=100)

        login_frame = tk.Frame(self.window, bd=2, bg='black', relief=tk.SOLID, padx=12, pady=10)
        tk.Label(login_frame, text="Enter Email", bg='black', font=self.font_small).grid(row=0, column=0, sticky=tk.W, pady=10)
        tk.Label(login_frame, text="Enter Password", bg='black', font=self.font_small).grid(row=1, column=0, sticky=tk.W, pady=10)
        tk.Label(login_frame, text="Re-Enter Password", bg='black', font=self.font_small).grid(row=2, column=0, sticky=tk.W, pady=10)

        self.email_tf = tk.Entry(login_frame, font=self.font_small)
        self.pwd_tf = tk.Entry(login_frame, font=self.font_small, show='*')
        self.repwd_tf = tk.Entry(login_frame, font=self.font_small, show='*')
        login_btn = tk.Button(login_frame, width=16, text='Login', font=self.font_small, relief=tk.SOLID, cursor='hand2', command=self.login_response)

        self.email_tf.grid(row=0, column=1, pady=5, padx=10)
        self.pwd_tf.grid(row=1, column=1, pady=5, padx=10)
        self.repwd_tf.grid(row=2, column=1, pady=5, padx=10)
        login_btn.grid(row=3, column=1, pady=5, padx=10)
        login_frame.place(x=50, y=200, width=400, height=200)

    def login_response(self):
        try:
            con = sqlite3.connect('customer.db')
            c = con.cursor()
            for row in c.execute("Select * from customer"):
                email = row[1]
                pwd = row[2]
        except Exception as ep:
            messagebox.showerror('', ep)

        uemail = self.email_tf.get()
        upwd = self.pwd_tf.get()
        check_counter = 0
        warn = ""

        if uemail == "":
            warn = "Email can't be empty"
        else:
            check_counter += 1

        if upwd == "":
            warn = "Password can't be empty"
        else:
            check_counter += 1

        if check_counter == 2:
            if uemail == email and upwd == pwd:
                messagebox.showinfo('Login Status', 'Logged in Successfully!')
                self.open_main_window()
            else:
                messagebox.showerror('Login Status', 'Invalid username or password')
        else:
            messagebox.showerror('', warn)

    def open_main_window(self):
        main_window = MainWindow(self.parent)

    def back_to_page_1(self):
        self.window.destroy()

    def run(self):
        self.window.mainloop()

if __name__ == "__main__":
    app = MusicGenerationApp()
    app.run()
Python:
import tkinter as tk
import sqlite3
from tkinter import *
from tkinter import messagebox
import tkinter.font as tkfont
from Music_Generation_App import MusicGenerationApp

class RegistrationWindow:
    def __init__(self, parent):
        self.parent = parent
        self.window = tk.Toplevel(parent)
        self.window.title('Register')
        self.window.geometry('500x500')
        self.window.config(bg='dark red')

        self.register_name = tk.Entry(self.window, font=('Arial', 16))
        self.register_email = tk.Entry(self.window, font=('Arial', 16))
        self.register_pwd = tk.Entry(self.window, font=('Arial', 16), show='*')
        self.pwd_again = tk.Entry(self.window, font=('Arial', 16), show='*')

        self.create_widgets()

    def create_widgets(self):
        self.font_small = tkfont.Font(family="Arial", size=17)
        self.font_medium = tkfont.Font(family="Arial", size=30)
        self.font_large = tkfont.Font(family="Arial", size=38, weight='bold')

        top_frame = tk.Frame(self.window, bd=2,bg='black',relief=SOLID, padx= 4, pady = 10)
        tk.Label (top_frame,text="Register your details",bg='black',font= self.font_large).grid(padx = 4,pady=10)
        top_frame.place (x=50, y=50,width=400, height=100)
        newFrame = tk.Frame(self.window, bd=2,bg='black',relief=SOLID, padx= 10, pady = 10)

        tk.Label(newFrame, text = "Enter Name",bg = 'black', font = self.font_small).grid(row = 0, column = 0, sticky = W, pady=2)
        tk.Label(newFrame, text = "Enter Email",bg = 'black', font = self.font_small).grid(row = 1, column = 0, sticky = W, pady=2)
        tk.Label(newFrame, text = "Enter Password",bg = 'black', font = self.font_small).grid(row = 2, column = 0, sticky = W, pady=2)
        tk.Label(newFrame, text = "Re-Enter Password",bg = 'black', font = self.font_small).grid(row = 3, column = 0, sticky = W, pady=2)

        self.register_name = tk.Entry(newFrame, font=self.font_small)
        self.register_email = tk.Entry(newFrame, font=self.font_small)
        self.register_pwd = tk.Entry(newFrame, font=self.font_small, show='*')
        self.pwd_again = tk.Entry(newFrame, font=self.font_small, show='*')


        register_btn = Button(newFrame,width=16,text='Register',font=self.font_small,relief=SOLID,cursor='hand2',command=self.insert_record)

        register_name.grid(row=0, column=1, pady=3, padx=12)
        register_email.grid(row=1, column=1, pady=3, padx=12)
        register_pwd.grid(row=2, column=1, pady=3, padx=12)
        pwd_again.grid(row=3, column=1, pady=3, padx=12)

        register_btn.grid(row=4, column=1, pady=5, padx=12)

        newFrame.place(x=50, y=200, width = 400, height = 200)

    def insert_record(self):
        name = self.register_name.get()
        email = self.register_email.get()
        password = self.register_pwd.get()
        pwd_again = self.pwd_again.get()

        print("Values: name =", name, "email =", email, "password =", password, "pwd_again =", pwd_again)

        if not name or not email or not password or not pwd_again:
            messagebox.showerror('Error', 'Please fill in all fields.')
            return

        if password != pwd_again:
            messagebox.showerror('Error', 'Passwords do not match.')
            return

        try:
            con = sqlite3.connect('customer.db')
            cur = con.cursor()
            cur.execute("INSERT INTO customer VALUES (:name, :email, :password)", {
                'name': name,
                'email': email,
                'password': password
            })
            con.commit()
            messagebox.showinfo('Confirmation', 'Record Saved')
            self.window.destroy()  # Close the registration window

        except Exception as ep:
            messagebox.showerror('Error', ep)


    def back_to_page_1(self):
        self.window.destroy()

    def run(self):
        self.window.mainloop()

if __name__ == "__main__":
    app = MusicGenerationApp()
    app.run()
 
I took an interest in your project although, not complete, I wanted to post it and see what you think. Kept all the classes in the same file to keep from having to do so many imports.
The links will pull up pages except for the logout link. The pages have no form yet.
Python:
# Do the imports
import tkinter as tk
from tkinter import font
import sqlite3 as sq
import os

# Executed from bash shell or vscode - vscode default
path = os.path.dirname(os.sys.argv[0])
if not path:
    path = '.'
class Database:
    '''
    Database class handles all methods for the adding, deleting, and retrieving
    information
    '''
    def __init__(self):
        ''' Setup the sqlite3 database and cursor '''
        self.db = sq.connect(f'{path}/customer.db')
        self.cursor = self.db.cursor()
    def create(self):
        ''' create creates the table and sets up a basic email validation '''
        query = '''
                create table if not exists customer (
                id integer primary key,
                name text not null,
                email text unique not null,
                password text not null,
                logged_in integer not null default 0
                check(
                    email like '%_@_%._%' and
                    length(email) - length(replace(email, '@', '')) = 1 and
                    substr(lower(email), 1, instr(email, '.') - 1) not glob '*[^@0-9a-z]*' and
                    substr(lower(email), instr(email, '.') + 1) not glob '*[^a-z]*'
                    ))
                '''
        # Execute and commit the query
        self.db.execute(query)
        self.db.commit()
    def add(self, name, email, password):
        ''' Method add data to the database and handles some error checking '''       
        query = '''
                insert into customer (name, email, password) values (?,?,?)
                '''
        try:
            self.cursor.execute(query, (name.lower().strip(), email.lower().strip(), password))
            self.db.commit()
            return ' Added user to database.'
        except sq.OperationalError as error:
            return error
        except sq.IntegrityError as error:
            if 'constraint' in str(error) and 'customer.email' in str(error):
                return 'That email already exists. Please try again.'
            elif 'CHECK' in str(error):
                return 'That is not a valid email. Please try again.'
            else:
                return 'An unknown error has occurred'
            
    def remove(self, id):
        ''' Method for removing users by id '''
        if id:
            self.cursor.execute(f'delete from customer where id = {id}')
    def getall(self):
        ''' Method gets all information from database '''
        return self.cursor.execute('select * from customer').fetchall()
    
    def getone(self, id):
        ''' Method gets information for a single id '''
        if id:
            return self.cursor.execute(f'select * from customer where id = {id}').fetchone()
        
    def login(self, email, password):
        ''' Method checks if a user is in the database based on email and password 
            if a user is found then it will set a session variable for being logged in.
        '''
        query = f'''
                select id, email, password from customer where email = "{email}" and password = "{password}"
                '''
        res = self.cursor.execute(query).fetchone()
        if res:
            self.update(res[0], 1)
            return True
        return False
    
    def update(self, id, log=int(0)):
        ''' Helper method for above method. Set the logged_in field to 1 '''
        self.cursor.execute(f'update customer set logged_in = {log} where id = {id}')
    def logout(self, id, log=int(0)):
        ''' Method for logging out. Sets the logged_in field to 0 '''
        self.cursor.execute(f'update customer set logged_in = {log} where id = {id}')

class Window:
    '''
    Window class is the main display window
    '''
    def __init__(self, parent):
        self.parent = parent
        parent.title('Main Page')
        parent.columnconfigure(0, weight=1)
        parent.rowconfigure(0, weight=1)
        parent.update()
        width = parent.winfo_reqwidth() * 3
        # Container frame for holding all widgets
        container = tk.Frame(parent, bg='#555555')
        container.grid(column=0, row=0, sticky='news')
        container.grid_columnconfigure(0, weight=3)
        # Simple header label
        header = tk.Label(container, text='Main Page')
        header['font'] = ('cursive', 30, 'bold')
        header['bg'] = '#333333'
        header['fg'] = 'whitesmoke'
        header['relief'] = 'solid'
        header['borderwidth'] = 1
        header.grid(column=0, row=0, sticky='new', ipady=10)
        # The container holds all our links
        link_container = tk.Frame(container, bg='white')
        link_container.grid(column=0, row=1, sticky='new')
        
        # Create our links using labels. Bind links to give a hover effect
        self.login_label = tk.Label(link_container, text='Login', fg='blue', bg='white', cursor='hand2')
        self.login_label['font'] = (None, 12, 'normal')
        self.login_label.grid(column=0, row=0, padx=5, pady=5)
        self.login_label.bind('<Enter>', lambda label: self.link_on(self.login_label))
        self.login_label.bind('<Leave>', lambda label: self.link_off(self.login_label))
        self.logout_label = tk.Label(link_container, text='Logout', fg='blue', bg='white', cursor='hand2')
        self.logout_label['font'] = (None, 12, 'normal')
        self.logout_label.grid(column=1, row=0, padx=5, pady=5)
        self.logout_label.bind('<Enter>', lambda label: self.link_on(self.logout_label))
        self.logout_label.bind('<Leave>', lambda label: self.link_off(self.logout_label))

        self.register_label = tk.Label(link_container, text='Register', fg='blue', bg='white', cursor='hand2')
        self.register_label['font'] = (None, 12, 'normal')
        self.register_label.grid(column=2, row=0, padx=5, pady=5)
        self.register_label.bind('<Enter>', lambda label: self.link_on(self.register_label))
        self.register_label.bind('<Leave>', lambda label: self.link_off(self.register_label))

        self.exit_label = tk.Label(link_container, text='Exit', fg='tomato', bg='white', cursor='hand2')
        self.exit_label['font'] = (None, 14, 'normal')
        self.exit_label.grid(column=3, row=0, padx=(width,10), pady=5)
        self.exit_label.bind('<Enter>', self.exit_enter)
        self.exit_label.bind('<Leave>', self.exit_leave)
        self.log = tk.Label(container, text='You\'re logged out', bg='#555555', fg='#cecece', anchor='e', padx=5)
        self.log['font'] = (None, 12, 'bold')
        self.log.grid(column=0, row=2, padx=5, pady=5, sticky='new')
    # These methods provide the hover effects
    def link_on(self, label):
        label['fg'] = 'orangered'
    def link_off(self, label):
        label['fg'] = 'blue'
    def exit_enter(self, event):
        self.exit_label['fg'] = 'red'
    def exit_leave(self, event):
        self.exit_label['fg'] = 'tomato'

class LoginForm:
    ''' This class contains our login form'''
    def __init__(self, parent):
        self.parent = parent
    def form(self):
        self.window = tk.Toplevel(None)
        self.window.minsize(800,600)
        self.window['padx'] = 3
        self.window['pady'] = 3
        self.window.title('A Login Form')
        self.window.columnconfigure(0, weight=1)
        self.window.rowconfigure(0, weight=1)
        self.window['bg'] = '#333333'
        container = tk.Label(self.window, bg='#555555')
        container.grid(column=0, row=0, sticky='news')
        container.grid_columnconfigure(0, weight=3)
        # Simple header label
        header = tk.Label(container, text='Login Page')
        header['font'] = ('cursive', 30, 'bold')
        header['bg'] = '#333333'
        header['fg'] = 'whitesmoke'
        header['relief'] = 'solid'
        header['borderwidth'] = 1
        header.grid(column=0, row=0, sticky='new', ipady=10)
        self.button = tk.Button(self.window, text='Cancel', bg='tomato', fg='black', cursor='hand2')
        self.button['font'] = (None, 12, 'normal')
        self.button['command'] = self.close
        self.button['highlightbackground'] = 'black'
        self.button['highlightcolor'] = 'black'
        self.button.grid(column=0, row=1)
        self.button.bind('<Enter>', self.on_enter)
        
    def close(self):
        ''' Method for destroying the form window and retreiving the main window '''
        self.window.destroy()
        self.parent.deiconify()
    def on_enter(self, event):
        # method for hover effect of the cancel button
        self.button['activebackground'] = 'orangered'
        self.button['activeforeground'] = 'white'

class RegisterForm:
    ''' This class contains the registraion form '''
    def __init__(self, parent):
        self.parent = parent
    def form(self):
        self.window = tk.Toplevel(None)
        self.window.minsize(800,600)
        self.window['padx'] = 3
        self.window['pady'] = 3
        self.window.title('Registation Form')
        self.window.columnconfigure(0, weight=1)
        self.window.rowconfigure(0, weight=1)
        self.window['bg'] = '#333333'
        container = tk.Label(self.window, bg='#555555')
        container.grid(column=0, row=0, sticky='news')
        container.grid_columnconfigure(0, weight=3)
        # Simple header label
        header = tk.Label(container, text='Registration Page')
        header['font'] = ('cursive', 30, 'bold')
        header['bg'] = '#333333'
        header['fg'] = 'whitesmoke'
        header['relief'] = 'solid'
        header['borderwidth'] = 1
        header.grid(column=0, row=0, sticky='new', ipady=10)
        self.button = tk.Button(self.window, text='Cancel', bg='tomato', fg='black', cursor='hand2')
        self.button['font'] = (None, 12, 'normal')
        self.button['command'] = self.close
        self.button['highlightbackground'] = 'black'
        self.button['highlightcolor'] = 'black'
        self.button.grid(column=0, row=1)
        self.button.bind('<Enter>', self.on_enter)
        
    def close(self):
        ''' Method for destroying the form window and retreiving the main window '''
        self.window.destroy()
        self.parent.deiconify()
    def on_enter(self, event):
        # method for hover effect of the cancel button
        self.button['activebackground'] = 'orangered'
        self.button['activeforeground'] = 'white'



    def update(self):
        pass

class Controller:
    '''
    Controller class will handle all communications between the other classes
    '''
    def __init__(self, db, window, loginform, registerform):
        # setup some class variables
        self.db = db
        self.window = window
        self.loginform = loginform
        self.registerform = registerform
        self.session = 0
        # Window Link Commands
        self.window.login_label.bind('<Button-1>', lambda event: self.login())
        self.window.logout_label.bind('<Button-1>', lambda event: self.logout())
        self.window.register_label.bind('<Button-1>', lambda event: self.register())
        self.window.exit_label.bind('<Button-1>', lambda event: self.window_exit())
    def login(self):
        ''' Method for getting the login form '''
        self.window.parent.withdraw()
        self.loginform.form()
        self.window.log['text'] = 'You\'re logged in'
        self.window.log['fg'] = 'whitesmoke'
    def logout(self):
        ''' Method for logging out '''
        self.db.logout(1)
        self.window.log['text'] = 'You\'re logged out'
        self.window.log['fg'] = '#cecece'
    def register(self):
        ''' Method for registering new user '''
        self.window.parent.withdraw()
        self.registerform.form()
    def window_exit(self):
        ''' Method will log out user and exit program '''
        self.db.logout(1)
        self.window.parent.destroy()

if __name__ == '__main__':
    root = tk.Tk()
    root.minsize(800, 600)
    root['padx'] = 3
    root['pady'] = 3
    controller = Controller(Database(), Window(root), LoginForm(root), RegisterForm(root))
    root.mainloop()
 
Last edited:
Top Bottom