Exemple #1
0
 def __init__(self, *args, **kwargs):
     from ipywidgets import Image
     from ipyevents import Event
     #self.plot = None   # set in super?
     super().__init__(*args, **kwargs)
     self.image = Image(value=blank_png, format='png')
     self.no_drag = Event(source=self.image,
                          watched_events=['dragstart'],
                          prevent_default_action=True)
     self.events = Event(source=self.image,
                         watched_events=['click', 'contextmenu'],
                         prevent_default_action=True)
     self.events.on_dom_event(self.__on_click)
     self.update_plot()
Exemple #2
0
    def __init__(self, df, to_show, widths, wrap_around, **kwargs):
        super().__init__(**kwargs)
        self.add_class("content")
        d = Event(source=self,
                  watched_events=['wheel', "mousemove", "mouseleave"])
        d.on_dom_event(self.event_handler)

        self.to_show = to_show
        self.num_rows = min(len(df),
                            to_show if to_show % 2 == 0 else to_show + 1)
        self.idx = 0
        self.wrap_around = wrap_around
        self.df = df
        self.records = df.to_records()

        def row_on_click(event):
            if event["new"] != -1:
                self.value = event["new"]

        self.rows = deque([
            _Row(data=self.records[i],
                 widths=widths,
                 on_click=row_on_click,
                 style=["row_even", "row_odd"][i % 2])
            for i in range(self.num_rows)
        ])
        self.children = list(self.rows)[0:self.to_show]
Exemple #3
0
def test_setting_xy_coordinates_good_value():
    # Setting to a value should just work
    event_widget = Event()
    good_name = 'data'
    event_widget.xy_coordinate_system = good_name

    assert event_widget.xy_coordinate_system == good_name
Exemple #4
0
def test_callbacks():
    # Test that the initial callbacks look right, that we can add one, and
    # that clearing removes them all.
    event_widget = Event()

    assert len(event_widget._dom_handlers.callbacks) == 0

    def noop(event):
        pass

    def noop2(event):
        pass

    event_widget.on_dom_event(noop)

    assert noop in event_widget._dom_handlers.callbacks
    assert len(event_widget._dom_handlers.callbacks) == 1

    # Add noop2....
    event_widget.on_dom_event(noop2)
    assert event_widget._dom_handlers.callbacks == [noop, noop2]

    # Try removing noop2
    event_widget.on_dom_event(noop2, remove=True)
    assert event_widget._dom_handlers.callbacks == [noop]

    # Finally, clear all callbacks
    event_widget.reset_callbacks()

    assert len(event_widget._dom_handlers.callbacks) == 0
Exemple #5
0
def test_floating_point_wait_raises_error():
    # A floating point value should reaise a TraitletError
    event_widget = Event()

    with pytest.raises(traitlets.traitlets.TraitError) as e:
        event_widget.wait = 15.0

    assert "'wait' trait of an Event instance" in str(e)
Exemple #6
0
def test_negative_wait_raises_error():
    # negative wait should raise an error.
    event_widget = Event()

    with pytest.raises(ValueError) as e:
        event_widget.wait = -20

    assert 'wait must be set to a non-negative integer. ' in str(e)
Exemple #7
0
def test_invalid_event_name():
    # An unrecognized event name should generate a ValueError
    event_widget = Event()
    bad_name = 'this is not a valid event name'
    with pytest.raises(ValueError) as e:
        event_widget.watched_events = [bad_name]

    assert bad_name in str(e)
    assert 'not supported. The supported ' in str(e)
Exemple #8
0
def test_properties_work():
    # These are a little silly, but will get this to 100% test coverage
    event_widget = Event()

    # Note the extra underscore on the right hand sides
    assert (event_widget.supported_key_events ==
            event_widget._supported_key_events)
    assert (event_widget.supported_mouse_events ==
            event_widget._supported_mouse_events)
    def construct_arrow_handler(self):
        """ Should only be run once """
        disp_events = Event(source=self, watched_events=['keydown'])

        def handle_disp(event):
            if event["type"] == "keydown":
                self.key_funcs[event["key"]]()

        disp_events.on_dom_event(handle_disp)
Exemple #10
0
    def __init__(self, data, widths, on_click, style, _types=None, **kwargs):
        super().__init__(**kwargs)
        self.add_class(style)
        self.observe(on_click, "value")
        d = Event(source=self, watched_events=['click'])
        d.on_dom_event(self.on_click)

        self.data = data
        self.cells = [_Cell(x, w) for x, w in zip(data, widths)]
        self.cells[0].add_class("index")
        self.children = self.cells
Exemple #11
0
def test_setting_xy_coordinate_bad_value():
    # Setting xy_coordinate_system to a bad value should raise a ValueError
    event_widget = Event()

    bad_name = 'this is not a valid name'

    with pytest.raises(ValueError) as e:
        event_widget.xy_coordinate_system = bad_name

    assert "are not supported. The supported coordinates are" in str(e)
    assert bad_name in str(e)
Exemple #12
0
    def __init__(self, **kwargs):
        """Same constructor as `ipywidgets.widgets.Button`"""
        self.el_btn = widgets.Button(**kwargs)
        self.el_btn.on_click(self.fire_on_click_event)
        self.on_click_callback = lambda x: x
        self.on_mouseenter_callback = lambda x: x
        self.on_mouseleave_callback = lambda x: x

        self.event_listener = Event(
            source=self.el_btn, watched_events=['mouseenter', 'mouseleave'])
        self.event_listener.on_dom_event(self.fire_mouse_event)
Exemple #13
0
def test_invalid_slow_method_raises_error():
    # Setting throttle_or_debounce to an invalid name should raise
    # a ValueError.
    event_widget = Event()

    bad_name = 'this is not a valid name'

    with pytest.raises(ValueError) as e:
        event_widget.throttle_or_debounce = bad_name

    assert bad_name in str(e)
    assert 'The event rate limiting method' in str(e)
Exemple #14
0
 def __init__(self, scene_proxy, bridge, *args, **kw):
     super(IPyRemoteWidget, self).__init__(scene_proxy, bridge, *args, **kw)
     self.image = Image(format='PNG')
     self.event = Event(source=self.image,
                        watched_events=[
                            'dragstart', 'mouseenter', 'mouseleave',
                            'mousedown', 'mouseup', 'mousemove', 'wheel',
                            'keyup', 'keydown'
                        ],
                        prevent_default_action=True)
     self.event.on_dom_event(self.handle_ipyevent)
     self._update_image()
    def construct_click_handler(self):
        """ Should only be run once """
        disp_events = Event(source=self, watched_events=['click'])

        def handle_disp(event):
            if event["type"] == "click":
                x = self.images[self.page_index]._size[0]
                if event["relativeX"] > (x / 2):
                    self.next_page()
                elif event["relativeX"] < (x / 2):
                    self.previous_page()

        disp_events.on_dom_event(handle_disp)
Exemple #16
0
    def setup_jupyter(self):
        """
        Sets up elements on the page for use with a Jupyter notebook.
        """
        self._label = Label('Move the cursor over the cell and use the left and right arrow keys to navigate')
        self._hbox = HBox()
        self._html = HTML('<h3>Label position?</h3>')

        self._inner = VBox()
        self._vbox = VBox([self._html, self._inner, self._label])
        self._event = Event(source=self._vbox, watched_events=['keydown'])
        self._event.on_dom_event(self.handle_event)
        return self
Exemple #17
0
    def __init__(self, fontawesome_icon: str):
        """Clickable icon

        Parameters
        ----------
        fontawesome_icon: str
            icon string from the fontawesome https://fontawesome.com. For example, "fab fa-500px"
        """
        self.el_icon = widgets.HTML(
            value=f'<i class="{fontawesome_icon}"></i>')
        self.on_click_callback = lambda: 1
        self.event_listener = Event(source=self.el_icon,
                                    watched_events=['click'])
        self.event_listener.on_dom_event(self.fire_on_click_event)
Exemple #18
0
def test_setting_wait_with_debounce_set_preserves_debounce(slow_method):
    # If debounce is set but wait is zero and wait is then set to something
    # non-zero then throttle_or_debounce should still stay debounce.
    event_widget = Event()

    event_widget.throttle_or_debounce = slow_method

    # Make sure wait is currently zero...
    assert event_widget.wait == 0

    # This shouldn't change throttle or debounce
    event_widget.wait = 20

    assert event_widget.throttle_or_debounce == slow_method
 def __init__(self, obj):
     self.value = obj # we should compute it -- or use it -- as a 'member'
     if hasattr(obj, '_latex_list'):
         s = obj._latex_list()
     elif hasattr(obj, '_latex_'):
         s = obj._latex_()
     else:
         s = obj.__str__()
     h = HTMLMath('$%s$' % s)
     h.add_class('explorable-value')
     self.clc = Event(source=h, watched_events=['click'])
     super(ExplorableValue, self).__init__(
         (h,),
         layout = Layout(border='1px solid green', padding='2px 50px 2px 2px')
     )
Exemple #20
0
def test_setting_wait_with_no_throttle_or_debounce():
    # If wait is set to something non-zero AND neither throttle
    # nor debounce has been set then it should be set to
    # throttle.
    event_widget = Event()

    # Make sure throttle_or_debounce is not set...
    assert not event_widget.throttle_or_debounce

    # ...and that wait is currently zero
    assert event_widget.wait == 0

    # This implicitly sets throttle_or_debounce
    event_widget.wait = 20

    assert event_widget.throttle_or_debounce == 'throttle'
Exemple #21
0
    def __init__(self, globals_dict):
        self.status_text = display(Code(""), display_id=True)
        self._globals_dict = globals_dict
        self._methods = {}

        self.stop_button = Button(description="Stop")
        self.stop_button.on_click(self.on_stop_button_clicked)
        self._globals_dict["canvas"] = Canvas()
        self.kb_mon = Event(source=self.canvas,
                            watched_events=['keydown', 'keyup'],
                            wait=1000 // FRAME_RATE,
                            prevent_default_actions=True)
        self.output_text = ""
        self.color_strings = {"default": "#888888"}
        match_255 = r"(?:(?:2(?:(?:5[0-5])|(?:[0-4][0-9])))|(?:[01]?[0-9]{1,2}))"
        match_alpha = r"(?:(?:1(?:\.0*)?)|(?:0(?:\.[0-9]*)?))"
        match_360 = r"(?:(?:3[0-5][0-9])|(?:[0-2]?[0-9]{1,2}))"
        match_100 = r"(?:100|[0-9]{1,2})"
        self.regexes = [
            re.compile(r"#[0-9A-Fa-f]{6}"),
            re.compile(r"rgb\({},{},{}\)".format(match_255, match_255,
                                                 match_255)),
            re.compile(r"rgba\({},{},{},{}\)".format(match_255, match_255,
                                                     match_255, match_alpha)),
            re.compile(r"hsl\({},{}%,{}%\)".format(match_360, match_100,
                                                   match_100)),
            re.compile(r"hsla\({},{}%,{}%,{}\)".format(match_360, match_100,
                                                       match_100, match_alpha))
        ]
        self.width, self.height = DEFAULT_CANVAS_SIZE
        self.mouse_x = 0
        self.mouse_y = 0
        self.mouse_is_pressed = False
        self.key = ""
        self._keys_held = {}

        # Settings for drawing text (https://ipycanvas.readthedocs.io/en/latest/drawing_text.html).
        self.font_settings = {
            'size': 12.0,
            'font': 'sans-serif',
            'baseline': 'top',
            'align': 'left'
        }
Exemple #22
0
    def __init__(self,
                 im_path=None,
                 label=None,
                 im_name=None,
                 im_index=None,
                 display_label=True,
                 image_width='50px',
                 image_height=None):

        self.display_label = display_label
        self.label = 'None'
        self.image = Image(layout=Layout(display='flex',
                                         justify_content='center',
                                         align_items='center',
                                         align_content='center',
                                         width=image_width,
                                         height=image_height), )

        if self.display_label:  # both image and label
            self.label = HTML(
                value='?',
                layout=Layout(display='flex',
                              justify_content='center',
                              align_items='center',
                              align_content='center'),
            )
        else:  # no label (capture image case)
            self.im_name = im_name
            self.im_index = im_index
            self.image.layout.border = 'solid 1px gray'
            self.image.layout.object_fit = 'contain'

        super().__init__(
            layout=Layout(align_items='center', margin='3px', padding='2px'))
        if not im_path:
            self.clear()

        self.d = Event(source=self, watched_events=['click'])
Exemple #23
0
    def __init__(self, label_name):
        self.clix = 0  # current landmark index
        self.length = len(db)
        self.n_panels = 5
        self.panels = [ImageAndLabel() for _ in range(self.n_panels)]
        self.label_name = label_name
        self.landmarks = Landmarks({k: None for k in db.keys()})

        self.c = widgets.HTML('Click or type on me!')
        button = widgets.Button(description="Save",
                                layout=widgets.Layout(width='auto'))
        button.on_click(self.save)
        w = widgets.HBox([*self.panels])
        w = widgets.VBox([w, self.c, button])
        self.widget = w

        self.d = Event(source=self.widget, watched_events=['keydown'])
        self.d.on_dom_event(self.handle_event)

        self.target_label = 'q'

        self.render()
        display(self.widget)
Exemple #24
0
def init(*args, **kwargs):
    global flag, downflag, shiftflag

    w = widgets.Image(value=m.system.image_data(), width=600)
    d = Event(source=w,
              watched_events=[
                  'mousedown', 'mouseup', 'mousemove', 'keyup', 'keydown',
                  'wheel'
              ])
    no_drag = Event(source=w,
                    watched_events=['dragstart'],
                    prevent_default_action=True)
    d.on_dom_event(listen_mouse)
    run = widgets.ToggleButton(
        value=False,
        description='Run',
        disabled=False,
        button_style='',  # 'success', 'info', 'warning', 'danger' or ''
        tooltip='run the simulation',
        icon='play')
    pause = widgets.ToggleButton(
        value=False,
        description='Pause',
        disabled=False,
        button_style='',  # 'success', 'info', 'warning', 'danger' or ''
        tooltip='pause the simulation',
        icon='pause')

    reset = widgets.ToggleButton(
        value=False,
        description='Reset',
        disabled=False,
        button_style='',  # 'success', 'info', 'warning', 'danger' or ''
        tooltip='reset the simulation',
        icon='stop')

    def onToggleRun(b):
        global flag
        if run.value:
            run.button_style = 'success'
            pause.value = False
            pause.button_style = ''
            reset.value = False
            reset.button_style = ''
            flag = True
        else:
            run.button_style = ''
            flag = False

    def onTogglePause(b):
        global flag
        if pause.value:
            pause.button_style = 'success'
            run.value = False
            run.button_style = ''
            reset.value = False
            reset.button_style = ''
            flag = False
        else:
            pause.button_style = ''
            flag = True

    def onToggleReset(b):
        global flag
        if reset.value:
            reset.button_style = 'success'
            pause.value = False
            pause.button_style = ''
            run.value = False
            run.button_style = ''
            flag = False
            m.Universe.reset()
        else:
            reset.button_style = ''
            #w = create_simulation()

    buttons = widgets.HBox([run, pause, reset])
    run.observe(onToggleRun, 'value')
    pause.observe(onTogglePause, 'value')
    reset.observe(onToggleReset, 'value')

    box = widgets.VBox([w, buttons])
    display(box)

    def background_threading():
        global flag
        while True:
            m.Simulator.context_make_current()
            if flag:
                m.step()
            w.value = m.system.image_data()
            m.Simulator.context_release()
            time.sleep(0.01)

    t = threading.Thread(target=background_threading)
    t.start()
Exemple #25
0
    def __init__(self,
                 render_window,
                 log_events=True,
                 transparent_background=False,
                 allow_wheel=True,
                 quality=85,
                 quick_quality=50,
                 on_close=None,
                 **kwargs):
        """Accepts a vtkRenderWindow."""

        super().__init__(**kwargs)
        if quality < 0 or quality > 100:
            raise ValueError('`quality` parameter must be between 0 and 100')
        self._quality = quality
        self._render_window = weakref.ref(render_window)
        self.render_window.SetOffScreenRendering(1)  # Force off screen
        self.transparent_background = transparent_background

        self._full_quality = quality
        self._quick_quality = quick_quality

        # Frame rate (1/renderDelay)
        self.last_render_time = 0
        self.quick_render_delay_sec = 0.01
        self.quick_render_delay_sec_range = [0.02, 2.0]
        self.adaptive_render_delay = True
        self.last_mouse_move_event = None

        # refresh if mouse is just moving (not dragging)
        self.track_mouse_move = False

        self.message_timestamp_offset = None

        self.layout.width = '100%'
        self.layout.height = 'auto'

        # Set Canvas size from window size
        self.width, self.height = self.render_window.GetSize()

        # record first render time
        tstart = time.time()
        self.update_canvas()
        self._first_render_time = time.time() - tstart
        log.debug('First image in %.5f seconds', self._first_render_time)

        # this is the minimum time to render anyway
        self.set_quick_render_delay(self._first_render_time)

        self.dragging = False

        self.interaction_events = Event()
        # Set the throttle or debounce time in millseconds (must be an non-negative integer)
        # See https://github.com/mwcraig/ipyevents/pull/55
        self.interaction_events.throttle_or_debounce = "throttle"
        self.interaction_events.wait = INTERACTION_THROTTLE
        self.interaction_events.source = self

        allowed_events = [
            "dragstart",
            "mouseenter",
            "mouseleave",
            "mousedown",
            "mouseup",
            "mousemove",
            "keyup",
            "keydown",
            "contextmenu",  # prevent context menu from appearing on right-click
        ]

        # May be disabled out so that user can scroll through the
        # notebook using mousewheel
        if allow_wheel:
            allowed_events.append("wheel")

        self.interaction_events.watched_events = allowed_events

        # self.interaction_events.msg_throttle = 1  # does not seem to have effect
        self.interaction_events.prevent_default_action = True
        self.interaction_events.on_dom_event(self.handle_interaction_event)

        # Errors are not displayed when a widget is displayed,
        # this variable can be used to retrieve error messages
        self.error = None

        # Enable logging of UI events
        self.log_events = log_events
        self.logged_events = []
        self.elapsed_times = []
        self.age_of_processed_messages = []

        if hasattr(on_close, '__call__'):
            self._on_close = on_close
        else:
            self._on_close = lambda: None
Exemple #26
0
def showCmd(b, layout, out):
    layout.toggle_hide(names=("show",))
    params, summary = layout["view"].children
    controls, view, fov_controls = params.children
    with out:
        logger.info("Loading results ...")
        show_ret = show(
            **layout.kwargs,
            n=0,
            f1=None,
            f2=None,
            gui=True,
        )
        if show_ret == 1:
            out.clear_output(wait=True)
            return
        model, fig, item, ax, fov = show_ret
    with view:
        plt.show()
    with summary:
        display(model.summary)
    n = widgets.BoundedIntText(
        value=0,
        min=0,
        max=model.data.Nt - 1,
        description=f"AOI (0-{model.data.Nt-1})",
        style={"description_width": "initial"},
        layout={"width": "150px"},
    )
    n_counter = widgets.BoundedIntText(
        min=0,
        max=model.data.Nt - 1,
    )
    f1_text = widgets.BoundedIntText(
        value=0,
        min=0,
        max=model.data.F - 15,
        step=1,
        description=f"Frame (0-{model.data.F-1})",
        style={"description_width": "initial"},
        layout={"width": "300px"},
    )
    f1_counter = widgets.BoundedIntText(
        min=0,
        max=model.data.F - 15,
    )
    f1_slider = widgets.IntSlider(
        value=0,
        min=0,
        max=model.data.F - 15,
        step=1,
        continuous_update=True,
        readout=False,
        readout_format="d",
        layout={"width": "210px"},
    )
    f1_box = widgets.VBox(layout=widgets.Layout(width="310px"))
    f1_incr = widgets.Button(description="+15", layout=widgets.Layout(width="45px"))
    f1_decr = widgets.Button(description="-15", layout=widgets.Layout(width="45px"))
    f1_controls = widgets.HBox(
        children=[f1_decr, f1_slider, f1_incr],
        layout=widgets.Layout(width="305px"),
    )
    f1_box.children = [f1_text, f1_controls]
    widgets.jslink((f1_slider, "value"), (f1_text, "value"))
    widgets.jslink((f1_text, "value"), (f1_counter, "value"))
    widgets.jslink((n, "value"), (n_counter, "value"))
    zoom = widgets.Checkbox(
        value=False,
        description="Zoom out frames ['z']",
        indent=False,
        layout={"width": "240px"},
    )
    labels = widgets.Checkbox(
        value=False,
        description="Show labels",
        indent=False,
        layout={"width": "240px"},
    )
    targets = widgets.Checkbox(
        value=False,
        description="Show target location ['o']",
        indent=False,
        layout={"width": "240px"},
    )
    nonspecific = widgets.Checkbox(
        value=True,
        description="Show non-specific spots ['n']",
        indent=False,
        layout={"width": "240px"},
    )
    exclude_aoi = widgets.Checkbox(
        value=not model.data.mask[0],
        description="Exclude AOI from analysis ['e']",
        indent=False,
        layout={"width": "240px"},
    )
    checkboxes = widgets.VBox(layout=widgets.Layout(width="250px"))
    if model.data.labels is None:
        checkboxes.children = [zoom, targets, nonspecific, exclude_aoi]
    else:
        checkboxes.children = [zoom, targets, nonspecific, exclude_aoi, labels]
    controls.children = [n, f1_box, checkboxes]
    # fov controls
    if fov is not None:
        for dtype in fov.dtypes:
            fov_controls.add_child(
                dtype, widgets.Checkbox(value=True, description=f"Show {dtype} AOIs")
            )
            fov_controls[dtype].observe(
                partial(
                    showAOIs,
                    fov=fov,
                    n=n_counter,
                    item=item,
                    fig=fig,
                ),
                names="value",
            )
    fov_controls.add_child("save_data", widgets.Button(description="Save data"))
    # callbacks
    n.observe(
        partial(
            updateParams,
            f1=f1_slider,
            model=model,
            fig=fig,
            item=item,
            ax=ax,
            targets=targets,
            nonspecific=nonspecific,
            labels=labels,
            fov_controls=fov_controls,
            exclude_aoi=exclude_aoi,
            show_fov=layout["show_fov"],
        ),
        names="value",
    )
    f1_slider.observe(
        partial(
            updateRange,
            n=n,
            model=model,
            fig=fig,
            item=item,
            ax=ax,
            zoom=zoom,
            targets=targets,
            fov=fov,
        ),
        names="value",
    )
    f1_incr.on_click(partial(incrementRange, x=15, counter=f1_counter))
    f1_decr.on_click(partial(incrementRange, x=-15, counter=f1_counter))
    zoom.observe(
        partial(zoomOut, f1=f1_slider, model=model, fig=fig, item=item, ax=ax),
        names="value",
    )
    labels.observe(
        partial(showLabels, n=n_counter, model=model, item=item, ax=ax),
        names="value",
    )
    targets.observe(
        partial(
            showTargets,
            n=n_counter,
            f1=f1_slider,
            model=model,
            item=item,
            ax=ax,
        ),
        names="value",
    )
    nonspecific.observe(
        partial(showNonspecific, n=n_counter, model=model, item=item, ax=ax),
        names="value",
    )
    exclude_aoi.observe(
        partial(
            excludeAOI, n=n_counter, model=model, item=item, show_fov=layout["show_fov"]
        ),
        names="value",
    )
    fov_controls["save_data"].on_click(
        partial(saveData, data=model.data, path=model.path, out=out)
    )
    # mouse click UI
    fig.canvas.mpl_connect(
        "button_release_event",
        partial(onFrameClick, counter=f1_counter),
    )
    # key press UI
    d = Event(source=layout, watched_events=["keyup"], prevent_default_action=True)
    d.on_dom_event(
        partial(
            onKeyPress,
            n=n_counter,
            f1=f1_counter,
            zoom=zoom,
            targets=targets,
            nonspecific=nonspecific,
            exclude_aoi=exclude_aoi,
        )
    )
    with out:
        logger.info("Loading results: Done")

    out.clear_output(wait=True)
    b.disabled = True
Exemple #27
0
def run():
    # Time to build the figure!

    fig, ax = plt.subplots(figsize=[9, 9])

    # Draw the stars.

    def scatter_stars():
        marker_size = (0.5 + limiting_magnitude - stars['magnitude']) ** 2.0

        mask = (
            (marker_size > 0.25)
            & (stars['x'] > -0.3)
            & (stars['x'] < 0.3)
            & (stars['y'] > -0.3)
            & (stars['y'] < 0.3)
        )

        #print('Number of stars:', mask.sum())

        #scatter.set_data(stars['x'][mask], stars['y'][mask])
        xy = np.array([stars['x'][mask], stars['y'][mask]])
        scatter.set_offsets(xy.T)

        s = marker_size[mask] #[bright_stars]]
        scatter.set_sizes(s)

    scatter = ax.scatter([], [], color='k')
    scatter_stars()

    # Finally, title the plot and set some final parameters.

    angle = np.pi - field_of_view_degrees / 360.0 * np.pi
    limit = np.sin(angle) / (1.0 - np.cos(angle))
    #print(limit)
    ax.set_xlim(-limit, limit)
    ax.set_ylim(-limit, limit)
    ax.xaxis.set_visible(False)
    ax.yaxis.set_visible(False)
    ax.set_aspect(1.0)
    ax.set_title('Stars')

    from ipywidgets import Label, HTML, HBox, Image, VBox, Box, HBox, interact
    from ipyevents import Event
    from IPython.display import display

    l = Label('Click or type on me!')
    l.layout.border = '2px solid red'

    h = HTML('Event info')
    d = Event(source=l, watched_events=['click', 'keydown', 'mouseenter'])

    def handle_event(event):
        lines = ['{}: {}'.format(k, v) for k, v in event.items()]
        content = '<br>'.join(lines)
        h.value = content

    d.on_dom_event(handle_event)

    #display(l, h)

    import ipywidgets as widgets

    def demo(i):
        field_of_view_degrees = 45.0 - i
        angle = np.pi - field_of_view_degrees / 360.0 * np.pi
        limit = np.sin(angle) / (1.0 - np.cos(angle))

        ax.set_xlim(-limit, limit)
        ax.set_ylim(-limit, limit)
        return fig

    #widgets.interact(demo, i = d)

    def callback(event):
        try:
            return callback2(event)
        except Exception as e:
            place.value = str(e)

    def callback2(event):
        nonlocal limit
        place.value = str(event['code'])
        code = event['code']
        if event['code'] == 'PageUp':
            limit /= 1.1
            ax.set_xlim(-limit, limit)
            ax.set_ylim(-limit, limit)
        elif event['code'] == 'PageDown':
            limit *= 1.1
            ax.set_xlim(-limit, limit)
            ax.set_ylim(-limit, limit)
        elif code.startswith('Arrow'):
            if code == 'ArrowUp':
                set_center(0, 0.5)
            elif code == 'ArrowDown':
                set_center(0, -0.5)
            elif code == 'ArrowLeft':
                set_center(0.1, 0)
            elif code == 'ArrowRight':
                set_center(-0.1, 0)
            set_positions()
            scatter_stars()
            place.value = 'Surv'

        #PageUp: bigger
        #    PageDown: smaller
        redraw()

    from io import BytesIO

    def redraw():
        io = BytesIO()
        plt.savefig(io, format="png")
        #plt.close()
        plt.ioff()
        image.value = io.getvalue()

    image = Image(format='png')
    redraw()

    # The layout bits below make sure the image display looks the same in lab and classic notebook 
    image.layout.max_width = '4in'
    image.layout.height = 'auto'

    im_events = Event()
    im_events.source = image
    im_events.watched_events = ['keydown']
    im_events.on_dom_event(callback)

    place = HTML('Test')
    return VBox([place, image])
Exemple #28
0
def mouse_hover(widget, callback):
    e = Event(source=widget, watched_events=['mousemove'])
    e.on_dom_event(callback)
Exemple #29
0
    def __init__(self,
                 scipp_obj_dict=None,
                 axes=None,
                 masks=None,
                 cmap=None,
                 log=None,
                 vmin=None,
                 vmax=None,
                 color=None,
                 aspect=None):

        super().__init__(scipp_obj_dict=scipp_obj_dict,
                         axes=axes,
                         masks=masks,
                         cmap=cmap,
                         log=log,
                         vmin=vmin,
                         vmax=vmax,
                         color=color,
                         aspect=aspect,
                         button_options=['X', 'Y', 'Z'])

        self.cube = None
        self.members.update({"surfaces": {}, "wireframes": {}})

        # Initialise Figure and VBox objects
        self.fig = ipv.figure(width=config.plot.width,
                              height=config.plot.height,
                              animation=0)

        self.scalar_map = cm.ScalarMappable(
            norm=self.params["values"][self.name]["norm"],
            cmap=self.params["values"][self.name]["cmap"])

        self.permutations = {"x": ["y", "z"], "y": ["x", "z"], "z": ["x", "y"]}

        # Store min/max for each dimension for invisible scatter
        self.xminmax = dict()
        for dim, var in self.slider_x[self.name].items():
            self.xminmax[dim] = [var.values[0], var.values[-1]]
        self.set_axes_range()

        self.wireframes = dict()
        self.surfaces = dict()

        # #====================================================================
        # wframes = self.get_outlines()
        # meshes = self.get_meshes()
        # surf_args = dict.fromkeys(self.permutations)
        # wfrm_args = dict.fromkeys(self.permutations)
        # # print(wframes)
        # for xyz, perm in self.permutations.items():
        #     print(xyz, perm)
        #     key = self.button_axis_to_dim[xyz]

        #     wfrm_args[xyz] = np.ones_like(wframes[xyz][perm[0]]) * \
        #         self.slider_x[key].values[self.slider[key].value]
        #     surf_args[xyz] = np.ones_like(meshes[xyz][perm[0]]) * \
        #         self.slider_x[key].values[self.slider[key].value]
        #     for p in perm:
        #         wfrm_args[p] = wframes[xyz][p]
        #         surf_args[p] = meshes[xyz][p]

        #     self.wireframes[xyz] = ipv.plot_wireframe(**wfrm_args,
        #                                               color="red")
        #     self.surfaces[xyz] = ipv.plot_surface(**surf_args, color="red")
        # #====================================================================

        self.mouse_events = dict()
        self.last_changed_slider_dim = None
        for dim, sl in self.slider.items():
            self.mouse_events[dim] = Event(source=sl,
                                           watched_events=['mouseup'])
            self.mouse_events[dim].on_dom_event(self.update_surface)

        # Call update_slice once to make the initial image
        self.update_axes()
        self.box = [ipv.gcc()] + self.vbox
        self.box = widgets.VBox(self.box)
        self.box.layout.align_items = 'center'

        self.members["fig"] = self.fig

        return
Exemple #30
0
def test_valid_event_name():
    # A valid event name should result in that attribute being set.
    event_widget = Event()
    event_widget.watched_events = ['click']
    assert ['click'] == event_widget.watched_events