diff --git a/tknodesystem/__init__.py b/tknodesystem/__init__.py index 065302e..8a56cda 100644 --- a/tknodesystem/__init__.py +++ b/tknodesystem/__init__.py @@ -5,7 +5,7 @@ License: MIT """ -__version__ = '0.7' +__version__ = '0.8' from .node_types import NodeValue, NodeOperation, NodeCompile from .node_canvas import NodeCanvas diff --git a/tknodesystem/node.py b/tknodesystem/node.py index 7b8871c..4858091 100644 --- a/tknodesystem/node.py +++ b/tknodesystem/node.py @@ -115,21 +115,29 @@ def destroy(self): self.canvas.node_list.remove(self) for i in self.canvas.line_ids: i.update() - + + def bind(self, binding, command, add="+"): + for i in self.auxlist: + self.canvas.tag_bind(i, binding, command, add) + def configure(self, **kwargs): """ configure options """ if "fg_color" in kwargs: - self.canvas.itemconfig(self.ID, fill=kwargs.pop("fg_color")) + self.node_color = kwargs.pop("fg_color") + self.canvas.itemconfig(self.ID, fill=self.node_color) if "highlightcolor" in kwargs: self.hover_color = kwargs.pop("highlightcolor") if "hover" in kwargs: self.hover = kwargs.pop("hover") if "text" in kwargs: - self.canvas.itemconfig(self.IDtext, text=kwargs.pop("text")) + self.text = kwargs.pop("text") + self.canvas.itemconfig(self.IDtext, text=self.text) if "text_color" in kwargs: - self.canvas.itemconfig(self.IDtext, fill=kwargs.pop("text_color")) + self.text_color = kwargs.pop("text_color") + self.canvas.itemconfig(self.IDtext, fill=self.text_color) if "font" in kwargs: - self.canvas.itemconfig(self.IDtext, font=kwargs.pop("font")) + self.font = kwargs.pop("font") + self.canvas.itemconfig(self.IDtext, font=self.font) if len(kwargs)>0: raise ValueError("This option is not configurable:" + list(kwargs.keys())[0]) diff --git a/tknodesystem/node_args.py b/tknodesystem/node_args.py index 6ea8fc3..56daf25 100644 --- a/tknodesystem/node_args.py +++ b/tknodesystem/node_args.py @@ -26,9 +26,9 @@ def value_args(args): def func_args(args): default_args = {'width': 100, 'height': 80, 'inputs': 2, 'border_color': '#37373D', 'text': None, 'socket_radius': 8, 'corner_radius': 25, 'border_width': 0, 'fg_color': '#37373D', 'text_color': 'white', 'font': ('', 10), - 'highlightcolor': '#52d66c', 'hover': True, 'socket_color': 'green', 'socket_hover_color': 'grey50', + 'highlightcolor': '#52d66c', 'hover': True, 'socket_color': 'green', 'socket_hover_color': 'grey50', 'pass_node_id': False, 'x': None, 'y': None, 'multiside': False, 'output_socket_color': 'green', 'click_command': None, 'fixed': False, - 'socket_hover': True, 'num': None, 'none_inputs': False, 'justify': 'center', 'hover_text': None} + 'socket_hover': True, 'num': None, 'none_inputs': False, 'justify': 'center', 'hover_text': None, 'multiple_connection': False} args.pop("canvas") args.pop("self") @@ -47,8 +47,8 @@ def func_args(args): return new_args def compile_args(args): - default_args = {'width': 100, 'height': 50, 'border_color': '#37373D', 'text': 'Compile', 'socket_radius': 8, 'justify': 'center', - 'corner_radius': 25, 'x': None, 'y': None, 'border_width': 0, 'fg_color': '#37373D', 'text_color': 'white', + default_args = {'width': 100, 'height': 50, 'border_color': '#37373D', 'text': 'Compile', 'socket_radius': 8, 'justify': 'center', 'pass_node_id': False, + 'corner_radius': 25, 'x': None, 'y': None, 'border_width': 0, 'fg_color': '#37373D', 'text_color': 'white', 'multiple_connection': False, 'font': ('', 10), 'highlightcolor': '#52d66c', 'hover': True, 'socket_hover': True, 'socket_color': 'green', 'fixed': False, 'socket_hover_color': 'grey50', 'show_value': True, 'command': None, 'click_command': None, 'side': 'left', 'num': None} @@ -60,7 +60,6 @@ def compile_args(args): args.pop("y") args.pop("click_command") args.pop("num") - new_args = {} for i in args.keys(): diff --git a/tknodesystem/node_canvas.py b/tknodesystem/node_canvas.py index 71e7bfe..21a7525 100644 --- a/tknodesystem/node_canvas.py +++ b/tknodesystem/node_canvas.py @@ -38,10 +38,11 @@ def __init__(self, master, bg="grey10", width=500, height=500, wire_color="white if sys.platform.startswith("darwin"): self.tag_bind(self.grid_bg, '', lambda e: self.getpos(e, 1)) self.tag_bind(self.grid_bg, '', lambda e: self.getpos(e, 0)) + self.tag_bind(self.grid_bg, "", self.move_grid) else: self.tag_bind(self.grid_bg, '', lambda e: self.getpos(e, 1)) self.tag_bind(self.grid_bg, '', lambda e: self.getpos(e, 0)) - self.tag_bind(self.grid_bg, "", self.move_grid) + self.tag_bind(self.grid_bg, "", self.move_grid) if zoom: self.bind("", self.do_zoom) @@ -73,11 +74,11 @@ def getpos(self, event, cursor): """ get the mouse position and change cursor style """ self.xy_set = (event.x, event.y) - + if cursor: - self.config(cursor="fleur") + self.config(cursor="fleur", width=self.winfo_reqwidth(), height=self.winfo_reqheight()) else: - self.config(cursor="arrow") + self.config(cursor="arrow", width=self.winfo_reqwidth(), height=self.winfo_reqheight()) def move_grid(self, event): """ move the contents of the canvas except the grid image """ @@ -143,6 +144,9 @@ def clear(self): self.compile_num = 0 self.socket_num = 0 self.line_list = set() + self.obj_list = set() + self.line_ids = set() + self.node_list = set() def configure(self, **kwargs): """ configure options """ @@ -221,58 +225,34 @@ def load(self, filename): func_nodes.append(obj) elif obj_type.split()[0]=="NodeCompile": comp_nodes.append(obj) - self.obj_list.add(obj) - - for i in value_nodes: - i.connect_output(None) - for j in func_nodes: - try: - if [self.outputcell.output_.socket_num, j.input_1.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line1, 'input1') - if [self.outputcell.output_.socket_num, j.input_2.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line2, 'input2') - if [self.outputcell.output_.socket_num, j.input_3.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line3, 'input3') - if [self.outputcell.output_.socket_num, j.input_4.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line4, 'input4') - if [self.outputcell.output_.socket_num, j.input_5.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line5, 'input5') - except AttributeError: None - for j in comp_nodes: - if [self.outputcell.output_.socket_num, j.input_1.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(None) - - for i in func_nodes: - i.connect_output(None) - for j in func_nodes: - try: + + for nodes in [value_nodes, func_nodes, comp_nodes]: + for i in nodes: + i.connect_output(None) + for j in func_nodes: + try: + if [self.outputcell.output_.socket_num, j.input_1.socket_num] in line_list: + self.clickcount = 1 + j.connect_input(j.line1, 'input1') + if [self.outputcell.output_.socket_num, j.input_2.socket_num] in line_list: + self.clickcount = 1 + j.connect_input(j.line2, 'input2') + if [self.outputcell.output_.socket_num, j.input_3.socket_num] in line_list: + self.clickcount = 1 + j.connect_input(j.line3, 'input3') + if [self.outputcell.output_.socket_num, j.input_4.socket_num] in line_list: + self.clickcount = 1 + j.connect_input(j.line4, 'input4') + if [self.outputcell.output_.socket_num, j.input_5.socket_num] in line_list: + self.clickcount = 1 + j.connect_input(j.line5, 'input5') + except AttributeError: None + for j in comp_nodes: if [self.outputcell.output_.socket_num, j.input_1.socket_num] in line_list: self.clickcount = 1 - j.connect_input(j.line1, 'input1') - if [self.outputcell.output_.socket_num, j.input_2.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line2, 'input2') - if [self.outputcell.output_.socket_num, j.input_3.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line3, 'input3') - if [self.outputcell.output_.socket_num, j.input_4.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line4, 'input4') - if [self.outputcell.output_.socket_num, j.input_5.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(j.line5, 'input5') - except AttributeError: None - for j in comp_nodes: - if [self.outputcell.output_.socket_num, j.input_1.socket_num] in line_list: - self.clickcount = 1 - j.connect_input(None) + j.connect_input(None) + self.connect_wire = True diff --git a/tknodesystem/node_types.py b/tknodesystem/node_types.py index 648c367..f95085d 100644 --- a/tknodesystem/node_types.py +++ b/tknodesystem/node_types.py @@ -107,7 +107,7 @@ def exists(self): def configure(self, **kwargs): """ configure options """ - + self.args.update(kwargs) if "value" in kwargs: self.output_.value = kwargs.pop("value") if not self.text: @@ -139,8 +139,8 @@ def configure(self, **kwargs): class NodeOperation(Node): def __init__(self, canvas, width=100, height=None, inputs=2, border_color='white', text=None, justify="center", hover_text=None, - socket_radius=8, corner_radius=25, border_width=0, fg_color='#37373D', text_color='white', font=("",10), - highlightcolor='#52d66c', hover=True, socket_color="green", socket_hover_color="grey50", x=0, y=0, none_inputs=False, + socket_radius=8, corner_radius=25, border_width=0, fg_color='#37373D', text_color='white', font=("",10), multiple_connection=False, + highlightcolor='#52d66c', hover=True, socket_color="green", socket_hover_color="grey50", x=0, y=0, none_inputs=False, pass_node_id=False, multiside=False, command=None, output_socket_color="green", click_command=None, socket_hover=True, num=None, fixed=False): self.text = text @@ -160,6 +160,9 @@ def __init__(self, canvas, width=100, height=None, inputs=2, border_color='white args['hover_text'] = self.hover_text self.args = Args.func_args(args) + self.pass_node = pass_node_id + + if command: if command!="": if type(command) is str: @@ -232,6 +235,13 @@ def __init__(self, canvas, width=100, height=None, inputs=2, border_color='white self.celloutput = None self.socket_nums = [] self.values_args = [] + self.multiple = multiple_connection + + self.connected_inputs1 = list() + self.connected_inputs2 = list() + self.connected_inputs3 = list() + self.connected_inputs4 = list() + self.connected_inputs5 = list() self.output_ = NodeSocket(canvas, radius=socket_radius, center=(width+(width/2),height), fg_color=output_socket_color, hover_color=socket_hover_color, socket_num=num[0] if num else None, @@ -346,10 +356,11 @@ def connect_input(self, line_id, input_id): if self.canvas.outputcell in m.connected_node: return m = m.connected_node_first - - try: self.canvas.delete(line_id.ID) - except: None - + + if not self.multiple: + try: self.canvas.delete(line_id.ID) + except: None + self.canvas.clickcount += 1 self.canvas.IDc = input_id self.canvas.inputcell = self @@ -364,41 +375,62 @@ def connect_input(self, line_id, input_id): self.canvas.outputcell.connected_node_first = self try: if input_id=="input1": - for x in self.canvas.line_list: - if x[1]==self.input_1.socket_num: - self.canvas.line_list.remove(x) - break + if not self.multiple: + for x in self.canvas.line_list: + if x[1]==self.input_1.socket_num: + self.canvas.line_list.remove(x) + break + else: + if self.canvas.outputcell not in self.connected_inputs1: + self.connected_inputs1.append(self.canvas.outputcell) l = (self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_1.socket_num) self.canvas.line_list.add(l) if input_id=="input2": - for x in self.canvas.line_list: - if x[1]==self.input_2.socket_num: - self.canvas.line_list.remove(x) - break + if not self.multiple: + for x in self.canvas.line_list: + if x[1]==self.input_2.socket_num: + self.canvas.line_list.remove(x) + break + else: + if self.canvas.outputcell not in self.connected_inputs2: + self.connected_inputs2.append(self.canvas.outputcell) l = (self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_2.socket_num) self.canvas.line_list.add(l) if input_id=="input3": - for x in self.canvas.line_list: - if x[1]==self.input_3.socket_num: - self.canvas.line_list.remove(x) - break + if not self.multiple: + for x in self.canvas.line_list: + if x[1]==self.input_3.socket_num: + self.canvas.line_list.remove(x) + break + else: + if self.canvas.outputcell not in self.connected_inputs3: + self.connected_inputs3.append(self.canvas.outputcell) l = (self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_3.socket_num) self.canvas.line_list.add(l) if input_id=="input4": - for x in self.canvas.line_list: - if x[1]==self.input_4.socket_num: - self.canvas.line_list.remove(x) - break + if not self.multiple: + for x in self.canvas.line_list: + if x[1]==self.input_4.socket_num: + self.canvas.line_list.remove(x) + break + else: + if self.canvas.outputcell not in self.connected_inputs4: + self.connected_inputs4.append(self.canvas.outputcell) l = (self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_4.socket_num) self.canvas.line_list.add(l) if input_id=="input5": - for x in self.canvas.line_list: - if x[1]==self.input_5.socket_num: - self.canvas.line_list.remove(x) - break + if not self.multiple: + for x in self.canvas.line_list: + if x[1]==self.input_5.socket_num: + self.canvas.line_list.remove(x) + break + else: + if self.canvas.outputcell not in self.connected_inputs5: + self.connected_inputs5.append(self.canvas.outputcell) l = (self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_5.socket_num) self.canvas.line_list.add(l) except AttributeError: None + else: if self.canvas.outputcell.type=="NodeValue": try: self.canvas.outputcell.connected_func.remove(self) @@ -412,52 +444,111 @@ def connect_input(self, line_id, input_id): if input_id=="input1": self.cellinput1 = None self.canvas.line_list.remove((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_1.socket_num)) + if self.multiple: + self.connected_inputs1.remove(self.canvas.outputcell) if input_id=="input2": self.cellinput2 = None self.canvas.line_list.remove((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_2.socket_num)) + if self.multiple: + self.connected_inputs2.remove(self.canvas.outputcell) if input_id=="input3": self.cellinput3 = None self.canvas.line_list.remove((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_3.socket_num)) + if self.multiple: + self.connected_inputs3.remove(self.canvas.outputcell) if input_id=="input4": self.cellinput4 = None self.canvas.line_list.remove((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_4.socket_num)) + if self.multiple: + self.connected_inputs4.remove(self.canvas.outputcell) if input_id=="input5": self.cellinput5 = None self.canvas.line_list.remove((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_5.socket_num)) + if multiple: + self.connected_inputs5.remove(self.canvas.outputcell) except AttributeError: None except KeyError: None - - self.update() - + + if self.multiple: + for i in self.canvas.line_ids: + if (i.firstcell==self.canvas.outputcell) and (i.secondcell==self) and (i.inputs==input_id): + i.delete_line(i.inputs) + break + self.update() + + def toggle(self, input_num: int): + line_num = eval(f"self.line{input_num}") + input_num = f"input{input_num}" + self.connect_input(line_num, input_num) + def update(self): """ update the output values """ - arguments = [self.cellinput1, - self.cellinput2, - self.cellinput3, - self.cellinput4, - self.cellinput5] - self.values_args = [] - if self.command: - for i in arguments[0:self.inputs]: - if i is None: - self.values_args.append(None) + + if self.multiple: + cells = [self.connected_inputs1, + self.connected_inputs2, + self.connected_inputs3, + self.connected_inputs4, + self.connected_inputs5] + self.values_args = [] + + if self.command: + for i in cells[0:self.inputs]: + v = [] + for j in i: + if j.output_.value is not None: + v.append(j.output_.value) + self.values_args.append(v) + + if not self.none_values: + for i in self.values_args: + if len(i)==0: + self.output_.value = None + break + else: + self.output_.value = 1 else: - self.values_args.append(i.output_.value) - - if not self.none_values: - for i in self.values_args: - if i is None: - self.output_.value = None - break + self.output_.value = 1 + + if self.output_.value: + if self.pass_node: + self.output_.value = self.command(self, *self.values_args[0:self.inputs]) else: - self.output_.value = 1 + self.output_.value = self.command(*self.values_args[0:self.inputs]) else: - self.output_.value = 1 - - if self.output_.value: - self.output_.value = self.command(*self.values_args[0:self.inputs]) + self.output_.value = [] + else: - self.output_.value = None + arguments = [self.cellinput1, + self.cellinput2, + self.cellinput3, + self.cellinput4, + self.cellinput5] + self.values_args = [] + if self.command: + for i in arguments[0:self.inputs]: + if i is None: + self.values_args.append(None) + else: + self.values_args.append(i.output_.value) + + if not self.none_values: + for i in self.values_args: + if i is None: + self.output_.value = None + break + else: + self.output_.value = 1 + else: + self.output_.value = 1 + + if self.output_.value: + if self.pass_node: + elf.output_.value = self.command(self, *self.values_args[0:self.inputs]) + else: + elf.output_.value = self.command(*self.values_args[0:self.inputs]) + else: + self.output_.value = None if len(self.connected_node)>0: for i in self.connected_node: @@ -528,7 +619,7 @@ def config_socket(self, index: int, hover_text: str=None, hover_text_color=None, def configure(self, **kwargs): """ configure options """ - + self.args.update(kwargs) if "text" in kwargs: self.text = kwargs.pop("text") super().configure(text=self.text) @@ -542,14 +633,23 @@ def configure(self, **kwargs): super().configure(highlightcolor=kwargs.pop("highlightcolor")) if "socket_color" in kwargs: socket_color = kwargs.pop("socket_color") - self.output_.configure(fg_color=socket_color) - try: - self.input_1.configure(fg_color=socket_color) - self.input_2.configure(fg_color=socket_color) - self.input_3.configure(fg_color=socket_color) - self.input_4.configure(fg_color=socket_color) - self.input_5.configure(fg_color=socket_color) - except: None + if type(socket_color) is list: + try: + self.input_1.configure(fg_color=socket_color[0]) + self.input_2.configure(fg_color=socket_color[1]) + self.input_3.configure(fg_color=socket_color[2]) + self.input_4.configure(fg_color=socket_color[3]) + self.input_5.configure(fg_color=socket_color[4]) + except: None + else: + try: + self.input_1.configure(fg_color=socket_color) + self.input_2.configure(fg_color=socket_color) + self.input_3.configure(fg_color=socket_color) + self.input_4.configure(fg_color=socket_color) + self.input_5.configure(fg_color=socket_color) + except: None + if "socket_hover_color" in kwargs: socket_hover_color = kwargs.pop("socket_hover_color") self.output_.configure(hover_color=socket_hover_color) @@ -561,17 +661,6 @@ def configure(self, **kwargs): self.input_5.configure(hover_color=socket_hover_color) except: None - if "socket_color_1" in kwargs: - self.input_1.configure(fg_color=kwargs.pop("socket_color_1")) - if "socket_color_2" in kwargs: - self.input_2.configure(fg_color=kwargs.pop("socket_color_2")) - if "socket_color_3" in kwargs: - self.input_3.configure(fg_color=kwargs.pop("socket_color_3")) - if "socket_color_4" in kwargs: - self.input_4.configure(fg_color=kwargs.pop("socket_color_4")) - if "socket_color_5" in kwargs: - self.input_5.configure(fg_color=kwargs.pop("socket_color_5")) - if "output_socket_color" in kwargs: self.output_.configure(fg_color=kwargs.pop("output_socket_color")) if "hover" in kwargs: @@ -593,7 +682,8 @@ def configure(self, **kwargs): class NodeCompile(Node): def __init__(self, canvas, width=100, height=50, border_color='white', text="Compile", socket_radius=8, corner_radius=25, x=0, y=0, justify="center", border_width=0, fg_color='#37373D',text_color='white', font=("",10), highlightcolor='#52d66c', hover=True, socket_hover=True, fixed=False, - socket_color="green", socket_hover_color="grey50", show_value=True, command=None, click_command=None, side="left", num=None): + socket_color="green", socket_hover_color="grey50", show_value=True, command=None, click_command=None, side="left", num=None, + multiple_connection=False, pass_node_id=False): self.canvas = canvas self.text = text @@ -605,6 +695,8 @@ def __init__(self, canvas, width=100, height=50, border_color='white', text="Com self.canvas.compile_num +=1 self.args = Args.compile_args(locals()) + + self.pass_node = pass_node_id if command: if command!="": @@ -628,13 +720,14 @@ def __init__(self, canvas, width=100, height=50, border_color='white', text="Com text_color=text_color, font=font, click_command=click_command, highlightcolor=highlightcolor) self.line1 = None - self.line2 = None self.cellinput1 = None - self.cellinput2 = None self.celloutput = None self.show_value = show_value self.previous_value = None self.command = command + self.connected_inputs = list() + self.multiple = multiple_connection + self.multilines = {} if side=="left": center = (width-(width/2),height) @@ -648,15 +741,18 @@ def __init__(self, canvas, width=100, height=50, border_color='white', text="Com self.output_ = NodeSocket(canvas, radius=socket_radius, center=(width+(width/2),height), fg_color=socket_color, hover_color=socket_hover_color, border_width=border_width, border_color=border_color, hover=socket_hover, socket_num=num[1] if num else None) - self.output_.hide() + self.socket_nums = [self.input_1.socket_num, self.output_.socket_num] self.allIDs = self.allIDs + [self.output_.ID, self.input_1.ID] self.fixed = True self.bind_all_to_movement() self.canvas.tag_bind(self.input_1.ID, '', self.connect_input) + if not fixed: self.canvas.bind_all("", lambda e: self.destroy() if self.signal else None, add="+") - + + self.output_.hide() + for j in range(self.canvas.gain_in): for i in self.allIDs: self.canvas.scale(i, 0, 0, 1.1, 1.1) @@ -669,13 +765,30 @@ def __init__(self, canvas, width=100, height=50, border_color='white', text="Com super().move(x,y) self.canvas.obj_list.add(self) + + def connect_output(self, event): + """ connect output socket """ + + self.canvas.clickcount += 1 + self.canvas.outputcell = self + + if self.canvas.clickcount == 2: + self.canvas.clickcount = 0 + + self.output_.connect_wire() def connect_input(self, event): """ connect input sockets """ - - try: self.canvas.delete(self.line1.ID) - except: None + if not self.multiple: + try: self.canvas.delete(self.line1.ID) + except: None + else: + if self.canvas.outputcell in list(self.multilines.keys()): + if self.multilines[self.canvas.outputcell] is not None: + self.canvas.delete(self.multilines[self.canvas.outputcell]) + del self.multilines[self.canvas.outputcell] + self.canvas.clickcount += 1 self.canvas.IDc = 'input1' self.canvas.inputcell = self @@ -687,10 +800,14 @@ def connect_input(self, event): try: if self.canvas.outputcell.type=="NodeValue": self.canvas.outputcell.connected_func.add(self) - for x in self.canvas.line_list: - if x[1]==self.input_1.socket_num: - self.canvas.line_list.remove(x) - break + if not self.multiple: + for x in self.canvas.line_list: + if x[1]==self.input_1.socket_num: + self.canvas.line_list.remove(x) + break + else: + if self.canvas.outputcell not in self.connected_inputs: + self.connected_inputs.append(self.canvas.outputcell) self.canvas.line_list.add((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_1.socket_num)) except AttributeError: None else: @@ -700,36 +817,61 @@ def connect_input(self, event): try: self.canvas.outputcell.connected_func.remove(self) except KeyError: None self.canvas.line_list.remove((self.canvas.outputcell.output_.socket_num, self.canvas.inputcell.input_1.socket_num)) + if self.multiple: + self.connected_inputs.remove(self.canvas.outputcell) + self.canvas.delete(self.line1.ID) except AttributeError: None except KeyError: None - + if self.multiple: + try: + self.multilines.update({self.canvas.outputcell:self.line1.ID}) + except: + self.multilines.update({self.canvas.outputcell:None}) + def get(self): """ get the current value of node """ return self.output_.value + def toggle(self): + self.connect_input(0) + def update(self): """ update the output values """ - - self.output_.value = self.cellinput1.output_.value if not self.fixed else None + + if self.ID not in self.canvas.find_all(): + return + if self.multiple: + output = [] + for i in self.connected_inputs: + if i.output_.value is not None: + output.append(i.output_.value) + else: + output = self.cellinput1.output_.value if not self.fixed else None + + self.output_.value = output if self.previous_value!=self.output_.value: if self.show_value: self.canvas.itemconfigure(self.IDtext, text=str(self.output_.value)) if self.output_.value is not None: - if self.command: self.command(self.output_.value) + if self.command: + if self.pass_node: + self.command(self, self.output_.value) + else: + self.command(self.output_.value) self.previous_value = self.output_.value - if self.ID in self.canvas.find_all(): - self.canvas.after(50, self.update) - + self.canvas.after(50, self.update) + def destroy(self): if self.ID not in self.canvas.find_all(): return self.output_.value = None + for i in self.allIDs: self.canvas.delete(i) self.canvas.obj_list.remove(self) super().destroy() - + def exists(self): if self.ID in self.canvas.find_all(): return True @@ -738,7 +880,7 @@ def exists(self): def configure(self, **kwargs): """ configure options """ - + self.args.update(kwargs) if "text" in kwargs: self.text = kwargs.pop("text") super().configure(text=self.text)