Created
January 7, 2019 20:06
-
-
Save lebedov/adfc0d7eac5983a7f7ac2af362660a0e to your computer and use it in GitHub Desktop.
Panel integer input widget with bounds
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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