Johnny
Johnny

Reputation: 43

How to use tkinter entry .get() fuction in another class

I'm struggling to get a variable entry getter from another class, i know i have to pass the instance of the class im getting the variable from, but how would i use the actual variable in the class i would like to use it in?

Here is the class:

class NewEmployee:
    def __init__(self, master):

        self.master = master
        self.master.title("Jans Corp")
        self.master.configure(background="lightgrey")
        self.master.geometry("300x500")

        self.FirstNameEntry = tk.Entry(self.master)
        self.SurnameEntry = tk.Entry(self.master)
        self.AgeEntry = tk.Entry(self.master)
        self.PostcodeEntry = tk.Entry(self.master)

Here is where i'd like to use self.FirstNameEntry.get()

class Database(NewEmployee):
    def __init__(self, master):

        conn = sqlite3.connect(':memory:')
        c = conn.cursor()


    def addEmployees(self):  
        with conn: 
            c.execute("INSERT INTO Employees VALUES (:first, :last, :age)",
                      {'first':emp.first, 'last':emp.last, 'age':emp.age, }) <-----

Here you can see i have added the instance of the class im want to get the info from but do not know how to call "FirstNameEntry.get()" in the database class.

Would i have to use NewEmployee.FirstNameEntry() or would it be something else?

Upvotes: 0

Views: 1899

Answers (2)

Bryan Oakley
Bryan Oakley

Reputation: 385970

Here you can see i have added the instance of the class im want to get the info from...

That is not how classes work. Inheritance is a "is a" relationship. Your code is saying that your Database class "is a" NewEmployee, which is clearly not true. Databases are not employees.

The way to do this is to pass an instance of Employee to your addEmployee method. Roughly speaking, it looks like this:

emp = NewEmployee()
db = Database()
db.addEmployee(emp)

That means that you need to modify addEmployee to accept the employee to be added, and to call the get method of the widgets:

class Database():
    ...
    def addEmployee(self, emp):
        with conn: 
            c.execute(..., {'first':emp.FirstNameEntry.get(),...}) 

Note that it's rather unusual to have something like an Employee class that has widgets in it. Usually it just has data, and you would have a separate class to represent the GUI (ie: you have one GUI but many employees)

For example, your GUI class would be:

class EmployeeForm():
    def __init__(self):
        ...
        self.firstNameEntry = tk.Entry(...)
        ...

You would create one instance of this at the start of your program:

class TheApplication():
    def __init__(self):
        ...
        self.employeeForm = EmployeeForm()
        ...

You might then have an Employee class that looks something like this:

class Employee():
    def __init__(self, first, last, etc):
        self.first = first
        self.last = last
        self.etc = etc

Then, you might add a getEmployee method in your GUI class like this:

class EmployeeForm():
    ...
    def getEmployee(self):
        first = self.firstEntry.get()
        last = self.lastEntry.get()
        etc = self.etcEntry.get()
        return Employee(first, last, etc)

Then, somewhere in your code -- maybe the "save" button on the form or application -- you would do something like this:

employee = self.employeeForm.getEmployee()
db.addEmployee(employee)

Upvotes: 1

Novel
Novel

Reputation: 13729

That's not another class ... that's a subclass. You would call it the same way you defined it: with self. Also, remember that with all subclasses, you have to call the parent __init__ from the subclass.

class Database(NewEmployee):
    def __init__(self, master):
        super().__init__(master) #call parent __init__
        conn = sqlite3.connect(':memory:')
        c = conn.cursor()


    def addEmployees(self):  
        with conn: 
            c.execute("INSERT INTO Employees VALUES (:first, :last, :age)",
                      {'first':self.FirstNameEntry.get(), 'last':self.SurnameEntry.get(), 'age':self.AgeEntry.get(), }) 

Upvotes: 0

Related Questions