Tkcalendar is opening in the wrong window when i try to get it to run

37 Views Asked by At

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()
0

There are 0 best solutions below