| import marimo |
|
|
| __generated_with = "0.9.2" |
| app = marimo.App() |
|
|
|
|
| @app.cell |
| def __(): |
| import marimo as mo |
|
|
| mo.md("# Welcome to marimo! ππ") |
| return (mo,) |
|
|
|
|
| @app.cell |
| def __(mo): |
| slider = mo.ui.slider(1, 22) |
| return (slider,) |
|
|
|
|
| @app.cell |
| def __(mo, slider): |
| mo.md( |
| f""" |
| marimo is a **reactive** Python notebook. |
| |
| This means that unlike traditional notebooks, marimo notebooks **run |
| automatically** when you modify them or |
| interact with UI elements, like this slider: {slider}. |
| |
| {"##" + "π" * slider.value} |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.accordion( |
| { |
| "Tip: disabling automatic execution": mo.md( |
| rf""" |
| marimo lets you disable automatic execution: just go into the |
| notebook settings and set |
| |
| "Runtime > On Cell Change" to "lazy". |
| |
| When the runtime is lazy, after running a cell, marimo marks its |
| descendants as stale instead of automatically running them. The |
| lazy runtime puts you in control over when cells are run, while |
| still giving guarantees about the notebook state. |
| """ |
| ) |
| } |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| Tip: This is a tutorial notebook. You can create your own notebooks |
| by entering `marimo edit` at the command line. |
| """ |
| ).callout() |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| ## 1. Reactive execution |
| |
| A marimo notebook is made up of small blocks of Python code called |
| cells. |
| |
| marimo reads your cells and models the dependencies among them: whenever |
| a cell that defines a global variable is run, marimo |
| **automatically runs** all cells that reference that variable. |
| |
| Reactivity keeps your program state and outputs in sync with your code, |
| making for a dynamic programming environment that prevents bugs before they |
| happen. |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(changed, mo): |
| ( |
| mo.md( |
| f""" |
| **β¨ Nice!** The value of `changed` is now {changed}. |
| |
| When you updated the value of the variable `changed`, marimo |
| **reacted** by running this cell automatically, because this cell |
| references the global variable `changed`. |
| |
| Reactivity ensures that your notebook state is always |
| consistent, which is crucial for doing good science; it's also what |
| enables marimo notebooks to double as tools and apps. |
| """ |
| ) |
| if changed |
| else mo.md( |
| """ |
| **π See it in action.** In the next cell, change the value of the |
| variable `changed` to `True`, then click the run button. |
| """ |
| ) |
| ) |
| return |
|
|
|
|
| @app.cell |
| def __(): |
| changed = False |
| return (changed,) |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.accordion( |
| { |
| "Tip: execution order": ( |
| """ |
| The order of cells on the page has no bearing on |
| the order in which cells are executed: marimo knows that a cell |
| reading a variable must run after the cell that defines it. This |
| frees you to organize your code in the way that makes the most |
| sense for you. |
| """ |
| ) |
| } |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| **Global names must be unique.** To enable reactivity, marimo imposes a |
| constraint on how names appear in cells: no two cells may define the same |
| variable. |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.accordion( |
| { |
| "Tip: encapsulation": ( |
| """ |
| By encapsulating logic in functions, classes, or Python modules, |
| you can minimize the number of global variables in your notebook. |
| """ |
| ) |
| } |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.accordion( |
| { |
| "Tip: private variables": ( |
| """ |
| Variables prefixed with an underscore are "private" to a cell, so |
| they can be defined by multiple cells. |
| """ |
| ) |
| } |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| ## 2. UI elements |
| |
| Cells can output interactive UI elements. Interacting with a UI |
| element **automatically triggers notebook execution**: when |
| you interact with a UI element, its value is sent back to Python, and |
| every cell that references that element is re-run. |
| |
| marimo provides a library of UI elements to choose from under |
| `marimo.ui`. |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell |
| def __(mo): |
| mo.md("""**π Some UI elements.** Try interacting with the below elements.""") |
| return |
|
|
|
|
| @app.cell |
| def __(mo): |
| icon = mo.ui.dropdown(["π", "π", "β¨"], value="π") |
| return (icon,) |
|
|
|
|
| @app.cell |
| def __(icon, mo): |
| repetitions = mo.ui.slider(1, 16, label=f"number of {icon.value}: ") |
| return (repetitions,) |
|
|
|
|
| @app.cell |
| def __(icon, repetitions): |
| icon, repetitions |
| return |
|
|
|
|
| @app.cell |
| def __(icon, mo, repetitions): |
| mo.md("# " + icon.value * repetitions.value) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| ## 3. marimo is just Python |
| |
| marimo cells parse Python (and only Python), and marimo notebooks are |
| stored as pure Python files β outputs are _not_ included. There's no |
| magical syntax. |
| |
| The Python files generated by marimo are: |
| |
| - easily versioned with git, yielding minimal diffs |
| - legible for both humans and machines |
| - formattable using your tool of choice, |
| - usable as Python scripts, with UI elements taking their default |
| values, and |
| - importable by other modules (more on that in the future). |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| ## 4. Running notebooks as apps |
| |
| marimo notebooks can double as apps. Click the app window icon in the |
| bottom-right to see this notebook in "app view." |
| |
| Serve a notebook as an app with `marimo run` at the command-line. |
| Of course, you can use marimo just to level-up your |
| notebooking, without ever making apps. |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| ## 5. The `marimo` command-line tool |
| |
| **Creating and editing notebooks.** Use |
| |
| ``` |
| marimo edit |
| ``` |
| |
| in a terminal to start the marimo notebook server. From here |
| you can create a new notebook or edit existing ones. |
| |
| |
| **Running as apps.** Use |
| |
| ``` |
| marimo run notebook.py |
| ``` |
| |
| to start a webserver that serves your notebook as an app in read-only mode, |
| with code cells hidden. |
| |
| **Convert a Jupyter notebook.** Convert a Jupyter notebook to a marimo |
| notebook using `marimo convert`: |
| |
| ``` |
| marimo convert your_notebook.ipynb > your_app.py |
| ``` |
| |
| **Tutorials.** marimo comes packaged with tutorials: |
| |
| - `dataflow`: more on marimo's automatic execution |
| - `ui`: how to use UI elements |
| - `markdown`: how to write markdown, with interpolated values and |
| LaTeX |
| - `plots`: how plotting works in marimo |
| - `sql`: how to use SQL |
| - `layout`: layout elements in marimo |
| - `fileformat`: how marimo's file format works |
| - `markdown-format`: for using `.md` files in marimo |
| - `for-jupyter-users`: if you are coming from Jupyter |
| |
| Start a tutorial with `marimo tutorial`; for example, |
| |
| ``` |
| marimo tutorial dataflow |
| ``` |
| |
| In addition to tutorials, we have examples in our |
| [our GitHub repo](https://www.github.com/marimo-team/marimo/tree/main/examples). |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| ## 6. The marimo editor |
| |
| Here are some tips to help you get started with the marimo editor. |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell |
| def __(mo, tips): |
| mo.accordion(tips) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md("""## Finally, a fun fact""") |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(mo): |
| mo.md( |
| """ |
| The name "marimo" is a reference to a type of algae that, under |
| the right conditions, clumps together to form a small sphere |
| called a "marimo moss ball". Made of just strands of algae, these |
| beloved assemblages are greater than the sum of their parts. |
| """ |
| ) |
| return |
|
|
|
|
| @app.cell(hide_code=True) |
| def __(): |
| tips = { |
| "Saving": ( |
| """ |
| **Saving** |
| |
| - _Name_ your app using the box at the top of the screen, or |
| with `Ctrl/Cmd+s`. You can also create a named app at the |
| command line, e.g., `marimo edit app_name.py`. |
| |
| - _Save_ by clicking the save icon on the bottom right, or by |
| inputting `Ctrl/Cmd+s`. By default marimo is configured |
| to autosave. |
| """ |
| ), |
| "Running": ( |
| """ |
| 1. _Run a cell_ by clicking the play ( β· ) button on the top |
| right of a cell, or by inputting `Ctrl/Cmd+Enter`. |
| |
| 2. _Run a stale cell_ by clicking the yellow run button on the |
| right of the cell, or by inputting `Ctrl/Cmd+Enter`. A cell is |
| stale when its code has been modified but not run. |
| |
| 3. _Run all stale cells_ by clicking the play ( β· ) button on |
| the bottom right of the screen, or input `Ctrl/Cmd+Shift+r`. |
| """ |
| ), |
| "Console Output": ( |
| """ |
| Console output (e.g., `print()` statements) is shown below a |
| cell. |
| """ |
| ), |
| "Creating, Moving, and Deleting Cells": ( |
| """ |
| 1. _Create_ a new cell above or below a given one by clicking |
| the plus button to the left of the cell, which appears on |
| mouse hover. |
| |
| 2. _Move_ a cell up or down by dragging on the handle to the |
| right of the cell, which appears on mouse hover. |
| |
| 3. _Delete_ a cell by clicking the trash bin icon. Bring it |
| back by clicking the undo button on the bottom right of the |
| screen, or with `Ctrl/Cmd+Shift+z`. |
| """ |
| ), |
| "Disabling Automatic Execution": ( |
| """ |
| Via the notebook settings (gear icon) or footer panel, you |
| can disable automatic execution. This is helpful when |
| working with expensive notebooks or notebooks that have |
| side-effects like database transactions. |
| """ |
| ), |
| "Disabling Cells": ( |
| """ |
| You can disable a cell via the cell context menu. |
| marimo will never run a disabled cell or any cells that depend on it. |
| This can help prevent accidental execution of expensive computations |
| when editing a notebook. |
| """ |
| ), |
| "Code Folding": ( |
| """ |
| You can collapse or fold the code in a cell by clicking the arrow |
| icons in the line number column to the left, or by using keyboard |
| shortcuts. |
| |
| Use the command palette (`Ctrl/Cmd+k`) or a keyboard shortcut to |
| quickly fold or unfold all cells. |
| """ |
| ), |
| "Code Formatting": ( |
| """ |
| If you have [ruff](https://github.com/astral-sh/ruff) installed, |
| you can format a cell with the keyboard shortcut `Ctrl/Cmd+b`. |
| """ |
| ), |
| "Command Palette": ( |
| """ |
| Use `Ctrl/Cmd+k` to open the command palette. |
| """ |
| ), |
| "Keyboard Shortcuts": ( |
| """ |
| Open the notebook menu (top-right) or input `Ctrl/Cmd+Shift+h` to |
| view a list of all keyboard shortcuts. |
| """ |
| ), |
| "Configuration": ( |
| """ |
| Configure the editor by clicking the gears icon near the top-right |
| of the screen. |
| """ |
| ), |
| } |
| return (tips,) |
|
|
|
|
| if __name__ == "__main__": |
| app.run() |
|
|