Skip to content

Commit 33bbe9e

Browse files
BibMartinBibMartinConengmo
authored
Click to copy latlng to clipboard (#1530)
* MJ: Add ClickForLatLng class to save LatLng to clipboard * MJ: Add example notebook to show MouseClick events (ClickForMarker etc) * MJ: Fix typo clipboads -> clipboard * Try to fix notebook tests * use newest branca Co-authored-by: BibMartin <{ID}+{username}@users.noreply.github.com> Co-authored-by: Frank <33519926+Conengmo@users.noreply.github.com>
1 parent be77c42 commit 33bbe9e

2 files changed

Lines changed: 425 additions & 0 deletions

File tree

examples/ClickEvents.ipynb

Lines changed: 390 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,390 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"id": "6b3009b4",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"import folium\n",
11+
"from folium.features import ClickForLatLng, ClickForMarker, LatLngPopup"
12+
]
13+
},
14+
{
15+
"cell_type": "markdown",
16+
"id": "df990137",
17+
"metadata": {},
18+
"source": [
19+
"#### `ClickForMarker` Lets you create markers on each click"
20+
]
21+
},
22+
{
23+
"cell_type": "code",
24+
"execution_count": 2,
25+
"id": "55e317b4",
26+
"metadata": {},
27+
"outputs": [
28+
{
29+
"data": {
30+
"text/html": [
31+
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
32+
"&lt;head&gt; \n",
33+
" &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
34+
" \n",
35+
" &lt;script&gt;\n",
36+
" L_NO_TOUCH = false;\n",
37+
" L_DISABLE_3D = false;\n",
38+
" &lt;/script&gt;\n",
39+
" \n",
40+
" &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
41+
" &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
42+
" &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
43+
" &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
44+
" &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
45+
" &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
46+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
47+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
48+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
49+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
50+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
51+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
52+
" \n",
53+
" &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
54+
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
55+
" &lt;style&gt;\n",
56+
" #map_583b3aa81db6e18d7773529ca6d9d3b1 {\n",
57+
" position: relative;\n",
58+
" width: 100.0%;\n",
59+
" height: 100.0%;\n",
60+
" left: 0.0%;\n",
61+
" top: 0.0%;\n",
62+
" }\n",
63+
" &lt;/style&gt;\n",
64+
" \n",
65+
"&lt;/head&gt;\n",
66+
"&lt;body&gt; \n",
67+
" \n",
68+
" &lt;div class=&quot;folium-map&quot; id=&quot;map_583b3aa81db6e18d7773529ca6d9d3b1&quot; &gt;&lt;/div&gt;\n",
69+
" \n",
70+
"&lt;/body&gt;\n",
71+
"&lt;script&gt; \n",
72+
" \n",
73+
" var map_583b3aa81db6e18d7773529ca6d9d3b1 = L.map(\n",
74+
" &quot;map_583b3aa81db6e18d7773529ca6d9d3b1&quot;,\n",
75+
" {\n",
76+
" center: [0, 0],\n",
77+
" crs: L.CRS.EPSG3857,\n",
78+
" zoom: 1,\n",
79+
" zoomControl: true,\n",
80+
" preferCanvas: false,\n",
81+
" }\n",
82+
" );\n",
83+
"\n",
84+
" \n",
85+
"\n",
86+
" \n",
87+
" \n",
88+
" var tile_layer_59ba76f73da00a2c21007e038e7e0cd7 = L.tileLayer(\n",
89+
" &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
90+
" {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
91+
" ).addTo(map_583b3aa81db6e18d7773529ca6d9d3b1);\n",
92+
" \n",
93+
" \n",
94+
" function newMarker(e){\n",
95+
" var new_mark = L.marker().setLatLng(e.latlng).addTo(map_583b3aa81db6e18d7773529ca6d9d3b1);\n",
96+
" new_mark.dragging.enable();\n",
97+
" new_mark.on(&#x27;dblclick&#x27;, function(e){ map_583b3aa81db6e18d7773529ca6d9d3b1.removeLayer(e.target)})\n",
98+
" var lat = e.latlng.lat.toFixed(4),\n",
99+
" lng = e.latlng.lng.toFixed(4);\n",
100+
" new_mark.bindPopup(&quot;Latitude: &quot; + lat + &quot;&lt;br&gt;Longitude: &quot; + lng );\n",
101+
" };\n",
102+
" map_583b3aa81db6e18d7773529ca6d9d3b1.on(&#x27;click&#x27;, newMarker);\n",
103+
" \n",
104+
"&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
105+
],
106+
"text/plain": [
107+
"<folium.folium.Map at 0x7faa57aed190>"
108+
]
109+
},
110+
"execution_count": 2,
111+
"metadata": {},
112+
"output_type": "execute_result"
113+
}
114+
],
115+
"source": [
116+
"folium.Map().add_child(ClickForMarker())"
117+
]
118+
},
119+
{
120+
"cell_type": "markdown",
121+
"id": "ad4a4cfc",
122+
"metadata": {},
123+
"source": [
124+
"*Click on the map to see the effects*"
125+
]
126+
},
127+
{
128+
"cell_type": "markdown",
129+
"id": "76e5e9b9",
130+
"metadata": {},
131+
"source": [
132+
"#### `LatLngPopup` lets you create a simple popup at each click"
133+
]
134+
},
135+
{
136+
"cell_type": "code",
137+
"execution_count": 3,
138+
"id": "205a9f4a",
139+
"metadata": {},
140+
"outputs": [
141+
{
142+
"data": {
143+
"text/html": [
144+
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
145+
"&lt;head&gt; \n",
146+
" &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
147+
" \n",
148+
" &lt;script&gt;\n",
149+
" L_NO_TOUCH = false;\n",
150+
" L_DISABLE_3D = false;\n",
151+
" &lt;/script&gt;\n",
152+
" \n",
153+
" &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
154+
" &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
155+
" &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
156+
" &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
157+
" &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
158+
" &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
159+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
160+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
161+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
162+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
163+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
164+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
165+
" \n",
166+
" &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
167+
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
168+
" &lt;style&gt;\n",
169+
" #map_d8fecc8f80dcaf8ee70b498e470ec6b1 {\n",
170+
" position: relative;\n",
171+
" width: 100.0%;\n",
172+
" height: 100.0%;\n",
173+
" left: 0.0%;\n",
174+
" top: 0.0%;\n",
175+
" }\n",
176+
" &lt;/style&gt;\n",
177+
" \n",
178+
"&lt;/head&gt;\n",
179+
"&lt;body&gt; \n",
180+
" \n",
181+
" &lt;div class=&quot;folium-map&quot; id=&quot;map_d8fecc8f80dcaf8ee70b498e470ec6b1&quot; &gt;&lt;/div&gt;\n",
182+
" \n",
183+
"&lt;/body&gt;\n",
184+
"&lt;script&gt; \n",
185+
" \n",
186+
" var map_d8fecc8f80dcaf8ee70b498e470ec6b1 = L.map(\n",
187+
" &quot;map_d8fecc8f80dcaf8ee70b498e470ec6b1&quot;,\n",
188+
" {\n",
189+
" center: [0, 0],\n",
190+
" crs: L.CRS.EPSG3857,\n",
191+
" zoom: 1,\n",
192+
" zoomControl: true,\n",
193+
" preferCanvas: false,\n",
194+
" }\n",
195+
" );\n",
196+
"\n",
197+
" \n",
198+
"\n",
199+
" \n",
200+
" \n",
201+
" var tile_layer_1e860e1c91d90d7ca5d8f947ffddf194 = L.tileLayer(\n",
202+
" &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
203+
" {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
204+
" ).addTo(map_d8fecc8f80dcaf8ee70b498e470ec6b1);\n",
205+
" \n",
206+
" \n",
207+
" var lat_lng_popup_c7a5c448e928d9ae00d8d31cfd76cacc = L.popup();\n",
208+
" function latLngPop(e) {\n",
209+
" lat_lng_popup_c7a5c448e928d9ae00d8d31cfd76cacc\n",
210+
" .setLatLng(e.latlng)\n",
211+
" .setContent(&quot;Latitude: &quot; + e.latlng.lat.toFixed(4) +\n",
212+
" &quot;&lt;br&gt;Longitude: &quot; + e.latlng.lng.toFixed(4))\n",
213+
" .openOn(map_d8fecc8f80dcaf8ee70b498e470ec6b1);\n",
214+
" }\n",
215+
" map_d8fecc8f80dcaf8ee70b498e470ec6b1.on(&#x27;click&#x27;, latLngPop);\n",
216+
" \n",
217+
"&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
218+
],
219+
"text/plain": [
220+
"<folium.folium.Map at 0x7faa57afc4d0>"
221+
]
222+
},
223+
"execution_count": 3,
224+
"metadata": {},
225+
"output_type": "execute_result"
226+
}
227+
],
228+
"source": [
229+
"folium.Map().add_child(LatLngPopup())"
230+
]
231+
},
232+
{
233+
"cell_type": "markdown",
234+
"id": "c7ed398a",
235+
"metadata": {},
236+
"source": [
237+
"*Click on the map to see the effects*"
238+
]
239+
},
240+
{
241+
"cell_type": "markdown",
242+
"id": "74717849",
243+
"metadata": {},
244+
"source": [
245+
"#### `ClickForLatLng` lets you copy coordinates to your browser clipboard"
246+
]
247+
},
248+
{
249+
"cell_type": "code",
250+
"execution_count": 4,
251+
"id": "5c564b6b",
252+
"metadata": {},
253+
"outputs": [
254+
{
255+
"data": {
256+
"text/html": [
257+
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
258+
"&lt;head&gt; \n",
259+
" &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
260+
" \n",
261+
" &lt;script&gt;\n",
262+
" L_NO_TOUCH = false;\n",
263+
" L_DISABLE_3D = false;\n",
264+
" &lt;/script&gt;\n",
265+
" \n",
266+
" &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
267+
" &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
268+
" &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
269+
" &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
270+
" &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
271+
" &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
272+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
273+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
274+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
275+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
276+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
277+
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
278+
" \n",
279+
" &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
280+
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
281+
" &lt;style&gt;\n",
282+
" #map_34a8ba0c0e0db19a74c051f904ffde6f {\n",
283+
" position: relative;\n",
284+
" width: 100.0%;\n",
285+
" height: 100.0%;\n",
286+
" left: 0.0%;\n",
287+
" top: 0.0%;\n",
288+
" }\n",
289+
" &lt;/style&gt;\n",
290+
" \n",
291+
"&lt;/head&gt;\n",
292+
"&lt;body&gt; \n",
293+
" \n",
294+
" &lt;div class=&quot;folium-map&quot; id=&quot;map_34a8ba0c0e0db19a74c051f904ffde6f&quot; &gt;&lt;/div&gt;\n",
295+
" \n",
296+
"&lt;/body&gt;\n",
297+
"&lt;script&gt; \n",
298+
" \n",
299+
" var map_34a8ba0c0e0db19a74c051f904ffde6f = L.map(\n",
300+
" &quot;map_34a8ba0c0e0db19a74c051f904ffde6f&quot;,\n",
301+
" {\n",
302+
" center: [0, 0],\n",
303+
" crs: L.CRS.EPSG3857,\n",
304+
" zoom: 1,\n",
305+
" zoomControl: true,\n",
306+
" preferCanvas: false,\n",
307+
" }\n",
308+
" );\n",
309+
"\n",
310+
" \n",
311+
"\n",
312+
" \n",
313+
" \n",
314+
" var tile_layer_6e1242652bc4206aac40536c70967bf5 = L.tileLayer(\n",
315+
" &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
316+
" {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
317+
" ).addTo(map_34a8ba0c0e0db19a74c051f904ffde6f);\n",
318+
" \n",
319+
" \n",
320+
" function getLatLng(e){\n",
321+
" var lat = e.latlng.lat.toFixed(6),\n",
322+
" lng = e.latlng.lng.toFixed(6);\n",
323+
" var txt = &quot;[&quot; + lat + &quot;,&quot; + lng + &quot;]&quot;;\n",
324+
" navigator.clipboard.writeText(txt);\n",
325+
" alert(&quot;Copied to clipboard : \\n &quot; + txt);\n",
326+
" };\n",
327+
" map_34a8ba0c0e0db19a74c051f904ffde6f.on(&#x27;click&#x27;, getLatLng);\n",
328+
" \n",
329+
"&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
330+
],
331+
"text/plain": [
332+
"<folium.folium.Map at 0x7faa57af9d10>"
333+
]
334+
},
335+
"execution_count": 4,
336+
"metadata": {},
337+
"output_type": "execute_result"
338+
}
339+
],
340+
"source": [
341+
"folium.Map().add_child(ClickForLatLng(format_str='\"[\" + lat + \",\" + lng + \"]\"'))"
342+
]
343+
},
344+
{
345+
"cell_type": "markdown",
346+
"id": "8f2809bd",
347+
"metadata": {},
348+
"source": [
349+
"*Click on the map to see the effects*"
350+
]
351+
},
352+
{
353+
"cell_type": "markdown",
354+
"id": "f90c1e9b",
355+
"metadata": {},
356+
"source": [
357+
"If you want to collect back the information in python, you may (install and) import the [clipboard](https://github.com/terryyin/clipboard) library :\n",
358+
"\n",
359+
"```python\n",
360+
"> import clipboard\n",
361+
"> clipboard.paste()\n",
362+
"```\n",
363+
"```\n",
364+
"[-43.580391,-123.824467]\n",
365+
"```"
366+
]
367+
}
368+
],
369+
"metadata": {
370+
"kernelspec": {
371+
"display_name": "Python 3",
372+
"language": "python",
373+
"name": "python3"
374+
},
375+
"language_info": {
376+
"codemirror_mode": {
377+
"name": "ipython",
378+
"version": 3
379+
},
380+
"file_extension": ".py",
381+
"mimetype": "text/x-python",
382+
"name": "python",
383+
"nbconvert_exporter": "python",
384+
"pygments_lexer": "ipython3",
385+
"version": "3.7.10"
386+
}
387+
},
388+
"nbformat": 4,
389+
"nbformat_minor": 5
390+
}

0 commit comments

Comments
 (0)