MVC:Model View Controller
通常MVC,看起来是这样的
接下来让我们看看代码:
#!/usr/bin/env python3
#coding=utf-8
"""
用python/tk实现简单的MVC
参考资料
head first 《设计模式》
"""
import tkinter as tk
class myView():
"""
视图持有模型和控制器的引用
"""
label = None
button = None
controller = None
model = None
def __init__(self,model,controller):
self.model = model
self.controller = controller
model.registerObserver(self) #把自己注册为model的观察者
def createView(self):
#做出一个tk界面
self.root = tk.Tk()
self.label = tk.Label(self.root,text="0")
self.label.pack(side="top")
self.button = tk.Button(self.root, text="+", command=self.action)
self.button.pack(side="bottom")
self.root.mainloop()
def action(self):
self.controller.increaseValue()
def updateValue(self):
"""
模型发生状态改变时,updateValue()会被调用。
这是我们更新当前显示。
我们可以通过直接请求模型得到这个值。
"""
value = self.model.getValue()
self.label.configure(text=str(value))
class myModel():
"""
模型拥有观察者序列,可注册与删除观察者
能get 与 set 值
"""
value = 0
myObservers = []
def setValue(self,i):
#一旦被修改了值,就通知观察者们自己被改了
self.value = i
self.notifyMyObservers()
def getValue(self):
"""
返回一个整数
"""
return self.value
def notifyMyObservers(self):
for o in self.myObservers:
o.updateValue()
def registerObserver(self,observer):
self.myObservers.append(observer)
def removeObserver(self,observer):
if observer in self.myObservers:
self.myObservers.remove(observer)
class myController():
"""
控制器夹在MVC的中间,所以它需要同时和
模型以及视图接触,当两者的粘合剂
"""
def __init__(self, model):
"""
将控制器当作参数传入
创建视图的构造器中
"""
self.model = model
self.view = myView(model,self)
self.view.createView()
def increaseValue(self):
value = self.model.getValue()
self.model.setValue(value+1)
if __name__ == "__main__":
model = myModel()
controller = myController(model)