如何在另一个类中使用tkinter entry .get()功能

时间:2018-07-18 21:04:15

标签: python-3.x class tkinter tkinter-entry

我正在努力从另一个类中获取变量条目获取器,我知道我必须通过该类的实例来获取变量,但是我将如何在我想使用的类中使用实际变量在里面吗?

这是课程:

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)

在这里我想使用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, }) <-----

在这里您可以看到我已经添加了类的实例,我想从中获取信息,但是不知道如何在数据库类中调用“ FirstNameEntry.get()”。

我必须使用NewEmployee.FirstNameEntry()还是其他方式?

2 个答案:

答案 0 :(得分:1)

  

在这里您可以看到我添加了类的实例,我想从...获取信息。

这不是类的工作方式。继承是“是”关系。您的代码说您的数据库类“是” NewEmployee,这显然是不正确的。数据库不是雇员。

执行此操作的方法是将Employee的实例传递给您的addEmployee方法。粗略地说,它看起来像这样:

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

这意味着您需要修改addEmployee以接受要添加的员工,并调用小部件的get方法:

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

请注意,像Employee这样的类中包含小部件是很不常见的。通常它只包含数据,并且您将有一个单独的类来表示GUI(即:您有一个GUI但有很多员工)

例如,您的GUI类为:

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

您将在程序开始时创建一个实例:

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

然后您可能会有一个Employee类,看起来像这样:

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

然后,您可以像这样在GUI类中添加一个getEmployee方法:

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

然后,在代码中的某个位置(可能是表单或应用程序上的“保存”按钮),您将执行以下操作:

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

答案 1 :(得分:0)

那不是另一个类……那是一个子类。您可以使用定义它的方式来调用它:self。另外,请记住,对于所有子类,都必须从子类中调用父类__init__

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(), })