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:
,但这看起来有点像黑客而不是一般解决方案。