【发布时间】:2022-02-26 06:09:13
【问题描述】:
我目前从 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()
主要
import Model
import View
import Controller
if __name__ == "__main__":
model = Model.Model()
view = View.View(Controller)
controller = Controller.Controller(model, view)
【问题讨论】:
标签: python tkinter model-view-controller