def setobj(self, name, value, create_new=False, coord=None, is_binop=False): """ The callback of app.objects, called whenever new objects are created, or the value of an object is changed. This method is responsible for updating the values displayed in the Objects tab of the sidebar, as well as notifying the other views that the value of a variable in the local namespace has changed. Parameters ---------- name : string the name of the variable value : object the value to assign create_new : bool when set to True, this will generate a unique variable name if there is already a key with the same name coord : tuple(float, float) a tuple of floats which determines the coordinates of the newly created item in the node editor Examples -------- >>> app.objects.setitem("x", create_new=True) >>> app.objects.setitem("x", create_new=True) """ name = self.unique_name(name) if create_new else name prev = self.app.node[name] if name in self.app.node else None order = self.order() expanded = self.expanded() update_value = prev and prev.argspec == argspec( value) and prev.classname == classname(value) is_output_item = prev in self.app.node.output.items or prev == self.app.node.output.log_item self.store[name] = value if is_output_item and not update_value: self.app.node.output.disconnect(prev) is_output_item = False self.app.node.setitem(name, update_value=update_value, coord=coord, is_output_item=is_output_item) if update_value and self.exists(name + "<arg=<value>>"): self.item(name + "<arg=<value>>", text=str(value), tags=("editable", fontcolor(value, as_string=True))) return if self.exists(name): super(Treeview, self).delete(name) item = self.app.node[name] self.insert("", "end", name, text=name, tags=("object", "doc")) self.insert(name, "end", name + "<class>", text=item.classname, tags=("class", "no_hover")) if not item.is_callable: self.insert(name, "end", name + "<arg=<value>>", text=str(value), tags=("editable", fontcolor(value, as_string=True))) if item.is_callable: for j in item.args: self.insert(name, "end", name + "<argname=" + j + ">", text=j, tags=("argname", "no_hover")) self.insert(name, "end", name + "<arg=" + j + ">", text=str(item.args[j]), tags=("editable", fontcolor(item.args[j], as_string=True))) if len(item.kwargs) > 0: kwargs = self.insert(name, "end", name + "<kwargs>", text="kwargs") for k in item.kwargs: self.insert(kwargs, "end", name + "<argname=" + k + ">", text=k, tags=("kwargname", "no_hover")) self.insert(kwargs, "end", name + "<arg=" + k + ">", text=str(item.kwargs[k]), tags=("editable", fontcolor(item.kwargs[k], as_string=True))) for j in dir(value): if j[:1] != "_": attr = getattr(value, j) if callable(attr): if not self.exists(name + "<methods>"): self.insert(name, "end", name + "<methods>", text="methods") self.insert(name + "<methods>", "end", name + "." + j, text=j, tags="doc") else: if not self.exists(name + "<constants>"): self.insert(name, "end", name + "<constants>", text="constants") self.insert(name + "<constants>", "end", name + "." + j, text=j + ": " + str(attr), tags="no_hover") self.order(order) self.expanded(expanded) if create_new: return name return False
def __init__(self, canvas, name, coord=(0, 0), args={}, kwargs={}, connection=None, opts={}, class_name=None, is_output_item=False): self.canvas = canvas self.app = canvas.app self.name = name self.obj = self.app.objects[name] self.connection = connection self.argspec = argspec( self.obj) #, withself=inspect.isclass(self.obj)) self.args = vdict({}, getitem=lambda key: self.getarg(key, "args"), setitem=self.setarg) self.kwargs = vdict({}, getitem=lambda key: self.getarg(key, "kwargs"), setitem=self.setarg) self.opts = vdict( { "show_kwargs": opts["show_kwargs"] if "show_kwargs" in opts else False, "sticky_graph": opts["sticky_graph"] if "sticky_graph" in opts else False, "line_color": opts["line_color"] if "line_color" in opts else Color.BLUE }, setitem=self.option) self.entry = Entry(self) self.is_callable = callable(self.obj) self.classname = class_name or classname(self.obj) self.show_wire = False self.method = None self.cached_value = None self.should_cache_value = True self.ids = {} x, y = coord width, height = self.dimensions(self.obj) node = NODE_SIZE * self.canvas.zoom create_parent = getattr( self.canvas, "create_" + ("rectangle" if callable(self.obj) or isinstance(self.obj, (str, list, dict)) else "oval")) self.ids["parent"] = create_parent(x - width / 2, y - height / 2, x + width / 2, y + height / 2, tags=("parent", "draggable", "name=" + self.name), outline=Color.INACTIVE, fill=Color.BLACK) self.ids["name"] = canvas.create_text( 0, 0, tags=("name", "draggable", "name=" + self.name, "font", "fontsize=" + FONTSIZE["name"], "stop_scaling"), text=name or '', fill=Color.WHITE, font="Menlo 18") self.ids["class"] = canvas.create_text( 0, 0, tags=("class", "draggable", "name=" + self.name, "font", "fontsize=" + FONTSIZE["argvalue"], "stop_scaling"), width=0, text=self.classname, fill=Color.BLUE) self.ids["output"] = canvas.create_oval(0, 0, 0, 0, tags=("output", "name=" + self.name), outline=Color.INACTIVE, fill=Color.EMPTY_NODE) self.ids["wire"] = canvas.create_line(0, 0, 0, 0, tags=("wire", "name=" + self.name, "scale_width"), fill=Color.INACTIVE, smooth=True, state="hidden", width=1) if not self.is_callable: self.ids["value"] = canvas.create_text( x, y, tags=("value", "draggable", "editable", "name=" + self.name, "argvalue=<value>", "font", "fontsize=" + FONTSIZE["value"]), text=self.content(), fill=fontcolor(self.obj), font="Menlo 16") self.args.store[ "<value>"] = args["<value>"] if "<value>" in args else self.obj self.ids["arg=<value>"] = canvas.create_oval( 0, 0, 0, 0, tags=("input", "arg=<value>", "name=" + self.name), outline=Color.INACTIVE, fill=Color.EMPTY_NODE) else: num_args = len( self.argspec[0]) if not self.opts["show_kwargs"] else ( len(self.argspec[0]) + len(self.argspec[1])) offset = ((2 * num_args) or 1 - height / 2) * self.canvas.zoom i = 0 if num_args == 1 else (1 - num_args + 0.2) for j in self.argspec[0]: if j not in self.args: self.args.store[j] = args[j] if j in args else None self.ids["arg=" + j] = canvas.create_oval( 0, 0, 0, 0, tags=("input", "arg=" + j, "name=" + self.name), outline=Color.INACTIVE, fill=Color.EMPTY_NODE) self.ids["argname=" + j] = canvas.create_text( 0, 0, tags=("name=" + self.name, "draggable", "font", "fontsize=" + FONTSIZE["argname"]), text=j, fill=Color.DARK_ORANGE, anchor="w") self.ids["argvalue=" + j] = canvas.create_text( 0, 0, tags=("argvalue=" + j, "draggable", "editable", "name=" + self.name, "font", "fontsize=" + FONTSIZE["argvalue"]), text="None", fill=Color.RED, anchor="w") i += 2 for k in self.argspec[1]: if k not in self.kwargs: self.kwargs.store[ k] = kwargs[k] if k in kwargs else self.argspec[1][k] self.ids["arg=" + k] = canvas.create_oval( 0, 0, 0, 0, tags=("arg=" + k, "input", "name=" + self.name), state="normal" if self.opts["show_kwargs"] else "hidden", outline=Color.INACTIVE, fill=Color.EMPTY_NODE) self.ids["argname=" + k] = canvas.create_text( 0, 0, text=k, tags=("name=" + self.name, "argname=" + k, "draggable", "font", "fontsize=" + FONTSIZE["argname"]), state="normal" if self.opts["show_kwargs"] else "hidden", fill=Color.ORANGE, anchor="w") self.ids["argvalue=" + k] = canvas.create_text( 0, 0, text=str(self.kwargs[k]), tags=("argvalue=" + k, "draggable", "editable", "name=" + self.name, "font", "fontsize=" + FONTSIZE["argvalue"]), state="normal" if self.opts["show_kwargs"] else "hidden", fill=fontcolor(self.kwargs[k]), anchor="w") i += 2 self.resize() if connection: output_name, output_arg = connection output = self.canvas[output_name] if output_arg in output.args: output.args[output_arg] = self else: output.kwargs[output_arg] = self self.move_wire() if is_output_item: self.app.node.output.connect(self)
def _prolog(self): if self.iterating: raise Exception("%s '%s' opened for iteration twice, before previous iteration has completed" % (classname(self), self.name)) self.iterating = True
def __deepcopy__(self, memo): if not self.closed: raise Exception("Can't deep copy an open %s object." % classname(self)) return deepcopy(self, memo)
def close(self): if self.closed: raise Exception("Trying to close an already closed file '%s' of class %s" % (self.name, classname(self))) self._close() self.closed = True