############################### ## David M. Lemcoe Jr. ## lemcoe@gatech.edu ## GTID: 902926976 ## HW10A.py - November 11, 2015 ## I worked on the homework ## assignment alone, using only ## this semester's course mate- ## rials. ############################### from tkinter import * from tkinter import messagebox from tkinter import PhotoImage import pymysql class GUI(): def __init__(self, mainW): #self.rootWindow = Tk() self.rootWindow = mainW self.showLogin() def showLogin(self): self.rootWindow.title('GT Brokers Login Page') img = PhotoImage(file='./Login.gif') img_lb = Label(self.rootWindow, image=img) img_lb.image = img img_lb.grid(row=0, column=0, columnspan=4) Label(self.rootWindow, text="Username:").grid(sticky=E, row=1) Label(self.rootWindow, text="Password:").grid(sticky=E, row=2) self.user_s = StringVar() self.user = Entry(self.rootWindow, textvariable=self.user_s).grid(row=1, column=1, padx=5, pady=5) self.pass_s = StringVar() self.pas = Entry(self.rootWindow, textvariable=self.pass_s, show='*').grid(row=2, column=1) Button(self.rootWindow, text='Cancel', command=self.leaveApp).grid(row=3, column=1, padx=5, pady=5, sticky=W) Button(self.rootWindow, text='Register', command=self.showRegister).grid(row=3, column=2, padx=5, pady=5, sticky=W) Button(self.rootWindow, text='Login', command=self.loginCheck).grid(row=3, column=3, padx=5, pady=5, sticky=W) def showRegister(self): self.rootWindow.withdraw() self.regWindow = Toplevel() self.regWindow.title('GT Brokers Register Page') img = PhotoImage(file='./registerpic.gif') img_lb = Label(self.regWindow, image=img) img_lb.image = img img_lb.grid(row=0, column=0, columnspan=1, rowspan=7) Label(self.regWindow, text="Full Name:").grid(sticky=E, row=1, column=1) self.full_name_s = StringVar() Entry(self.regWindow, width=60, textvariable=self.full_name_s).grid(row=1, column=2, padx=5, pady=5) Label(self.regWindow, text="Username:").grid(sticky=E, row=2, column=1) self.username_s = StringVar() Entry(self.regWindow, width=60, textvariable=self.username_s).grid(row=2, column=2, padx=5, pady=5) Label(self.regWindow, text="Password:").grid(sticky=E, row=3, column=1) self.password_s = StringVar() Entry(self.regWindow, width=60, textvariable=self.password_s).grid(row=3, column=2, padx=5, pady=5) Label(self.regWindow, text="Confirm Password:").grid(sticky=E, row=4, column=1) self.passwordc_s = StringVar() Entry(self.regWindow, width=60, textvariable=self.passwordc_s).grid(row=4, column=2, padx=5, pady=5) Label(self.regWindow, text="Prove you're a human:").grid(sticky=E, row=5, column=1) self.meth = 'cap' img_cap = PhotoImage(file='./hunky7dory.gif') self.img_cap_lb = Label(self.regWindow, image=img_cap) self.img_cap_lb.image = img_cap self.img_cap_lb.grid(row=5, column=2) self.meth_l = Label(self.regWindow, text="Enter the text clearly displayed above:").grid(sticky=E, row=6, column=1) self.cap = StringVar() Entry(self.regWindow, width=60, textvariable=self.cap).grid(row=6, column=2, padx=5, pady=5) Button(self.regWindow, text='Cancel', command=self.backToLogin).grid(row=7, column=0, padx=5, pady=5, sticky=W) Button(self.regWindow, text='Register', command=self.registerNew).grid(row=7, column=1, padx=5, pady=5, sticky=W) Button(self.regWindow, text='Riddler', command=self.showRiddle).grid(row=7, column=2, padx=5, pady=5, sticky=W) def showRiddle(self): self.meth = 'rid' self.img_cap_lb.grid_forget() self.ridd_s = StringVar() Entry(self.regWindow, width=60, state='disabled', textvariable=self.ridd_s).grid(row=5, column=2, padx=5, pady=5) #self.meth_l = Label(self.regWindow, text="Enter the text clearly displayed above:").grid(sticky=E, row=6, column=1) self.ridd_s.set('What can you catch but not throw?') def backToLogin(self, user=None): self.regWindow.withdraw() self.rootWindow.deiconify() if user is not None: self.user_s.set(user) def connect(self): try: db = pymysql.connect(host = 'academic-mysql.cc.gatech.edu', passwd='FhYG&4F5Hns', user='2316user', db='cs2316db') self.cursor = db.cursor() return self.cursor except: messagebox.showerror('Cannot Connect', 'The application was unable to connect to the server. Please check your Internet connection and try again.') def passCheck(self, s, r): rules = [lambda s: any(x.isupper() for x in s), # must have at least one uppercase lambda s: any(x.isdigit() for x in s), # must have at least one digit lambda s: (s == r) # must match ] if all(rule(s) for rule in rules): return True messagebox.showerror('Invalid Password', 'The password you entered either is not valid (at least one uppercase letter and at least one number) or your password fields do not match.') self.password_s.set('') self.passwordc_s.set('') return False def checkUser(self, user, name): row = self.cursor.execute('SELECT * FROM GTBrokerageUsers WHERE Username = "' + user + '"') self.user = self.cursor.fetchone() if self.user is None: ## User doesn't already exist. if (user == '' or name == ''): messagebox.showerror('Username and/or Full Name Are Blank', 'The username and/or full name you entered are blank. Please try again.') return False return True else: messagebox.showerror('User Already Exists', 'The username you entered is taken by another user. Please try again.') self.username_s.set('') return False def registerNew(self): self.connect() namer = self.full_name_s.get() userr = self.username_s.get() passr = self.password_s.get() pascr = self.passwordc_s.get() if (namer != '' and userr != '' and passr != '' and passr == pascr and self.passCheck(passr, pascr) and self.checkUser(userr, namer)): print('go') if (self.meth == 'cap'): if (self.cap.get() == 'hunky7dory'): print('cap is correct') sql = '''INSERT INTO GTBrokerageUsers (Fullname, Username, Password, Balance) VALUES (%s, %s, %s, 100000.00)''' self.cursor.execute(sql, (self.full_name_s.get(), self.username_s.get(), self.password_s.get())) self.backToLogin(self.username_s.get()) else: messagebox.showerror('Riddle is Incorrect', 'The answer to the CAPTCA you provided is incorrect. Please try again.') self.cap.set('') elif (self.meth == 'rid'): ## Answer is 'a cold' if (self.cap.get() == 'a cold'): print('rid is correct') sql = '''INSERT INTO GTBrokerageUsers (Fullname, Username, Password, Balance) VALUES (%s, %s, %s, 100000.00)''' self.cursor.execute(sql, (self.full_name_s.get(), self.username_s.get(), self.password_s.get())) self.backToLogin(self.username_s.get()) else: messagebox.showerror('Riddle is Incorrect', 'The answer to the riddle you provided is incorrect. Please try again.') self.cap.set('') else: print('noooo') def leaveApp(self): self.rootWindow.destroy() def loginCheck(self): self.connect() row = self.cursor.execute('SELECT * FROM GTBrokerageUsers WHERE Username = "' + self.user_s.get() + '"') self.user = self.cursor.fetchone() if self.user is None: print('user not found') messagebox.showerror('Username Not Found', 'The username you entered was not found. Please try again.') self.user_s.set('') if (self.user[2] == self.pass_s.get()): ## Off we go! print('true; login is successful') self.rootWindow.withdraw() else: print('false') messagebox.showerror('Incorrect Password', 'The password you entered is not correct. Please try again.') self.pass_s.set('') rootWindow = Tk() app = GUI(rootWindow) app.rootWindow.mainloop()