diff --git a/ipywidgets/widgets/widget.py b/ipywidgets/widgets/widget.py index 6cb125b328..ed574d9858 100644 --- a/ipywidgets/widgets/widget.py +++ b/ipywidgets/widgets/widget.py @@ -759,3 +759,23 @@ def _gen_repr_from_keys(self, keys): for key in keys ) return '%s(%s)' % (class_name, signature) + + + def __copy__(self): + + cls = self.__class__ + result = cls.__new__(cls) + result.__init__() + + new_state = {key: value for key, value in self.get_state().items() if + not key.startswith('_') and + not key == 'layout' and + not key == 'style'} + + for key, value in new_state.items(): + setattr(result, key, value) + + result.layout = self.layout + result.style = self.style + + return result diff --git a/ipywidgets/widgets/widget_box.py b/ipywidgets/widgets/widget_box.py index 32ec3e15c6..db1c3783c6 100644 --- a/ipywidgets/widgets/widget_box.py +++ b/ipywidgets/widgets/widget_box.py @@ -68,6 +68,29 @@ def _fire_children_displayed(self): for child in self.children: child._handle_displayed() + def __copy__(self): + cls = self.__class__ + result = cls.__new__(cls) + + result.__init__(children=tuple([*self.children])) + + # Deep Copy + # from copy import copy + # result.__init__(children=tuple(copy(child) for child in self.children)) + + new_state = {key: value for key, value in self.get_state().items() if + not key.startswith('_') and + not key == 'layout' and + not key == 'style' and + not key == 'children'} + + for key, value in new_state.items(): + setattr(result, key, value) + + result.layout = self.layout + + return result + @register @doc_subst(_doc_snippets) diff --git a/ipywidgets/widgets/widget_button.py b/ipywidgets/widgets/widget_button.py index 0d0498a71a..18ba778b16 100644 --- a/ipywidgets/widgets/widget_button.py +++ b/ipywidgets/widgets/widget_button.py @@ -103,3 +103,27 @@ def _handle_button_msg(self, _, content, buffers): """ if content.get('event', '') == 'click': self.click() + + def __copy__(self): + + cls = self.__class__ + result = cls.__new__(cls) + result.__init__() + + new_state = {key: value for key, value in self.get_state().items() if + not key.startswith('_') and + not key == 'layout' and + not key == 'style'} + for key, value in new_state.items(): + setattr(result, key, value) + + result.layout = self.layout + result.style = self.style + + for callback in self._click_handlers.callbacks: + result.on_click(callback, remove=False) + + return result + + +