Py.Cafe

maartenbreddels/

solara-external-model-observation

Example on how to use your own model with solara

DocsPricing
  • app.py
  • requirements.txt
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Use an external model with solara

import solara
import traitlets

# our own model class, that is observable
class Model:
    def __init__(self, value):
        self._value = value
        self._event_listeners = []

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        self._value = new_value
        self._fire()

    def _fire(self):
        print("fire events")
        for c in self._event_listeners:
            c()

    def observe(self, callback):
        def remove():
            self._event_listeners.remove(callback)
        self._event_listeners.append(callback)
        return remove



model = Model(42)

@solara.component
def ModelVisualizer(model):
    # forcing update feature
    update_counter = solara.use_reactive(0)
    update_counter.get() # force this component to be a dependency of update_counter
    def force_update():
        print("force update")
        update_counter.value += 1

    # connect/disconnect to model
    def connect_to_model():
        # note that the return value will be called to cleanup the
        # event handler
        return model.observe(force_update)

    solara.use_effect(connect_to_model, [model])
    # model.value is not reactive, but the above code forces rerenders on mutations
    solara.Text(f"Model.value = {model.value}")


@solara.component
def Page():
    ModelVisualizer(model)


    # 'external' mutation
    def increase():
        model.value += 1

    solara.Button("Mutate model", on_click=increase)