rs-kellogg / ocr-tools

MIT License
0 stars 0 forks source link

Replace ipydatagrid solution based on code in comment #4

Open schorndorfer opened 1 year ago

schorndorfer commented 1 year ago
from solara import *
import pandas as pd
import ipydatagrid
import ipywidgets as widgets

df_test = pd.DataFrame({"name": ["seg_1", "seg_2", "seg_3"], "value": [1, 2, 3]})

@solara.component
def Page():
    df = solara.use_reactive(df_test)

    with Card("test editable df"):
        # give it a stable key so it does not get re-created
        # the dataframe argument should not be changed, because dataframe is not a trait of the
        # underlying widget
        datagrid = ipydatagrid.DataGrid.element(dataframe=df_test, editable=True).key("datagrid")

    def connect_events():
        print("wire up events")
        datagrid_widget = solara.get_widget(datagrid)

        def on_cell_change(_ignore=None, *args, **kwargs):
            print("cell changed!", _ignore)
            df.value = datagrid_widget.data

        datagrid_widget.on_cell_change(on_cell_change)
        return lambda: datagrid_widget.on_cell_change(on_cell_change, remove=True)

    # wire up the events once
    solara.use_effect(connect_events, [])

    DataFrame(df.value)
schorndorfer commented 11 months ago

From discord:

import pandas as pd
import numpy as np
import solara
import ipydatagrid

df = solara.reactive(pd.DataFrame(np.random.rand(10,4)))

@solara.component
def Page():
    def set_data():
        df.set(pd.DataFrame(np.random.rand(10,4)))

    solara.Button(label='Random Data', on_click=set_data)
    dg = ipydatagrid.DataGrid.element(dataframe=df.value)
    dg.key(f'datagrid-{df}')

Page()