{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import panel as pn\n", "pn.extension()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``MenuButton`` widget allows specifying a list of menu items to select from, triggering events when a menu item is clicked. Unlike other widgets, it does not have a ``value`` parameter. Instead it has a ``clicked`` parameter that can be watched to trigger events and which reports the last clicked menu item.\n", "\n", "Discover more on using widgets to add interactivity to your applications in the [how-to guides on interactivity](../how_to/interactivity/index.md). Alternatively, learn [how to set up callbacks and (JS-)links between parameters](../../how_to/links/index.md) or [how to use them as part of declarative UIs with Param](../../how_to/param/index.html).\n", "\n", "#### Parameters:\n", "\n", "For details on other options for customizing the component see the [layout](../../how_to/layout/index.md) and [styling](../../how_to/styling/index.md) how-to guides.\n", "\n", "##### Core\n", "\n", "* **``clicked``** (str): The last clicked menu item\n", "* **``items``** (list(tuple or str or None): Menu items in the dropdown. Allows strings, tuples of the form (title, value) or Nones to separate groups of items.\n", "* **``split``** (boolean): Whether to add separate dropdown area to button.\n", "\n", "##### Display\n", "\n", "* **`button_style`** (str): The button style, either ``'solid'`` or ``'outline'``.\n", "* **``button_type``** (str): A button theme; should be one of ``'default'`` (white), ``'primary'`` (blue), ``'success'`` (green), ``'info'`` (yellow), ``'light'`` (light), or ``'danger'`` (red)\n", "* **`icon`** (str): An icon to render to the left of the button label. Either an SVG or an icon name which is loaded from [tabler-icons.io](https://tabler-icons.io)/.\n", "* **`icon_size`** (str): Size of the icon as a string, e.g. 12px or 1em.\n", "* **``disabled``** (boolean): Whether the widget is editable\n", "* **``name``** (str): The title of the widget\n", "\n", "___" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `MenuButton` is defined by the name of the button and a *list of items* corresponding to the menu items.\n", "\n", "The items can be single string values or as below tuples of string values. By separating items by `None` we can group them into sections:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "menu_items = [('Option A', 'a'), ('Option B', 'b'), ('Option C', 'c'), None, ('Help', 'help')]\n", "\n", "menu_button = pn.widgets.MenuButton(name='Dropdown', items=menu_items, button_type='primary')\n", "\n", "pn.Column(menu_button, height=200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``clicked`` parameter will report the last menu item that was clicked:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "menu_button.clicked" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can `bind` to the `clicked` parameter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def handle_selection(clicked):\n", " return f'You clicked menu item: \"{clicked}\"'\n", "\n", "pn.Column(\n", " menu_button,\n", " pn.bind(handle_selection, menu_button.param.clicked),\n", " height=200\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``on_click`` method can trigger a function when a menu item is clicked:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "text = pn.widgets.TextInput(value='Ready')\n", "\n", "def b(event):\n", " text.value = f'You clicked menu item: \"{event.new}\"'\n", " \n", "menu_button.on_click(b)\n", "\n", "pn.Row(menu_button, text, height=200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Button Type\n", "\n", "The color of the button can be set by selecting one of the available button types:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pn.Column(*(pn.widgets.MenuButton(name=p, button_type=p, items=menu_items) for p in pn.widgets.MenuButton.param.button_type.objects))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Split Menu\n", "\n", "Additionally we can move the dropdown indicator into a separate area using the split option:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "split_menu_button = pn.widgets.MenuButton(name='Split Menu', split=True, items=menu_items, button_type=\"primary\")\n", "pn.Column(split_menu_button, pn.bind(handle_selection, split_menu_button.param.clicked), height=200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the button itself is clicked in `split` mode, the `clicked` property will report the value of the `name` parameter, i.e. in this case clicking it will set the `clicked` parameter to `'Split Menu'`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Icons\n", "\n", "The ``MenuButton`` name and its `items` may contain Unicode characters and emojis, providing a convenient way to define common graphical buttons.\n", "\n", "For the button it self, you can use more advanced icons by providing an svg `icon` value or a named `icon` loaded from [tabler-icons.io](https://tabler-icons.io):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "file_items = [\"\\U0001F4BE Save\", \"🚪 Exit\"]\n", "help_items = [\"⚖️ License\", None, \"\\U0001F6C8 About\"]\n", "pn.Column(pn.Row(\n", " pn.widgets.MenuButton(name=\"File\", icon=\"file\", items=file_items, width=75, button_type=\"light\"),\n", " pn.widgets.MenuButton(name=\"🧏🏻‍♂️ Help\", items=help_items, width=100, button_type=\"light\"),\n", " styles={\"border-bottom\": \"1px solid black\"}\n", " ), height=200, \n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Controls\n", "\n", "The `MenuButton` widget exposes a number of options which can be changed from both Python and Javascript. Try out the effect of these parameters interactively:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pn.Row(menu_button.controls, menu_button)" ] } ], "metadata": { "language_info": { "name": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 4 }