Python:MVC体系结构

2024-09-29 21:35:57 发布

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

我目前开始学习python和MVC体系结构。我之所以使用MVC,是因为我读到,使用这种体系结构显示简单的GUI应用程序非常容易

我读过关于MVC体系结构的书,但是当我试图自己实现它时,我有几个问题。我想我不太理解模型、视图和控制器之间的联系

我想用我的程序显示一个按钮。按下按钮后,将打开文件选择,用户可以选择文件。之后,文件名应写入输入框中

我面临的问题是,我不知道如何将视图与控制器和模型连接起来。因此,当按下按钮时,我想通知我的控制器,以便他管理文件选择。在选择文件之后,我想在模型中保存路径

这是我的密码:

查看

from tkinter import filedialog
import tkinter as tk

class View(object):
    def __init__(self, controller):
       self.controller = controller

    def showGUI(self, title):
         self.projectWindow = tk.Tk()
         self.projectWindow.title(title)

         self.importEntry= tk.Entry(projectWindow, width=100)
         self.importEntry.pack(pady=10,padx=10)

         importButton = tk.Button(projectWindow, text ="Import File", command= lambda : self.controller.importButtonPressed(controller)) #Here I need the connection to the controller but I cant access the controllers methods
          #I know this is a very bad practise but I dont really know how to inform the controller in a other way 

         importButton.pack(pady=10, padx=10,side=tk.LEFT)

    def display_file_selection_view(self):
       file_path = filedialog.askopenfilename(title = "Select a Excel File", filetypes=[("Excel files", ".xlsx .xls")])
       return file_path

控制器

import Model 
import View
class Controller(object):
   def __init__(self, model, view):
       self.model = model
       self.view = view

       #I tried something like this to inform the model about the state change
       self.model.register_observer(self.view.importEntry)


  def update(self):
    self.view.importEntry.config(state="normal")
    self.view.importEntry.delete(0,'end')
    self.view.importEntry.insert(0,self.model.selectedElement)
    self.view.importEntry.config(state="readonly")

  def importButtonPressed(self):
    selectedElement = self.view.display_file_selection_view()

    #check if data has been selected
    if selectedElement:
        self.model.selectedExcel = selectedElement
    else:
        self.view.showGUI("File Selection")

型号

 class Model(object):
     def __init__(self):
        self._args = ""
        self._selectedExcel = ""
        self.observers = []
    
    def register_observer(self, observer):
        self.observers.append(observer)
    
    def notify(self):
        [observer.update() for observer in self.observers]

    @property
    def selectedExcel(self):
        return self._selectedExcel

    @selectedExcel.setter
    def selectedExcel(self, value):
       self._selectedExcel = value
       self.notify()

Main

  import Model
  import View 
  import Controller 
  if __name__ == "__main__":
     model = Model.Model()
     view = View.View(Controller)
     controller = Controller.Controller(model, view)

Tags: theimportselfviewmodeldef控制器tk
1条回答
网友
1楼 · 发布于 2024-09-29 21:35:57

需要在视图类中初始化控制器类对象

def __init__(self,controller):
    self. controller = controller

这段代码中的缺陷在于控制器总是一个空对象。您基本上是将空对象的值赋给实例变量

您需要的是在视图构造函数中实例化控制器类的实例,如下所示

def __init__(self,controller):
    self.controller = Controller(model, view)

您需要将变量模型和视图更正为模型和视图构造函数的对象

相关问题 更多 >

    热门问题