When I am trying to run the tkkcalendar so that I can take a date entry, later for an sql database, the tkcalendar seems to be running on the original window instead of the new one. I'm new to object oriented, can someone help?
I am trying to simply run the tkcalendar window - that allows a date to be entered from the GUI that pops up, I want to run this in my class for registering a user, i expected it to open in that window - next to the Date of birth text (i havent formatted the position perfectly yet as im trying to get it to work first)
```
import sqlite3
from tkinter import *
from tkinter.ttk import Combobox,Treeview,Scrollbar
from tkinter import messagebox
import datetime
import re
from tkcalendar import DateEntry
class login_GUI():
def __init__(self,master):
self.createwidgets(master)
def createwidgets(self,master):
self.master=master
self.master.geometry("200x200")
self.master.title("Login Menu")
self.userlabel=Label(self.master,text="Enter your username",width=20).grid(row=0,column=1)
self.userentered=StringVar()
self.userentry=Entry(self.master,textvariable=self.userentered)
self.userentry.grid(row=1,column=0,columnspan=2)
self.passlabel=Label(self.master,text="Enter your password",width=20).grid(row=2,column=1)
self.passentered=StringVar()
self.passentry=Entry(self.master,textvariable=self.passentered)
self.passentry.grid(row=4,column=0,columnspan=2)
self.confirmbutton=Button(self.master,text="Submit",command=self.checklogin,width=20).grid(row=5,column=1)
self.confirmlabeltext=StringVar()
self.confirmlabel=Label(self.master,textvariable=self.confirmlabeltext,width=30).grid(row=6,column=1)
self.registerlabel=Label(self.master,text="New user? Register here.",width=20).grid(row=8,column=1)
self.registerbutton=Button(self.master,text="Register",command=self.register,width=20).grid(row=10,column=1)
def register(self):
self.newwindow=Toplevel(self.master)
registerWindow(self.newwindow)
```
```
class registerWindow():
def __init__(self,master):
self.master=master
self.master.title("Registering")
self.master.geometry("650x250")
self.genderentered=StringVar()
self.nameentered=StringVar()
self.dobentered=StringVar()
self.clubentered=StringVar()
self.emailentered=StringVar()
self.userentered=StringVar()
self.passentered=StringVar()
self.repeatentered=StringVar()
self.confirmlabeltext=StringVar()
self.cusertext=StringVar()
self.cpasstext=StringVar()
self.crepeattext=StringVar()
self.cdobtext=StringVar()
self.cemailtext=StringVar()
self.cclubtext=StringVar()
self.namelabel=Label(self.master,text="Full Name",width=20).grid(row=0,column=0)
self.nameentry=Entry(self.master,textvariable=self.nameentered)
self.nameentry.grid(row=0,column=1,columnspan=1)
self.doblabel=Label(self.master,text="Date of Birth",width=20).grid(row=2,column=0)
self.cdoblabel=Label(self.master,textvariable=self.cdobtext,width=30).grid(row=2,column=2)
## self.dobentry=Entry(self.master,textvariable=self.dobentered)
## self.dobentry.grid(row=2,column=1,columnspan=1)
self.cal = DateEntry(selectmode='day').grid(row=2,column=1)
self.genderlabel=Label(self.master,text="Gender",width=20).grid(row=4,column=0)
self.genderBox = Combobox(self.master, values = ["Male","Female"])
self.genderBox.grid(row=4,column=1,columnspan=1)
self.genderBox.set("Select Gender")
self.clublabel=Label(self.master,text="Club",width=20).grid(row=6,column=0)
self.clubentry=Entry(self.master,textvariable=self.clubentered)
self.clubentry.grid(row=6,column=1,columnspan=1)
self.emaillabel=Label(self.master,text="Email",width=20).grid(row=8,column=0)
self.cemaillabel=Label(self.master,textvariable=self.cemailtext,width=30).grid(row=8,column=2)
self.emailentry=Entry(self.master,textvariable=self.emailentered)
self.emailentry.grid(row=8,column=1,columnspan=1)
self.userlabel=Label(self.master,text="Username",width=20).grid(row=10,column=0)
self.cuserlabel=Label(self.master,textvariable=self.cusertext,width=30).grid(row=10,column=2)
self.userentry=Entry(self.master,textvariable=self.userentered)
self.userentry.grid(row=10,column=1,columnspan=1)
self.passlabel=Label(self.master,text="Password",width=20).grid(row=12,column=0)
self.cpasslabel=Label(self.master,textvariable=self.cpasstext,width=30).grid(row=12,column=2)
self.passentry=Entry(self.master,textvariable=self.passentered)
self.passentry.grid(row=12,column=1,columnspan=1)
self.repeatlabel=Label(self.master,text="Repeat Password",width=20).grid(row=14,column=0)
self.crepeatlabel=Label(self.master,textvariable=self.crepeattext,width=30).grid(row=14,column=2)
self.repeatentry=Entry(self.master,textvariable=self.repeatentered)
self.repeatentry.grid(row=14,column=1,columnspan=1)
self.confirmbutton=Button(self.master,text="Submit",command=self.inputuser,width=20).grid(row=16,column=1)
self.confirmlabel=Label(self.master,textvariable=self.confirmlabeltext,width=30).grid(row=18,column=1)
def registeruser(self):
db=sqlite3.connect('project races.db')
cursor = db.cursor()
nameentered = self.nameentered.get()
dobentered = self.dobentered.get()
genderentered = self.genderentered.get()
emailentered = self.emailentered.get()
clubentered = self.clubentered.get()
userentered = self.userentered.get()
passentered = self.passentered.get()
sql = "INSERT INTO AthleteDetails (Name,DOB,Gender,Club,Email,Username,Password) VALUES (?,?,?,?,?,?,?)"
cursor.execute(sql, (nameentered,dobentered,genderentered,emailentered,clubentered,userentered,passentered))
self.athlete = cursor.fetchall()
db.commit()
db.close()
def inputuser(self):
#get all the inputted details from the user
dobentered = self.dobentered.get()
genderentered = self.genderentered.get()
emailentered = self.emailentered.get()
clubentered = self.clubentered.get()
userentered = self.userentered.get()
passentered = self.passentered.get()
repeatentered = self.repeatentered.get()
validuser = False
validdob = False
validemail = False
validpass = False
validrepeat = False
validclub = False
#sql to check if username is taken
db=sqlite3.connect("project races.db")
cursor=db.cursor()
sql = "SELECT Username FROM AthleteDetails WHERE Username = ?"
cursor.execute(sql,(userentered,))
Names_check = cursor.fetchall()
if len(userentered) < 3:
self.cusertext.set("Username must be at least 3 characters")
elif len(userentered) > 2:
if len(Names_check) > 0:
self.cusertext.set("Username is taken")
else:
self.cusertext.set("")
validuser = True
#checks to see if date entered is YYYY-MM-DD
date_format = '%Y-%m-%d'
try:
dateObject = datetime.datetime.strptime(dobentered, date_format)
self.cdobtext.set("")
validdob = True
except ValueError:
self.cdobtext.set("Incorrect data format, should be YYYY-MM-DD")
#checking email is valid format
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
if(re.fullmatch(regex, emailentered)):
self.cemailtext.set("")
validemail = True
else:
self.cemailtext.set("Email is invalid")
#checks password is long enough and has a number in it
if len(passentered) < 8:
self.cpasstext.set("Password must be at least 8 characters")
elif len(passentered) > 7:
passlist = []
for characters in range(len(passentered)):
passlist.append(passentered[characters])
numbercheck = False
for i in range(0,10):
if str(i) in passlist:
numbercheck = True
if numbercheck is False:
self.cpasstext.set("Password must contain a number")
else:
validpass = True
self.cpasstext.set("")
#checks passwords match
if passentered != repeatentered:
self.crepeattext.set("Passwords do not match")
else:
self.crepeattext.set("")
validrepeat = True
#checks all data is correct, if so, it will close window and users details are added to database
if validuser == True and validdob == True and validemail == True and validpass == True and validrepeat == True:
self.confirmlabeltext.set("Success")
#self.registeruser()
self.master.destroy()
else:
self.confirmlabeltext.set("Not successful")
def main():
root=Tk()
login=login_GUI(root)
root.mainloop()
if __name__=="__main__":
main()