【问题标题】:How to use tkinter entry .get() fuction in another class如何在另一个类中使用 tkinter entry .get() 函数
【发布时间】:2018-07-18 21:04:15
【问题描述】:

我正在努力从另一个类中获取变量条目 getter,我知道我必须传递类的实例,以便从中获取变量,但是我将如何在我想使用的类中使用实际变量它在吗?

这是课程:

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() 还是使用其他方法?

【问题讨论】:

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


    【解决方案1】:

    在这里你可以看到我已经添加了我想从中获取信息的类的实例......

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

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

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

    也就是说你需要修改addEmployee来接受要添加的员工,并调用widget的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)
    

    【讨论】:

    • 我已经有了用户从另一个类的条目中输入的数据,那么我为什么必须将 emp 作为参数传递呢?我不能只使用从条目中获得的信息吗?例如self.FirstNameEntry.get()
    • @Johnny:我不明白你的问题。这个答案显示了如何调用self.FirstNameEntry.get()FirstNameEntry 是员工的属性,因此您需要一个员工实例才能调用它。这不是 tkinter 独有的。在python中,要调用一个类中定义的方法,你需要一个该类的实例。
    【解决方案2】:

    那不是另一个类……那是一个子类。你可以用你定义它的方式来调用它: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(), }) 
    

    【讨论】:

    • 感谢您的回复。我确实打算让它成为一个子类,因为我只是在测试代码,因此我很可能会删除这个class Database(NewEmployee): 以确保它不是子类。是否有可能在不创建子类的情况下获得Surname.get()
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2018-03-19
    • 2012-02-16
    • 2020-04-15
    • 2017-05-03
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多