MVC模式中的无限循环

时间:2012-09-11 11:38:53

标签: python model-view-controller tkinter infinite-loop publish-subscribe

Python中的简化示例:

import Tkinter as Tk
from pubsub import pub

class M(object):
    def __init__(self, initial_value):
        self._x = initial_value

    def get_x(self):
        return self._x
    def set_x(self, value):
        self._x = value
        pub.sendMessage('x', self._x)  # publish the new value of x

class VC(object):
    def __init__(self):
        self.model = M('hello')

        self.root = Tk.Tk()
        self.var = Tk.StringVar(master=self.root, value=self.model.get_x())
        Tk.Entry(master=self.root, textvariable=self.var).pack()
        self.var.trace('w', lambda *args: self.model.set_x(self.var.get()))  # when user types into entry, update model
        pub.subscribe(self.var.set, 'x')  # when model changes, update the contents of entry
        self.root.mainloop()

我写过评论的三行是模型和视图/控制器之间的通信(Tkinter正在执行这两个角色)。但这是一个无限循环:当模型更新时,pub.sendMessage行更新屏幕框的内容,然后var上的跟踪更新模型,更新框...

这一定是个常见问题。通常如何避免?我能想到的唯一解决方案是在setter中添加if value != self._x:,但这看起来有点像黑客而不是一般解决方案。

0 个答案:

没有答案