Skip to content

Instantly share code, notes, and snippets.

@lebedov
Created January 7, 2019 20:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lebedov/adfc0d7eac5983a7f7ac2af362660a0e to your computer and use it in GitHub Desktop.
Save lebedov/adfc0d7eac5983a7f7ac2af362660a0e to your computer and use it in GitHub Desktop.
Panel integer input widget with bounds
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Panel integer input widget with bounds\n",
"\n",
"Works with Panel 0.3.1"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
"// Ugly hack - see HoloViews #2574 for more information\n",
"if (!(document.getElementById('1001')) && !(document.getElementById('_anim_img1001'))) {\n",
" console.log(\"Creating DOM nodes dynamically for assumed nbconvert export. To generate clean HTML output set HV_DOC_HTML as an environment variable.\")\n",
" var htmlObject = document.createElement('div');\n",
" htmlObject.innerHTML = `\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" <div class=\"bk-root\" id=\"32287453-0d1e-4891-b7c8-23691629d721\" data-root-id=\"1001\"></div>\n",
"`;\n",
" var scriptTags = document.getElementsByTagName('script');\n",
" var parentTag = scriptTags[scriptTags.length-1].parentNode;\n",
" if (parentTag.attributes.length && (parentTag.attributes[0].name == 'data-shell-mode')) {\n",
" alert('Displaying PyViz objects in JupyterLab requires the jupyterlab_pyviz extension to be installed, install it with:\\n\\n\\tjupyter labextension install @pyviz/jupyterlab_pyviz');\n",
" } else {\n",
" parentTag.append(htmlObject)\n",
" }\n",
"}\n",
"\n",
" function msg_handler(msg) {\n",
" var metadata = msg.metadata;\n",
" var buffers = msg.buffers;\n",
" var msg = msg.content.data;\n",
" if ((metadata.msg_type == \"Ready\")) {\n",
" if (metadata.content) {\n",
" console.log(\"Python callback returned following output:\", metadata.content);\n",
" }\n",
" } else if (metadata.msg_type == \"Error\") {\n",
" console.log(\"Python failed with the following traceback:\", metadata.traceback)\n",
" } else {\n",
" \n",
"var plot_id = \"1001\";\n",
"if (plot_id in window.PyViz.plot_index) {\n",
" var plot = window.PyViz.plot_index[plot_id];\n",
"} else {\n",
" var plot = Bokeh.index[plot_id];\n",
"}\n",
"\n",
"if (plot_id in window.PyViz.receivers) {\n",
" var receiver = window.PyViz.receivers[plot_id];\n",
"} else if (Bokeh.protocol === undefined) {\n",
" return;\n",
"} else {\n",
" var receiver = new Bokeh.protocol.Receiver();\n",
" window.PyViz.receivers[plot_id] = receiver;\n",
"}\n",
"\n",
"if ((buffers != undefined) && (buffers.length > 0)) {\n",
" receiver.consume(buffers[0].buffer)\n",
"} else {\n",
" receiver.consume(msg)\n",
"}\n",
"\n",
"const comm_msg = receiver.message;\n",
"if ((comm_msg != null) && (Object.keys(comm_msg.content).length > 0)) {\n",
" plot.model.document.apply_json_patch(comm_msg.content, comm_msg.buffers)\n",
"}\n",
"\n",
" }\n",
" }\n",
" if ((window.PyViz == undefined) || (!window.PyViz.comm_manager)) {\n",
" console.log(\"Could not find comm manager\")\n",
" } else {\n",
" window.PyViz.comm_manager.register_target('1001', 'cc37fdf081bd49a8b3d5b1412a321002', msg_handler);\n",
" }\n",
" \n",
"(function(root) {\n",
" function embed_document(root) {\n",
" \n",
" var docs_json = {\"0f4ca252-fdf3-49c2-8e56-0999ea2584fe\":{\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1002\",\"type\":\"TextInput\"}]},\"id\":\"1001\",\"type\":\"WidgetBox\"},{\"attributes\":{\"code\":\"data = {height: cb_obj['height']};\\n\\nfunction unique_events(events) {\\n // Processes the event queue ignoring duplicate events\\n // of the same type\\n var unique = [];\\n var unique_events = [];\\n for (var i=0; i<events.length; i++) {\\n var _tmpevent = events[i];\\n event = _tmpevent[0];\\n data = _tmpevent[1];\\n if (unique_events.indexOf(event)===-1) {\\n unique.unshift(data);\\n unique_events.push(event);\\n }\\n }\\n return unique;\\n}\\n\\nfunction process_events(comm_status) {\\n // Iterates over event queue and sends events via Comm\\n var events = unique_events(comm_status.event_buffer);\\n for (var i=0; i<events.length; i++) {\\n var data = events[i];\\n var comm = window.PyViz.comms[data[\\\"comm_id\\\"]];\\n comm.send(data);\\n }\\n comm_status.event_buffer = [];\\n}\\n\\nfunction on_msg(msg) {\\n // Receives acknowledgement from Python, processing event\\n // and unblocking Comm if event queue empty\\n var metadata = msg.metadata;\\n var comm_id = metadata.comm_id\\n var comm_status = window.PyViz.comm_status[comm_id];\\n if (comm_status.event_buffer.length) {\\n process_events(comm_status);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n } else {\\n comm_status.blocked = false;\\n }\\n comm_status.event_buffer = [];\\n if ((metadata.msg_type == \\\"Ready\\\") && metadata.content) {\\n console.log(\\\"Python callback returned following output:\\\", metadata.content);\\n } else if (metadata.msg_type == \\\"Error\\\") {\\n console.log(\\\"Python failed with the following traceback:\\\", metadata.traceback)\\n }\\n}\\n\\n// Initialize Comm\\nif ((window.PyViz == undefined) || (window.PyViz.comm_manager == undefined)) { return }\\ncomm = window.PyViz.comm_manager.get_client_comm(\\\"1001\\\", \\\"6836050d0b28443cb87fe9f6ce756247\\\", on_msg);\\nif (!comm) {\\n return\\n}\\n\\n// Initialize event queue and timeouts for Comm\\nvar comm_status = window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"];\\nif (comm_status === undefined) {\\n comm_status = {event_buffer: [], blocked: false, time: Date.now()}\\n window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"] = comm_status\\n}\\n\\n// Add current event to queue and process queue if not blocked\\nevent_name = cb_obj.event_name\\ndata['comm_id'] = \\\"6836050d0b28443cb87fe9f6ce756247\\\";\\ntimeout = comm_status.time + 20000;\\nif ((comm_status.blocked && (Date.now() < timeout))) {\\n comm_status.event_buffer.unshift([event_name, data]);\\n} else {\\n comm_status.event_buffer.unshift([event_name, data]);\\n setTimeout(function() { process_events(comm_status); }, 50);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n}\\n\"},\"id\":\"1004\",\"type\":\"CustomJS\"},{\"attributes\":{\"code\":\"data = {title: cb_obj['title']};\\n\\nfunction unique_events(events) {\\n // Processes the event queue ignoring duplicate events\\n // of the same type\\n var unique = [];\\n var unique_events = [];\\n for (var i=0; i<events.length; i++) {\\n var _tmpevent = events[i];\\n event = _tmpevent[0];\\n data = _tmpevent[1];\\n if (unique_events.indexOf(event)===-1) {\\n unique.unshift(data);\\n unique_events.push(event);\\n }\\n }\\n return unique;\\n}\\n\\nfunction process_events(comm_status) {\\n // Iterates over event queue and sends events via Comm\\n var events = unique_events(comm_status.event_buffer);\\n for (var i=0; i<events.length; i++) {\\n var data = events[i];\\n var comm = window.PyViz.comms[data[\\\"comm_id\\\"]];\\n comm.send(data);\\n }\\n comm_status.event_buffer = [];\\n}\\n\\nfunction on_msg(msg) {\\n // Receives acknowledgement from Python, processing event\\n // and unblocking Comm if event queue empty\\n var metadata = msg.metadata;\\n var comm_id = metadata.comm_id\\n var comm_status = window.PyViz.comm_status[comm_id];\\n if (comm_status.event_buffer.length) {\\n process_events(comm_status);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n } else {\\n comm_status.blocked = false;\\n }\\n comm_status.event_buffer = [];\\n if ((metadata.msg_type == \\\"Ready\\\") && metadata.content) {\\n console.log(\\\"Python callback returned following output:\\\", metadata.content);\\n } else if (metadata.msg_type == \\\"Error\\\") {\\n console.log(\\\"Python failed with the following traceback:\\\", metadata.traceback)\\n }\\n}\\n\\n// Initialize Comm\\nif ((window.PyViz == undefined) || (window.PyViz.comm_manager == undefined)) { return }\\ncomm = window.PyViz.comm_manager.get_client_comm(\\\"1001\\\", \\\"6836050d0b28443cb87fe9f6ce756247\\\", on_msg);\\nif (!comm) {\\n return\\n}\\n\\n// Initialize event queue and timeouts for Comm\\nvar comm_status = window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"];\\nif (comm_status === undefined) {\\n comm_status = {event_buffer: [], blocked: false, time: Date.now()}\\n window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"] = comm_status\\n}\\n\\n// Add current event to queue and process queue if not blocked\\nevent_name = cb_obj.event_name\\ndata['comm_id'] = \\\"6836050d0b28443cb87fe9f6ce756247\\\";\\ntimeout = comm_status.time + 20000;\\nif ((comm_status.blocked && (Date.now() < timeout))) {\\n comm_status.event_buffer.unshift([event_name, data]);\\n} else {\\n comm_status.event_buffer.unshift([event_name, data]);\\n setTimeout(function() { process_events(comm_status); }, 50);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n}\\n\"},\"id\":\"1005\",\"type\":\"CustomJS\"},{\"attributes\":{\"code\":\"data = {value: cb_obj['value']};\\n\\nfunction unique_events(events) {\\n // Processes the event queue ignoring duplicate events\\n // of the same type\\n var unique = [];\\n var unique_events = [];\\n for (var i=0; i<events.length; i++) {\\n var _tmpevent = events[i];\\n event = _tmpevent[0];\\n data = _tmpevent[1];\\n if (unique_events.indexOf(event)===-1) {\\n unique.unshift(data);\\n unique_events.push(event);\\n }\\n }\\n return unique;\\n}\\n\\nfunction process_events(comm_status) {\\n // Iterates over event queue and sends events via Comm\\n var events = unique_events(comm_status.event_buffer);\\n for (var i=0; i<events.length; i++) {\\n var data = events[i];\\n var comm = window.PyViz.comms[data[\\\"comm_id\\\"]];\\n comm.send(data);\\n }\\n comm_status.event_buffer = [];\\n}\\n\\nfunction on_msg(msg) {\\n // Receives acknowledgement from Python, processing event\\n // and unblocking Comm if event queue empty\\n var metadata = msg.metadata;\\n var comm_id = metadata.comm_id\\n var comm_status = window.PyViz.comm_status[comm_id];\\n if (comm_status.event_buffer.length) {\\n process_events(comm_status);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n } else {\\n comm_status.blocked = false;\\n }\\n comm_status.event_buffer = [];\\n if ((metadata.msg_type == \\\"Ready\\\") && metadata.content) {\\n console.log(\\\"Python callback returned following output:\\\", metadata.content);\\n } else if (metadata.msg_type == \\\"Error\\\") {\\n console.log(\\\"Python failed with the following traceback:\\\", metadata.traceback)\\n }\\n}\\n\\n// Initialize Comm\\nif ((window.PyViz == undefined) || (window.PyViz.comm_manager == undefined)) { return }\\ncomm = window.PyViz.comm_manager.get_client_comm(\\\"1001\\\", \\\"6836050d0b28443cb87fe9f6ce756247\\\", on_msg);\\nif (!comm) {\\n return\\n}\\n\\n// Initialize event queue and timeouts for Comm\\nvar comm_status = window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"];\\nif (comm_status === undefined) {\\n comm_status = {event_buffer: [], blocked: false, time: Date.now()}\\n window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"] = comm_status\\n}\\n\\n// Add current event to queue and process queue if not blocked\\nevent_name = cb_obj.event_name\\ndata['comm_id'] = \\\"6836050d0b28443cb87fe9f6ce756247\\\";\\ntimeout = comm_status.time + 20000;\\nif ((comm_status.blocked && (Date.now() < timeout))) {\\n comm_status.event_buffer.unshift([event_name, data]);\\n} else {\\n comm_status.event_buffer.unshift([event_name, data]);\\n setTimeout(function() { process_events(comm_status); }, 50);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n}\\n\"},\"id\":\"1006\",\"type\":\"CustomJS\"},{\"attributes\":{\"callback\":null,\"js_property_callbacks\":{\"change:disabled\":[{\"id\":\"1003\",\"type\":\"CustomJS\"}],\"change:height\":[{\"id\":\"1004\",\"type\":\"CustomJS\"}],\"change:title\":[{\"id\":\"1005\",\"type\":\"CustomJS\"}],\"change:value\":[{\"id\":\"1006\",\"type\":\"CustomJS\"}],\"change:width\":[{\"id\":\"1007\",\"type\":\"CustomJS\"}]},\"value\":\"0\"},\"id\":\"1002\",\"type\":\"TextInput\"},{\"attributes\":{\"code\":\"data = {width: cb_obj['width']};\\n\\nfunction unique_events(events) {\\n // Processes the event queue ignoring duplicate events\\n // of the same type\\n var unique = [];\\n var unique_events = [];\\n for (var i=0; i<events.length; i++) {\\n var _tmpevent = events[i];\\n event = _tmpevent[0];\\n data = _tmpevent[1];\\n if (unique_events.indexOf(event)===-1) {\\n unique.unshift(data);\\n unique_events.push(event);\\n }\\n }\\n return unique;\\n}\\n\\nfunction process_events(comm_status) {\\n // Iterates over event queue and sends events via Comm\\n var events = unique_events(comm_status.event_buffer);\\n for (var i=0; i<events.length; i++) {\\n var data = events[i];\\n var comm = window.PyViz.comms[data[\\\"comm_id\\\"]];\\n comm.send(data);\\n }\\n comm_status.event_buffer = [];\\n}\\n\\nfunction on_msg(msg) {\\n // Receives acknowledgement from Python, processing event\\n // and unblocking Comm if event queue empty\\n var metadata = msg.metadata;\\n var comm_id = metadata.comm_id\\n var comm_status = window.PyViz.comm_status[comm_id];\\n if (comm_status.event_buffer.length) {\\n process_events(comm_status);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n } else {\\n comm_status.blocked = false;\\n }\\n comm_status.event_buffer = [];\\n if ((metadata.msg_type == \\\"Ready\\\") && metadata.content) {\\n console.log(\\\"Python callback returned following output:\\\", metadata.content);\\n } else if (metadata.msg_type == \\\"Error\\\") {\\n console.log(\\\"Python failed with the following traceback:\\\", metadata.traceback)\\n }\\n}\\n\\n// Initialize Comm\\nif ((window.PyViz == undefined) || (window.PyViz.comm_manager == undefined)) { return }\\ncomm = window.PyViz.comm_manager.get_client_comm(\\\"1001\\\", \\\"6836050d0b28443cb87fe9f6ce756247\\\", on_msg);\\nif (!comm) {\\n return\\n}\\n\\n// Initialize event queue and timeouts for Comm\\nvar comm_status = window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"];\\nif (comm_status === undefined) {\\n comm_status = {event_buffer: [], blocked: false, time: Date.now()}\\n window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"] = comm_status\\n}\\n\\n// Add current event to queue and process queue if not blocked\\nevent_name = cb_obj.event_name\\ndata['comm_id'] = \\\"6836050d0b28443cb87fe9f6ce756247\\\";\\ntimeout = comm_status.time + 20000;\\nif ((comm_status.blocked && (Date.now() < timeout))) {\\n comm_status.event_buffer.unshift([event_name, data]);\\n} else {\\n comm_status.event_buffer.unshift([event_name, data]);\\n setTimeout(function() { process_events(comm_status); }, 50);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n}\\n\"},\"id\":\"1007\",\"type\":\"CustomJS\"},{\"attributes\":{\"code\":\"data = {disabled: cb_obj['disabled']};\\n\\nfunction unique_events(events) {\\n // Processes the event queue ignoring duplicate events\\n // of the same type\\n var unique = [];\\n var unique_events = [];\\n for (var i=0; i<events.length; i++) {\\n var _tmpevent = events[i];\\n event = _tmpevent[0];\\n data = _tmpevent[1];\\n if (unique_events.indexOf(event)===-1) {\\n unique.unshift(data);\\n unique_events.push(event);\\n }\\n }\\n return unique;\\n}\\n\\nfunction process_events(comm_status) {\\n // Iterates over event queue and sends events via Comm\\n var events = unique_events(comm_status.event_buffer);\\n for (var i=0; i<events.length; i++) {\\n var data = events[i];\\n var comm = window.PyViz.comms[data[\\\"comm_id\\\"]];\\n comm.send(data);\\n }\\n comm_status.event_buffer = [];\\n}\\n\\nfunction on_msg(msg) {\\n // Receives acknowledgement from Python, processing event\\n // and unblocking Comm if event queue empty\\n var metadata = msg.metadata;\\n var comm_id = metadata.comm_id\\n var comm_status = window.PyViz.comm_status[comm_id];\\n if (comm_status.event_buffer.length) {\\n process_events(comm_status);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n } else {\\n comm_status.blocked = false;\\n }\\n comm_status.event_buffer = [];\\n if ((metadata.msg_type == \\\"Ready\\\") && metadata.content) {\\n console.log(\\\"Python callback returned following output:\\\", metadata.content);\\n } else if (metadata.msg_type == \\\"Error\\\") {\\n console.log(\\\"Python failed with the following traceback:\\\", metadata.traceback)\\n }\\n}\\n\\n// Initialize Comm\\nif ((window.PyViz == undefined) || (window.PyViz.comm_manager == undefined)) { return }\\ncomm = window.PyViz.comm_manager.get_client_comm(\\\"1001\\\", \\\"6836050d0b28443cb87fe9f6ce756247\\\", on_msg);\\nif (!comm) {\\n return\\n}\\n\\n// Initialize event queue and timeouts for Comm\\nvar comm_status = window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"];\\nif (comm_status === undefined) {\\n comm_status = {event_buffer: [], blocked: false, time: Date.now()}\\n window.PyViz.comm_status[\\\"6836050d0b28443cb87fe9f6ce756247\\\"] = comm_status\\n}\\n\\n// Add current event to queue and process queue if not blocked\\nevent_name = cb_obj.event_name\\ndata['comm_id'] = \\\"6836050d0b28443cb87fe9f6ce756247\\\";\\ntimeout = comm_status.time + 20000;\\nif ((comm_status.blocked && (Date.now() < timeout))) {\\n comm_status.event_buffer.unshift([event_name, data]);\\n} else {\\n comm_status.event_buffer.unshift([event_name, data]);\\n setTimeout(function() { process_events(comm_status); }, 50);\\n comm_status.blocked = true;\\n comm_status.time = Date.now()+50;\\n}\\n\"},\"id\":\"1003\",\"type\":\"CustomJS\"}],\"root_ids\":[\"1001\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.3\"}};\n",
" var render_items = [{\"docid\":\"0f4ca252-fdf3-49c2-8e56-0999ea2584fe\",\"roots\":{\"1001\":\"32287453-0d1e-4891-b7c8-23691629d721\"}}];\n",
" root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
"\n",
" }\n",
" if (root.Bokeh !== undefined) {\n",
" embed_document(root);\n",
" } else {\n",
" var attempts = 0;\n",
" var timer = setInterval(function(root) {\n",
" if (root.Bokeh !== undefined) {\n",
" embed_document(root);\n",
" clearInterval(timer);\n",
" }\n",
" attempts++;\n",
" if (attempts > 100) {\n",
" console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
" clearInterval(timer);\n",
" }\n",
" }, 10, root)\n",
" }\n",
"})(window);"
],
"application/vnd.holoviews_exec.v0+json": "",
"text/html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" <div class=\"bk-root\" id=\"32287453-0d1e-4891-b7c8-23691629d721\" data-root-id=\"1001\"></div>\n"
],
"text/plain": [
"BoundedIntInput(end=10, start=1, type=<class 'int'>, value=0)"
]
},
"execution_count": 1,
"metadata": {
"application/vnd.holoviews_exec.v0+json": {
"id": "1001"
}
},
"output_type": "execute_result"
}
],
"source": [
"import ast\n",
"\n",
"import param\n",
"from panel import widgets\n",
"from panel.util import as_unicode\n",
" \n",
"class IntInput(widgets.LiteralInput):\n",
"\n",
" type = int\n",
" value = param.Integer(default=None)\n",
" _widget_type = widgets._BkTextInput\n",
" \n",
" def _validate(self, event):\n",
" if self.type is None: return\n",
" new = self.value\n",
" if new is not None and not isinstance(new, self.type):\n",
" if event:\n",
" self.value = event.old\n",
" raise ValueError('IntInput expected %s type but value %s '\n",
" 'is of type %s.' %\n",
" (self.type.__name__, new, type(new).__name__))\n",
" \n",
" def _process_property_change(self, msg):\n",
" msg = super(widgets.LiteralInput, self)._process_property_change(msg)\n",
" new_state = ''\n",
" if 'value' in msg:\n",
" value = msg.pop('value')\n",
" try:\n",
" value = ast.literal_eval(value)\n",
" except:\n",
" new_state = ' (invalid)'\n",
" value = self.value\n",
" else:\n",
" if self.type and not isinstance(value, self.type):\n",
" new_state = ' (wrong type)'\n",
" value = self.value\n",
" msg['value'] = value\n",
" msg['name'] = msg.get('title', self.name).replace(self._state, '') + new_state\n",
" self._state = new_state\n",
" self.param.trigger('name')\n",
" return msg\n",
"\n",
" def _process_param_change(self, msg):\n",
" msg = super(widgets.LiteralInput, self)._process_param_change(msg)\n",
" msg.pop('type', None)\n",
" if 'value' in msg:\n",
" msg['value'] = '' if msg['value'] is None else as_unicode(msg['value'])\n",
" msg['title'] = self.name\n",
" return msg\n",
" \n",
"class BoundedIntInput(IntInput):\n",
" \n",
" start = param.Integer(default=None)\n",
" end = param.Integer(default=None)\n",
" \n",
" def _validate(self, event):\n",
" if self.type is None: return\n",
" new = self.value\n",
" if new is not None and not isinstance(new, self.type):\n",
" if event:\n",
" self.value = event.old\n",
" raise ValueError('BoundedIntInput expected %s type but value %s '\n",
" 'is of type %s.' %\n",
" (self.type.__name__, new, type(new).__name__))\n",
" \n",
" def _process_property_change(self, msg):\n",
" msg = super(widgets.LiteralInput, self)._process_property_change(msg)\n",
" new_state = ''\n",
" if 'value' in msg:\n",
" value = msg.pop('value')\n",
" try:\n",
" value = ast.literal_eval(value)\n",
" except:\n",
" new_state = ' (invalid)'\n",
" value = self.value\n",
" else:\n",
" print('value: ', value)\n",
" if self.type:\n",
" if not isinstance(value, self.type):\n",
" new_state = ' (wrong type)'\n",
" value = self.value\n",
" elif (self.start is not None and value < self.start) or \\\n",
" (self.end is not None and value >= self.end):\n",
" new_state = ' (out of bounds)'\n",
" value = self.value\n",
" msg['value'] = value\n",
" msg['name'] = msg.get('title', self.name).replace(self._state, '') + new_state\n",
" self._state = new_state\n",
" self.param.trigger('name')\n",
" return msg\n",
"\n",
" def _process_param_change(self, msg):\n",
" msg = super(widgets.LiteralInput, self)._process_param_change(msg)\n",
" msg.pop('type', None)\n",
" msg.pop('start', None)\n",
" msg.pop('end', None)\n",
" if 'value' in msg:\n",
" msg['value'] = '' if msg['value'] is None else as_unicode(msg['value'])\n",
" msg['title'] = self.name\n",
" return msg\n",
" \n",
"w = BoundedIntInput(start=1, end=10, value=0)\n",
"w"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment