Functions to construct widgets, based on the old SageNB interface.¶
These should ensure mostly backwards compatibility with SageNB.
EXAMPLES:
sage: from sage.repl.ipython_kernel.widgets_sagenb import text_control
sage: text_control("Hello World!")
HTMLText(value='Hello World!')
>>> from sage.all import *
>>> from sage.repl.ipython_kernel.widgets_sagenb import text_control
>>> text_control("Hello World!")
HTMLText(value='Hello World!')
- sage.repl.ipython_kernel.widgets_sagenb.checkbox(default=True, label=None)[source]¶
A checkbox widget.
INPUT:
default– boolean; initial valuelabel– (optional)
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import checkbox sage: checkbox(label="toggle me") Checkbox(value=True, description='toggle me') sage: checkbox(default=0) Checkbox(value=False)
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import checkbox >>> checkbox(label="toggle me") Checkbox(value=True, description='toggle me') >>> checkbox(default=Integer(0)) Checkbox(value=False)
- sage.repl.ipython_kernel.widgets_sagenb.color_selector(default=(0, 0, 1), label=None, widget=None, hide_box=False)[source]¶
A widget for choosing a color.
INPUT:
default– initial valuelabel– (optional)hide_box– boolean; ifTrue, do not show the textbox
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import color_selector sage: w = color_selector("orange", label="color me"); w SageColorPicker(value='#ffa500', description='color me') sage: w.get_interact_value() RGB color (1.0, 0.6470588235294118, 0.0) sage: color_selector(Color(0.1, 0.2, 0.3)) SageColorPicker(value='#19334c')
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import color_selector >>> w = color_selector("orange", label="color me"); w SageColorPicker(value='#ffa500', description='color me') >>> w.get_interact_value() RGB color (1.0, 0.6470588235294118, 0.0) >>> color_selector(Color(RealNumber('0.1'), RealNumber('0.2'), RealNumber('0.3'))) SageColorPicker(value='#19334c')
- sage.repl.ipython_kernel.widgets_sagenb.input_box(default=None, label=None, type=None, width=80, height=1)[source]¶
A textbox widget.
INPUT:
default– initial valuelabel– (optional)type– function of one variable orNone. iftypeisstr, the value of this widget for interactive functions is just the text asstr. Otherwise, the text is evaluated usingsage_eval(),typeis called on it and the result is used as value. Except iftypeisNone, then the evaluated text is used as value.width– width of the boxheight– ifheight > 1, create a textarea instead of a single-line textbox
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import input_box
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import input_box
The most basic usage is when
type=str:sage: w = input_box("4+5", type=str, label="enter a string") sage: w TransformText(value='4+5', description='enter a string', layout=Layout(max_width='81em')) sage: w.get_interact_value() '4+5'
[Python]>>> from sage.all import * >>> w = input_box("4+5", type=str, label="enter a string") >>> w TransformText(value='4+5', description='enter a string', layout=Layout(max_width='81em')) >>> w.get_interact_value() '4+5'
Without
type, the text is evaluated:sage: w = input_box("4+5") sage: w EvalText(value='4+5', layout=Layout(max_width='81em')) sage: w.get_interact_value() 9
>>> from sage.all import * >>> w = input_box("4+5") >>> w EvalText(value='4+5', layout=Layout(max_width='81em')) >>> w.get_interact_value() 9
With a different
type, the text is evaluated andtypeis called on it:sage: w = input_box("4+5", type=float) sage: w EvalText(value='4+5', layout=Layout(max_width='81em')) sage: w.get_interact_value() 9.0
[Python]>>> from sage.all import * >>> w = input_box("4+5", type=float) >>> w EvalText(value='4+5', layout=Layout(max_width='81em')) >>> w.get_interact_value() 9.0
Despite the keyword name,
typedoes not need to be a type:sage: w = input_box("4+5", type=sqrt) sage: w EvalText(value='4+5', layout=Layout(max_width='81em')) sage: w.get_interact_value() 3
>>> from sage.all import * >>> w = input_box("4+5", type=sqrt) >>> w EvalText(value='4+5', layout=Layout(max_width='81em')) >>> w.get_interact_value() 3
When
height > 1, a textarea is returned:sage: w = input_box("4+5", width=100, height=1) sage: w EvalText(value='4+5', layout=Layout(max_width='101em')) sage: w = input_box("4+5", width=100, height=5) sage: w EvalTextarea(value='4+5', layout=Layout(max_width='101em'))
[Python]>>> from sage.all import * >>> w = input_box("4+5", width=Integer(100), height=Integer(1)) >>> w EvalText(value='4+5', layout=Layout(max_width='101em')) >>> w = input_box("4+5", width=Integer(100), height=Integer(5)) >>> w EvalTextarea(value='4+5', layout=Layout(max_width='101em'))
- sage.repl.ipython_kernel.widgets_sagenb.input_grid(nrows, ncols, default=None, label=None, to_value=None, width=4)[source]¶
A widget consisting of a grid (matrix) of textboxes.
The values entered in the textboxes are evaluated (using
sage_eval()). These are stored as a list of lists on thevalueattribute. The value of this widget for an interactive function is the result of callingto_valueon this list of lists.INPUT:
nrows,ncols– number of rows and columns in the griddefault– initial value (given as a list of lists, a single constant value or a flat list)label– (optional)to_value– function to be called to get the value for interactive functionswidth– width of each textbox
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import input_grid sage: input_grid(2, 2, default=42, label='answers') Grid(value=[[42, 42], [42, 42]], children=(Label(value='answers'), VBox(children=(EvalText(value='42', layout=Layout(max_width='5em')), EvalText(value='42', layout=Layout(max_width='5em')))), VBox(children=(EvalText(value='42', layout=Layout(max_width='5em')), EvalText(value='42', layout=Layout(max_width='5em')))))) sage: w = input_grid(2, 2, default=[[cos(x), sin(x)], [-sin(x), cos(x)]], to_value=matrix); w Grid(value=[[cos(x), sin(x)], [-sin(x), cos(x)]], children=(Label(value=''), VBox(children=(EvalText(value='cos(x)', layout=Layout(max_width='5em')), EvalText(value='-sin(x)', layout=Layout(max_width='5em')))), VBox(children=(EvalText(value='sin(x)', layout=Layout(max_width='5em')), EvalText(value='cos(x)', layout=Layout(max_width='5em')))))) sage: w.get_interact_value() [ cos(x) sin(x)] [-sin(x) cos(x)] sage: w = input_grid(2, 2, default=[1, x, x^2, x^3], to_value=lambda x: x[1][1]); w Grid(value=[[1, x], [x^2, x^3]], children=(Label(value=''), VBox(children=(EvalText(value='1', layout=Layout(max_width='5em')), EvalText(value='x^2', layout=Layout(max_width='5em')))), VBox(children=(EvalText(value='x', layout=Layout(max_width='5em')), EvalText(value='x^3', layout=Layout(max_width='5em')))))) sage: w.get_interact_value() x^3
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import input_grid >>> input_grid(Integer(2), Integer(2), default=Integer(42), label='answers') Grid(value=[[42, 42], [42, 42]], children=(Label(value='answers'), VBox(children=(EvalText(value='42', layout=Layout(max_width='5em')), EvalText(value='42', layout=Layout(max_width='5em')))), VBox(children=(EvalText(value='42', layout=Layout(max_width='5em')), EvalText(value='42', layout=Layout(max_width='5em')))))) >>> w = input_grid(Integer(2), Integer(2), default=[[cos(x), sin(x)], [-sin(x), cos(x)]], to_value=matrix); w Grid(value=[[cos(x), sin(x)], [-sin(x), cos(x)]], children=(Label(value=''), VBox(children=(EvalText(value='cos(x)', layout=Layout(max_width='5em')), EvalText(value='-sin(x)', layout=Layout(max_width='5em')))), VBox(children=(EvalText(value='sin(x)', layout=Layout(max_width='5em')), EvalText(value='cos(x)', layout=Layout(max_width='5em')))))) >>> w.get_interact_value() [ cos(x) sin(x)] [-sin(x) cos(x)] >>> w = input_grid(Integer(2), Integer(2), default=[Integer(1), x, x**Integer(2), x**Integer(3)], to_value=lambda x: x[Integer(1)][Integer(1)]); w Grid(value=[[1, x], [x^2, x^3]], children=(Label(value=''), VBox(children=(EvalText(value='1', layout=Layout(max_width='5em')), EvalText(value='x^2', layout=Layout(max_width='5em')))), VBox(children=(EvalText(value='x', layout=Layout(max_width='5em')), EvalText(value='x^3', layout=Layout(max_width='5em')))))) >>> w.get_interact_value() x^3
- sage.repl.ipython_kernel.widgets_sagenb.range_slider(*args, **kwds)[source]¶
A slider widget to select a range of values.
INPUT:
vmin,vmax– minimum and maximum valuestep_size– the step sizedefault– initial value, given as a 2-tuplelabel– (optional)display_value– boolean; ifTrue, display the current value
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import range_slider sage: range_slider(5, label="slide me") TransformIntRangeSlider(value=(28, 76), description='slide me', min=5) sage: range_slider(5, 20) TransformIntRangeSlider(value=(8, 16), max=20, min=5) sage: range_slider(5, 20, 0.5) TransformFloatRangeSlider(value=(8.75, 16.25), max=20.0, min=5.0, step=0.5) sage: range_slider(5, 20, default=(12,15)) TransformIntRangeSlider(value=(12, 15), max=20, min=5)
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import range_slider >>> range_slider(Integer(5), label="slide me") TransformIntRangeSlider(value=(28, 76), description='slide me', min=5) >>> range_slider(Integer(5), Integer(20)) TransformIntRangeSlider(value=(8, 16), max=20, min=5) >>> range_slider(Integer(5), Integer(20), RealNumber('0.5')) TransformFloatRangeSlider(value=(8.75, 16.25), max=20.0, min=5.0, step=0.5) >>> range_slider(Integer(5), Integer(20), default=(Integer(12),Integer(15))) TransformIntRangeSlider(value=(12, 15), max=20, min=5)
The parent of the inputs determines the parent of the value:
sage: w = range_slider(5); w TransformIntRangeSlider(value=(28, 76), min=5) sage: [parent(x) for x in w.get_interact_value()] [Integer Ring, Integer Ring] sage: w = range_slider(int(5)); w IntRangeSlider(value=(28, 76), min=5) sage: [parent(x) for x in w.get_interact_value()] [<... 'int'>, <... 'int'>] sage: w = range_slider(5, 20, step_size=RDF("0.1")); w TransformFloatRangeSlider(value=(8.75, 16.25), max=20.0, min=5.0) sage: [parent(x) for x in w.get_interact_value()] [Real Double Field, Real Double Field]
[Python]>>> from sage.all import * >>> w = range_slider(Integer(5)); w TransformIntRangeSlider(value=(28, 76), min=5) >>> [parent(x) for x in w.get_interact_value()] [Integer Ring, Integer Ring] >>> w = range_slider(int(Integer(5))); w IntRangeSlider(value=(28, 76), min=5) >>> [parent(x) for x in w.get_interact_value()] [<... 'int'>, <... 'int'>] >>> w = range_slider(Integer(5), Integer(20), step_size=RDF("0.1")); w TransformFloatRangeSlider(value=(8.75, 16.25), max=20.0, min=5.0) >>> [parent(x) for x in w.get_interact_value()] [Real Double Field, Real Double Field]
Unfortunately, rational numbers are not supported:
sage: w = range_slider(5, 20, step_size=10/3); w Traceback (most recent call last): ... NotImplementedError: range_slider does not support rational numbers
>>> from sage.all import * >>> w = range_slider(Integer(5), Integer(20), step_size=Integer(10)/Integer(3)); w Traceback (most recent call last): ... NotImplementedError: range_slider does not support rational numbers
- sage.repl.ipython_kernel.widgets_sagenb.selector(values, label=None, default=None, nrows=None, ncols=None, width=None, buttons=False)[source]¶
A widget to select a value from a given list of values.
This is rendered as a dropdown box (if
buttonsis False) or as a list of buttons (ifbuttonsis True).INPUT:
values– list of values to choose from (see examples below for the accepted formats for this)label– (optional)default– initial valuebuttons– boolean; ifTrue, display buttons instead of a dropdown box
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import selector sage: selector(range(5), label="choose one") Dropdown(description='choose one', options=(0, 1, 2, 3, 4), value=0) sage: selector(range(5), buttons=True, default=4) ToggleButtons(index=4, options=(0, 1, 2, 3, 4), value=4)
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import selector >>> selector(range(Integer(5)), label="choose one") Dropdown(description='choose one', options=(0, 1, 2, 3, 4), value=0) >>> selector(range(Integer(5)), buttons=True, default=Integer(4)) ToggleButtons(index=4, options=(0, 1, 2, 3, 4), value=4)
Apart from a simple list,
valuescan be given as a list of 2-tuples(value, label):sage: selector([(1,"one"), (2,"two"), (3,"three")]) Dropdown(options=(('one', 1), ('two', 2), ('three', 3)), value=1) sage: selector([(1,"one"), (2,"two"), (3,"three")], buttons=True) ToggleButtons(options=(('one', 1), ('two', 2), ('three', 3)), value=1)
[Python]>>> from sage.all import * >>> selector([(Integer(1),"one"), (Integer(2),"two"), (Integer(3),"three")]) Dropdown(options=(('one', 1), ('two', 2), ('three', 3)), value=1) >>> selector([(Integer(1),"one"), (Integer(2),"two"), (Integer(3),"three")], buttons=True) ToggleButtons(options=(('one', 1), ('two', 2), ('three', 3)), value=1)
The values can be any kind of object:
sage: selector([sin(x^2), GF(29), EllipticCurve('37a1')]) Dropdown(options=(sin(x^2), Finite Field of size 29, Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field), value=sin(x^2))
>>> from sage.all import * >>> selector([sin(x**Integer(2)), GF(Integer(29)), EllipticCurve('37a1')]) Dropdown(options=(sin(x^2), Finite Field of size 29, Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field), value=sin(x^2))
- sage.repl.ipython_kernel.widgets_sagenb.slider(vmin, vmax=None, step_size=None, default=None, label=None, display_value=True, _range=False)[source]¶
A slider widget.
INPUT:
For a numeric slider (select a value from a range):
vmin,vmax– minimum and maximum valuestep_size– the step size
For a selection slider (select a value from a list of values):
vmin– list of possible values for the slider
For all sliders:
default– initial valuelabel– (optional)display_value– boolean; ifTrue, display the current value
EXAMPLES:
sage: from sage.repl.ipython_kernel.all_jupyter import slider sage: slider(5, label="slide me") TransformIntSlider(value=5, description='slide me', min=5) sage: slider(5, 20) TransformIntSlider(value=5, max=20, min=5) sage: slider(5, 20, 0.5) TransformFloatSlider(value=5.0, max=20.0, min=5.0, step=0.5) sage: slider(5, 20, default=12) TransformIntSlider(value=12, max=20, min=5)
>>> from sage.all import * >>> from sage.repl.ipython_kernel.all_jupyter import slider >>> slider(Integer(5), label="slide me") TransformIntSlider(value=5, description='slide me', min=5) >>> slider(Integer(5), Integer(20)) TransformIntSlider(value=5, max=20, min=5) >>> slider(Integer(5), Integer(20), RealNumber('0.5')) TransformFloatSlider(value=5.0, max=20.0, min=5.0, step=0.5) >>> slider(Integer(5), Integer(20), default=Integer(12)) TransformIntSlider(value=12, max=20, min=5)
The parent of the inputs determines the parent of the value:
sage: w = slider(5); w TransformIntSlider(value=5, min=5) sage: parent(w.get_interact_value()) Integer Ring sage: w = slider(int(5)); w IntSlider(value=5, min=5) sage: parent(w.get_interact_value()) <... 'int'> sage: w = slider(5, 20, step_size=RDF("0.1")); w TransformFloatSlider(value=5.0, max=20.0, min=5.0) sage: parent(w.get_interact_value()) Real Double Field sage: w = slider(5, 20, step_size=10/3); w SelectionSlider(index=2, options=(5, 25/3, 35/3, 15, 55/3), value=35/3) sage: parent(w.get_interact_value()) Rational Field
[Python]>>> from sage.all import * >>> w = slider(Integer(5)); w TransformIntSlider(value=5, min=5) >>> parent(w.get_interact_value()) Integer Ring >>> w = slider(int(Integer(5))); w IntSlider(value=5, min=5) >>> parent(w.get_interact_value()) <... 'int'> >>> w = slider(Integer(5), Integer(20), step_size=RDF("0.1")); w TransformFloatSlider(value=5.0, max=20.0, min=5.0) >>> parent(w.get_interact_value()) Real Double Field >>> w = slider(Integer(5), Integer(20), step_size=Integer(10)/Integer(3)); w SelectionSlider(index=2, options=(5, 25/3, 35/3, 15, 55/3), value=35/3) >>> parent(w.get_interact_value()) Rational Field
Symbolic input is evaluated numerically:
sage: w = slider(e, pi); w TransformFloatSlider(value=2.718281828459045, max=3.141592653589793, min=2.718281828459045) sage: parent(w.get_interact_value()) Real Field with 53 bits of precision
>>> from sage.all import * >>> w = slider(e, pi); w TransformFloatSlider(value=2.718281828459045, max=3.141592653589793, min=2.718281828459045) >>> parent(w.get_interact_value()) Real Field with 53 bits of precision
For a selection slider, the default is adjusted to one of the possible values:
sage: slider(range(10), default=17/10) SelectionSlider(index=2, options=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), value=2)
[Python]>>> from sage.all import * >>> slider(range(Integer(10)), default=Integer(17)/Integer(10)) SelectionSlider(index=2, options=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), value=2)