我目前正在创建一个库,允许GUI https://github.com/jackburridge/pywatch使用可观察的字典,意图是像AngularJS一样,可观察的对象(在Angulars案例中,$ scope)可以像任何其他字典一样对待(Angular中的对象)
我目前有一个像这样的可观察词典结构:
class Watcher:
def __init__(self, watch_object, item):
self.watch_object = watch_object
self.item = item
self.listeners = []
def bind(self, callback):
self.listeners.append(callback)
def notify(self):
for listener in self.listeners:
try:
listener()
except Exception as e:
logging.error(traceback.format_exc())
def get_value(self):
return self.watch_object[self.item]
def set_value(self, value):
self.watch_object[self.item] = value
class WatchableDict(dict):
def __init__(self, seq=None, **kwargs):
self.watchers = {}
dict.__init__(self)
def __setitem__(self, item, new_value):
new_b = item in self
old_value = self[item] if item in self else None
dict.__setitem__(self, item, new_value)
if new_b:
if old_value != new_value:
self.watchers[item].notify()
else:
self.watchers[item] = Watcher(self, item)
def get_watcher(self, name):
if name in self.watchers:
return self.watchers[name]
return None
然后有人可以从dict获取值,使用get_watcher
方法观看它。这当前效果很好,但我想知道当我添加嵌套词典和列表等附加功能时是否有更好的方法
答案 0 :(得分:0)
我前段时间尝试过这些方法。您可以在https://github.com/petrblahos/modellerkit查看,特别是step07。我的想法是只允许容器中的不可变值(我没有使用dict而是使用类作为容器)。然后每当有人调用container_object.watched_property ="新值"时,这将由watched_property的 set 方法检测到,并且可以通知听众。
所以我真的最终得到了我打电话的情况
my_model.operation_list.append(Operation(10, 2123, datetime.datetime.now())
我的列表视图会自动更新,标签也包含项目计数。
我相信您可以简单地克隆repo并运行示例以查看它是如何工作的。我甚至在项目中使用它或2.但我觉得这种方法在某种程度上更适合java而不是python。