我目前开始学习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)
需要在视图类中初始化控制器类对象
这段代码中的缺陷在于控制器总是一个空对象。您基本上是将空对象的值赋给实例变量
您需要的是在视图构造函数中实例化控制器类的实例,如下所示
您需要将变量模型和视图更正为模型和视图构造函数的对象
相关问题 更多 >
编程相关推荐