Python MVC - 尝试将数据从 sqlite 数据库分配到 tkinter 标签小部件

Python MVC - trying to assign data from sqlite database into tkinter label widgets

如何将 sqlite 数据库中的数据附加到 tkinter 中的小部件中,例如标签?目前,我有工作数据库,其中包含一些虚拟数据,但实际上我无法将其中任何一个分配给视图中的标签,以将其呈现给用户。这是一些代码:

型号class

def display_all_employees(self):
    connection = sqlite3.connect("employees_database.db")
    cursor = connection.cursor()

    cursor.execute("""
    SELECT name FROM employees
    """)

    rows = cursor.fetchall()

    for row in rows:
        print(row)

    connection.commit()
    cursor.close()
    connection.close()

控制器

class Controller:
    test_str = ""

    def __init__(self):
        self.model = Model()
        self.view = View(self)
        self.employee_database = Database()

    def main(self):
        self.employee_database.create_database()
        self.view.main()

    def display_all_employees_data(self):
        self.model.display_all_employees(self.test_str)


if __name__ == '__main__':
    calculator = Controller()
    calculator.main()

查看

class View(tk.Tk):
    def __init__(self, controller):
        super().__init__()

        self.title("Calculator")
        self.controller = controller
        self._make_main_frame()
        self._make_buttons()
        self._center_window()

    def _make_main_frame(self):
        self.main_frame = ttk.Frame(self)
        self.main_frame.pack()

        btn = ttk.Button(text="print")
        btn.pack()

解决方案是您的函数 return 需要发送到视图的数据。由于该函数是由控制器调用的,因此控制器可以获取结果并将其传递给视图。

class Model:
    ...
    def display_all_employees(self):
        ...
        rows = cursor.fetchall()
        ...
        return rows

class Controller:
    ...
    def display_all_employees_data(self):
        rows = self.model.display_all_employees(self.test_str)
        self.view.update_all_employees(rows)

class View(tk.Tk):
    ...
    def update_all_employees(self, rows):
        ...

然而,在这种情况下,我会将 display_all_employees 重命名为 get_all_employees,因为模型不负责显示任何内容,它只负责获取数据。


另一种方法是向控制器添加一个方法,用于将数据发送到视图。假设模型有一个 self.controller 属性,您可以将代码更改为:

class Model:
    ...
    def display_all_empoyees(self):
        ...
        rows = cursor.fetchall()
        self.controller.update_all_employees(rows)
        ...

class Controller:
    ...
    def display_all_employees_data(self):
        self.model.display_all_employees(self.test_str)

    def update_all_employees(self, rows):
        self.view.update_all_employees(rows)