Пример #1
0
    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
Пример #2
0
    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)
Пример #3
0
 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
Пример #4
0
 def __deepcopy__(self, memo):
     if not self.closed: raise Exception("Can't deep copy an open %s object." % classname(self))
     return deepcopy(self, memo)
Пример #5
0
 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