diff --git a/app/src/index.tsx b/app/src/index.tsx index f079647..3d2ef74 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -210,7 +210,7 @@ const ExploreApp: React.FC = (props) => { const exportTool = getExportTool(setExportOpen); const tools = [exportTool]; - if (props.env && ["jupyter_widgets", "streamlit", "gradio", "marimo"].indexOf(props.env) !== -1 && props.useSaveTool) { + if (props.env && ["jupyter_widgets", "streamlit", "gradio", "marimo", "anywidget"].indexOf(props.env) !== -1 && props.useSaveTool) { const saveTool = getSaveTool(props, gwRef, storeRef, isChanged, setIsChanged); tools.push(saveTool); } diff --git a/pygwalker/__init__.py b/pygwalker/__init__.py index f704b74..1d6ecb9 100644 --- a/pygwalker/__init__.py +++ b/pygwalker/__init__.py @@ -10,7 +10,7 @@ from pygwalker.services.global_var import GlobalVarManager from pygwalker.services.kaggle import show_tips_user_kaggle as __show_tips_user_kaggle -__version__ = "0.4.9.12" +__version__ = "0.4.9.13" __hash__ = __rand_str() from pygwalker.api.jupyter import walk, render, table diff --git a/pygwalker/api/anywidget.py b/pygwalker/api/anywidget.py new file mode 100644 index 0000000..cbce67b --- /dev/null +++ b/pygwalker/api/anywidget.py @@ -0,0 +1,84 @@ +from typing import Union, List, Optional +import inspect +import json +import pathlib + +from typing_extensions import Literal + +from .pygwalker import PygWalker +from pygwalker.data_parsers.base import FieldSpec +from pygwalker.data_parsers.database_parser import Connector +from pygwalker._typing import DataFrame, IAppearance, IThemeKey +from pygwalker.services.format_invoke_walk_code import get_formated_spec_params_code_from_frame +from pygwalker.communications.anywidget_comm import AnywidgetCommunication +import anywidget +import traitlets + + +class _WalkerWidget(anywidget.AnyWidget): + """WalkerWidget""" + _esm = (pathlib.Path(__file__).parent.parent / "templates" / "dist" / "pygwalker-app.es.js").read_text(encoding="utf-8") + props = traitlets.Unicode("").tag(sync=True) + + +def walk( + dataset: Union[DataFrame, Connector, str], + gid: Union[int, str] = None, + *, + field_specs: Optional[List[FieldSpec]] = None, + theme_key: IThemeKey = 'g2', + appearance: IAppearance = 'media', + spec: str = "", + show_cloud_tool: bool = False, + kanaries_api_key: str = "", + default_tab: Literal["data", "vis"] = "vis", + **kwargs +): + """Walk through pandas.DataFrame df with Graphic Walker + + Args: + - dataset (pl.DataFrame | pd.DataFrame | Connector, optional): dataframe. + - gid (Union[int, str], optional): GraphicWalker container div's id ('gwalker-{gid}') + + Kargs: + - field_specs (List[FieldSpec], optional): Specifications of some fields. They'll been automatically inferred from `df` if some fields are not specified. + - theme_key ('vega' | 'g2' | 'streamlit'): theme type. + - appearance (Literal['media' | 'light' | 'dark']): 'media': auto detect OS theme. + - spec (str): chart config data. config id, json, remote file url + - kanaries_api_key (str): kanaries api key, Default to "". + - default_tab (Literal["data", "vis"]): default tab to show. Default to "vis" + """ + if field_specs is None: + field_specs = [] + + source_invoke_code = get_formated_spec_params_code_from_frame( + inspect.stack()[1].frame + ) + + widget = _WalkerWidget() + walker = PygWalker( + gid=gid, + dataset=dataset, + field_specs=field_specs, + spec=spec, + source_invoke_code=source_invoke_code, + theme_key=theme_key, + appearance=appearance, + show_cloud_tool=show_cloud_tool, + use_preview=False, + kernel_computation=True, + use_save_tool=True, + gw_mode="explore", + is_export_dataframe=True, + kanaries_api_key=kanaries_api_key, + default_tab=default_tab, + cloud_computation=False, + **kwargs + ) + comm = AnywidgetCommunication(walker.gid) + + widget.props = json.dumps(walker._get_props("anywidget", [])) + comm.register_widget(widget) + walker._init_callback(comm) + + return widget diff --git a/pygwalker/api/marimo.py b/pygwalker/api/marimo.py index f19c013..c7886f5 100644 --- a/pygwalker/api/marimo.py +++ b/pygwalker/api/marimo.py @@ -30,7 +30,7 @@ def walk( theme_key: IThemeKey = 'g2', appearance: IAppearance = 'media', spec: str = "", - show_cloud_tool: bool = True, + show_cloud_tool: bool = False, kanaries_api_key: str = "", default_tab: Literal["data", "vis"] = "vis", **kwargs