用 python3/tk 介绍MVC

MVC:Model View Controller

通常MVC,看起来是这样的

Created with Raphaël 2.1.2 用户 用户 视图 视图 控制器 控制器 模型 模型 点一下 我被点了 改下数据 更改 我被改了 让我看看你哪被改了 你看结果

接下来让我们看看代码:

#!/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)

猜你喜欢

转载自blog.csdn.net/sinat_39013092/article/details/80167574