对象在MVC(如Python proj)上没有属性错误

2024-04-19 03:35:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了“MainView没有心房ct”,即使它被设置在它的__init__

ct将是控制器的参考

这里是主视图.py你知道吗

import tkinter as tk


class MainView(tk.Frame):

    def __init__(self, root, ct):
        tk.Frame.__init__(root)
        self.startUI()
        self.ct = ct

    def startUI(self):

        botaoProdutos = tk.Button(self, text = "Produtos", command = self.toProdutos() , padx = 5 , pady = 5)
        botaoProdutos.pack(side = "top")

    def toProdutos(self):
        self.ct.toProdutos()


def start(ct):
    ct = ct
    root = tk.Tk()
    main = MainView(root, ct)
    main.tkraise()
    root.mainloop()
    return main

打电话的人呢

from Controller.ProdutoController import ProdutoController
from View.MainView import start

class Main:
    def __start__(self):

        self.ctProduto = ProdutoController()

        self.viewMain = start(self)

    def toProdutos(self):

        self.ctProduto.toProdutos()



if __name__ == "__main__":
    main = Main()
    main.__start__()

回溯:

Traceback (most recent call last):
  File "C:/Users/Gabriel/PycharmProjects/untitled/Controller/Main.py", line 19, in <module>
    main.__start__()
  File "C:/Users/Gabriel/PycharmProjects/untitled/Controller/Main.py", line 9, in __start__
    self.viewMain = start(self)
  File "C:\Users\Gabriel\PycharmProjects\untitled\View\MainView.py", line 22, in start
    main = MainView(root, ct)
  File "C:\Users\Gabriel\PycharmProjects\untitled\View\MainView.py", line 7, in __init__
    self.startUI()
  File "C:\Users\Gabriel\PycharmProjects\untitled\View\MainView.py", line 12, in startUI
    botaoProdutos = tk.Button(self, text = "Produtos", command = self.toProdutos() , padx = 5 , pady = 5)
  File "C:\Users\Gabriel\PycharmProjects\untitled\View\MainView.py", line 16, in toProdutos
    self.ct.toProdutos()

Tags: pyselfmaindefrootstartuserstk
1条回答
网友
1楼 · 发布于 2024-04-19 03:35:37

我看你少了一些东西。你知道吗

  1. 需要将按钮放入root。你知道吗

botaoProdutos = tk.Button(self.root, text="Produtos", command=self.toProdutos, padx=5, pady=5)

为此,需要将self.root = root添加到__init__。你知道吗

  1. 您还需要正确初始化super对象,因此tk.Frame.__init__(self, root)存在。你知道吗
class MainView(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.root = root

现在,在典型的MVC中,您的视图不应该交给控制器,因此我建议,您可以像这样重构您的应用程序,例如

class ProdutoController():
    def __init__(self, model, view):
        self.model = model
        self.view = view

        self.view.register(self)

    def toProdutos(self):
        print(self.model.name) # TODO: Replace

视图的变化如下所示

class MainView(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.root = root
        self.startUI()
        self.ct = None

    def register(self, ct):
        self.ct = ct

最后,mainstart函数可以将模型和视图分配给控制器

root = tk.Tk()

model = Produto("StackOverflow")
view = MainView(root)

ct = ProdutoController(model, view)

root.mainloop()

相关问题 更多 >