{ "metadata": { "cell_tags": [ [ "", null ] ], "name": "", "signature": "sha256:19f2a57c9ac75d472a9e403515009613fac3fbc733219f7fd4f39a0616ca619f" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from IPython.html import widgets # Widget definitions\n", "from IPython.display import display # Used to display widgets in the notebook" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Alignment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most widgets have a `description` attribute, which allows a label for the widget to be defined.\n", "The label of the widget has a fixed minimum width.\n", "The text of the label is always right aligned and the widget is left aligned:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "display(widgets.TextWidget(description=\"a:\"))\n", "display(widgets.TextWidget(description=\"aa:\"))\n", "display(widgets.TextWidget(description=\"aaa:\"))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If a label is longer than the minimum width, the widget is shifted to the right:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "display(widgets.TextWidget(description=\"a:\"))\n", "display(widgets.TextWidget(description=\"aa:\"))\n", "display(widgets.TextWidget(description=\"aaa:\"))\n", "display(widgets.TextWidget(description=\"aaaaaaaaaaaaaaaaaa:\"))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If a `description` is not set for the widget, the label is not displayed:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "display(widgets.TextWidget(description=\"a:\"))\n", "display(widgets.TextWidget(description=\"aa:\"))\n", "display(widgets.TextWidget(description=\"aaa:\"))\n", "display(widgets.TextWidget())" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Custom Alignment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`ContainerWidget`s allow for custom alignment of widgets.\n", "The `hbox` and `vbox` CSS classes cause the `ContainerWidget` to horizontally or vertically align its children." ] }, { "cell_type": "code", "collapsed": false, "input": [ "child_style = {\n", " 'background': '#77CC77',\n", " 'padding': '25px',\n", " 'margin': '5px',\n", " 'font-size': 'xx-large',\n", " 'color': 'white',\n", "}\n", "\n", "def make_container(title):\n", " header = widgets.LatexWidget(value=title) \n", " display(header)\n", " header.set_css({\n", " 'font-size': '30pt',\n", " 'margin-top': '40pt',\n", " 'margin-bottom': '20pt',\n", " })\n", " \n", " container = widgets.ContainerWidget()\n", " container.set_css({\n", " 'background': '#999999',\n", " 'width': '100%',\n", " })\n", " display(container)\n", " return container\n", "\n", "def fill_container(container):\n", " components = []\n", " for i in range(3):\n", " components.append(widgets.LatexWidget(value=\"ABC\"[i]))\n", " components[i].set_css(child_style)\n", " container.children = components\n", " \n", "container = make_container('VBox')\n", "container.add_class('vbox')\n", "fill_container(container)\n", "\n", "container = make_container('HBox')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `start`, `center`, and `end` classes adjust the alignment of the widgets on the axis where they are being rendered.\n", "Below is an example of the different alignments." ] }, { "cell_type": "code", "collapsed": false, "input": [ "container = make_container('HBox Pack Start')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "container.add_class('start')\n", "fill_container(container)\n", " \n", "container = make_container('HBox Pack Center')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "container.add_class('center')\n", "fill_container(container)\n", " \n", "container = make_container('HBox Pack End')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "container.add_class('end')\n", "fill_container(container)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `box-flex0`, `box-flex1`, and `box-flex2` DOM classes modify the container's flexibility. Changing a container flexibility affects how and if the container will occupy the remaining space. Applying `box-flex0` has the same result as not applying flex. Below is an example of different flex configurations. The number on the boxes correspond to the applied flex." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def fill_container(container, flexes):\n", " components = []\n", " for i in range(len(flexes)):\n", " components.append(widgets.ContainerWidget())\n", " components[i].set_css(child_style)\n", " \n", " label = widgets.LatexWidget(value=str(flexes[i]))\n", " components[i].children = [label]\n", " container.children = components\n", " \n", " for i in range(len(flexes)):\n", " if flexes[i] == 0:\n", " components[i].add_class('box-flex0')\n", " elif flexes[i] == 1:\n", " components[i].add_class('box-flex1')\n", " elif flexes[i] == 2:\n", " components[i].add_class('box-flex2')\n", " \n", "container = make_container('Different Flex Configurations')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container, [0, 0, 0])\n", " \n", "container = make_container('')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container, [0, 0, 1])\n", " \n", "container = make_container('')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container, [0, 1, 1])\n", " \n", "container = make_container('')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container, [0, 2, 2])\n", " \n", "container = make_container('')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container, [0, 1, 2])\n", " \n", "container = make_container('')\n", "container.remove_class('vbox')\n", "container.add_class('hbox')\n", "fill_container(container, [1, 1, 2])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `align_start`, `align_center`, and `align_end` DOM classes adjust the alignment of the widgets on the axis perpindicular to the one that they are being rendered on. Below is an example of the different alignments." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def fill_container(container):\n", " components = []\n", " for i in range(3):\n", " components.append(widgets.LatexWidget(parent=container, value=\"ABC\"[i]))\n", " components[i].set_css(child_style)\n", " components[i].set_css('height', str((i+1) * 50) + 'px')\n", " container.children = components\n", "\n", "container = make_container('HBox Align Start')\n", "container.remove_class('vbox')\n", "container.add_class(\"hbox\")\n", "container.add_class(\"align-start\")\n", "fill_container(container)\n", " \n", "container = make_container('HBox Align Center')\n", "container.remove_class('vbox')\n", "container.add_class(\"hbox\")\n", "container.add_class(\"align-center\")\n", "fill_container(container)\n", " \n", "container = make_container('HBox Align End')\n", "container.remove_class('vbox')\n", "container.add_class(\"hbox\")\n", "container.add_class(\"align-end\")\n", "fill_container(container)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default the widget area is a `vbox`; however, there are many uses for a `hbox`. The example below uses a `hbox` to display a set of vertical sliders, like an equalizer." ] }, { "cell_type": "code", "collapsed": false, "input": [ "container = widgets.ContainerWidget()\n", "container.children=[widgets.FloatSliderWidget(orientation='vertical', description=str(i+1), value=50.0) \n", " for i in range(15)]\n", "display(container)\n", "container.remove_class('vbox')\n", "container.add_class('hbox')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 } ], "metadata": {} } ] }