-
Notifications
You must be signed in to change notification settings - Fork 5
/
Jupyter_Notebook.md
9314 lines (6862 loc) · 531 KB
/
Jupyter_Notebook.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/usr/bin/env bash
url=https://ipywidgets.readthedocs.io/en/latest/tutorials/index.html
url=https://ipywidgets.readthedocs.io/en/latest/how-to/index.html
url=https://ipywidgets.readthedocs.io/en/latest/explanation/index.html
url=https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Low%20Level.html
url=https://ipywidgets.readthedocs.io/en/latest/reference/index.html
url=https://ipywidgets.readthedocs.io/en/latest/reference/jupyter-widgets.html
url=https://ipywidgets.readthedocs.io/en/latest/py-modindex.html
url=https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Custom.html
url=https://ipywidgets.readthedocs.io/en/latest/user_install.html
curl -L "$url" | /od/html2md.ts utf8
#echo "Paste HTML here and close this file to convert it ..." | subl - | /od/html2md.ts
exit
==============================================================================
/0. Jupyter Notebook
======================
1. https://jupyter.org/try
2. https://github.com/jupyter-widgets/ipywidgets
3. https://ipywidgets.readthedocs.io/en/latest/user_install.html
4. Interactive Widgets https://ipywidgets.readthedocs.io/en/latest/_static/lab/index.html
Jupyter is a large umbrella project that covers many different software offerings and tools, including the popular Jupyter Notebook and JupyterLab web-based notebook authoring and editing applications. The Jupyter project and its subprojects all center around providing tools (and standards) for interactive computing with computational notebooks.
Jupyter 一个基于 Python + Web 技术栈的可计算的记事本,程序化的工作台,良好地支持 Markdown
写作与脚本编程。Web 配合 SVG 绘画技术,可以实现界面精美的 Web Application。并且编写文档也
非常流畅,可以展示文档中丰富的图形,并易于保存、节省储存空间,开源格式也更便于分发。
Jupyter 整个应用构架基于 Web Server + Client 模型,双方通信使用 ZeroMQ 高速并发消息通信框架。
通信构架称之为 Comm framework,Web 服务器端与客户端通过 Websocket 进行 JSON 数据交流,
其消息通信定义为 Widget messaging protocol。
官方 [Low Level Widget Explanation] 文档中作了介绍:
![](../pictures/jupyter_zmq_websocket.svg)
<!-- ![](https://ipywidgets.readthedocs.io/en/latest/_images/transport.svg) -->
[ZeroMQ](https://zeromq.org/) (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems.
配合 Jupyter Widgets 控件,可以开发 Web 交互应用,就像 Mathematica Notebooks 那样,
重复编辑单元代码,并重新求值,让你的笔记动起来。集成的 MathJax 框架,可以非常方便地渲染数学公式。
使用 Python pip 工具安装依赖:
```sh
pip install jupyterlab notebook
pip install ipywidgets
# if you are using the classic notebook
jupyter notebook
# if you are using JupyterLab
jupyter lab
```
或者直接在 Jupyter Notebook 中安装,其中的 % 表示当前内容作为 shell 脚本运行,这种操作在
VIM 编辑器中经常用到:
```py
# Imports for JupyterLite
%pip install -q ipywidgets
```
比如,Notebook 中输入以下 Python 代码,按下 Shift + Enter 进行求值,笔记中输出结果为
一个显示 70% 状态的进度条,这部分图形是 Widgets 控件,不会在笔记源文件的 outputs 字段中出现:
```sh
import ipywidgets as widgets
widgets.IntSlider(
value=7,
min=0,
max=10,
step=1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='d'
)
widgets.HBox([widgets.Label(value="The $m$ in $E=mc^2$:"), widgets.FloatSlider()])
```
取而代之的是 plain text 字符串:
```sh
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "bd8a7e0be5404032b2012f4ddcdcd38b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"FloatProgress(value=7.0, bar_style='info', description='Loading:', max=10.0, style=ProgressStyle(bar_color='#f…"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
```
笔记系统运行时会生成缓存文件夹 .ipynb_checkpoints,用户保存临时文件,比如文件修改检查点记录。
还有程序运行目录下生成 .virtual_documents 虚拟文档文件夹。
Jupyter 可以使用 Python 虚拟环境,以下命令罗列当前可用的虚拟环境:
```sh
$ jupyter kernelspec list
Available kernels:
python3 C:\Python310\tutorial-env\share\jupyter\kernels\python3
# Add Virtual Environment to Jupyter Notebook
# Jupyter Notebook makes sure that the IPython kernel is available.
# Manually add a kernel with a different version of Python or a virtual environment.
# Install ipykernel which provides the IPython kernel for Jupyter:
pip install --user ipykernel
# Next you can add your virtual environment to Jupyter by typing:
python -m ipykernel install --user --name=myenv
# jupyter kernelspec uninstall myenv
```
Jupyter Notebook 文档使用 JSON 数据格式保存,扩展名为 ipynb,使用以下命令可以转换为 MD:
jupyter nbconvert --to markdown some.ipynb
所有代码块和输出内容都按 Markdown 格式保存,图像资源等以连接、或图像标签形式引用。资源文件将
保存到 `some_files` 这样的目录中,其中 `_files` 是固定格式的后缀。源文档内容格式如下,
其中 cells 字段内保存笔记本中所有单元的相关信息,比如什么控制台、输出什么内容:
```json
{
"cells": [ ... ],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
```
以下是其中一个 Python 脚本单元的内容格式参考,可以看到 cell_type 指示这是代码单元,outputs
字段指示相应的 source 代码的输出内容:
```json
{
"cell_type": "code",
"execution_count": 1,
"id": "e4873dcc-fb1c-413d-88f4-34884837e5e2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"# Imports for JupyterLite\n",
"%pip install -q ipywidgets"
]
},
```
ipywidgets 控件是互动编程模块,通过 Jupyter 内置的控件提供的交互功能来实现 GUI 编程。
例如,以下创建出滑动条,使用 w 变量引用这个 UI 控件,然后使用 display() 函数显示出来,
这就显示了两个 UI 滑动条,但是它们共用同一个数据(会产生联动):
```py
from ipywidgets import *
from IPython.display import display
w = IntSlider()
display(w, w)
```
Jupyter 还提供了前端与后端的事件链接,前端 JavaScript 脚本可以和后端 Python 进行通信。
框架定义了 jslink() 和 jsdlink() 分别用于前端的事件链接,和前后端的链接。同时,还有一对
相似命名的就去,`link` 和 `dlink` 用于属性的链接,这种能力在新的 JavaScript 规范中支持,
称为属性代理,Proxy 对象代理,是响应式应用的基本原理。
Jupyter 前端在执行脚本时,就会创建一条消息,使用一个唯一的 GUID 编码作为消息的识别号,
通过由 Web 前端程序通过 websocket 发送给后端(Kernel)。后端接收到消息并执行相应的
脚本,并将脚本运行结果返回给前端渲染出图形界面:
┌──────────┐
│ │
│ │
│ Kernel │
│ │
│ │
└──A────│──┘
│ │ Kernel (Websocket Server)
----│----│-----------------------------------------------------------
│ │ FrontEnd (User Interface)
┌──│────V──┐ ┌─────────────┐ ┌────────────┐
│ │ │ │───────>│ WidgetView │
│ │ │ │ └────────────┘
│ NoteBook │─────>│ WidgetModel │ ......
│ │ │ │ ┌────────────┐
│ │ │ │───────>│ WidgetView │
└──────────┘ └─────────────┘ └────────────┘
@startuml
NoteBook -> WidgetModel
@enduml
因为整个构架的通信模式是同构的,comm API is a symmetric, asynchronous。所有服务器中也
可以根据 GUID 消息保留某个 UI 控件的状态,并且通过 API 让控件在前后端同步状态信息。这也
使用 MVC 架构的好处,Models 与 Views 解耦,视图如何渲染由 Views 自己解决,数据模型负责
实现数据逻辑,去过数据驱动视图。Web 视图(DOM)交由 JavaScript 进行处理。也就是说,UI 控件
结合 HTML 标签提供 JavaScript 脚本交互功能的实现。控件主要分为 `DOMWidget` 和 `ValueWidget`
两类,基类是 `Widget`。官方文档提供了 Building a Custom Widget - Email widget 教程,
指导如何实现一个电子邮件地址输入控件(第一眼看到这标题以为是开发一个邮件接收工具)。
另外,对于交互控制,官方提供了 Interactive Widgets 教程,直接使用 Nodebook 做演示。
Jupyter Widgets 本身是基于 Web 的 UI 构架,所以也可以直接在网页中使用它来开发交互应用。
参考官方文档: Embedding Jupyter Widgets。
提示:Jupyter 应用开发基于 JavaScript 和 Python 脚本语言,同时又基于 HTML/CSS 等页面技术,
以及 Websocket 通信协议的多技术栈集成应用。
/0. DrawSVG
============
DrawSVG 也设计成 Jupyter 的交互程序,但是支持不好,错误频发。DrawSVG 希望通过实现 Python
装饰器来完成一些交互功能的实现,通过使用 **@widget.set_draw_frame** 这样的装饰器,以控制
动画运行逐帧绘制成动画。这些功能涉及 Jupyter 控件的开发,可以参考 ipywidgets 教程文档。
Python error:
AttributeError: module 'ipywidgets.widgets.widget' has no attribute 'set_draw_frame'
JavaScript error:
Error: No version of module drawingview is registered
DrawSVG 代码参考 Asynchronous Frame-based Animation in Jupyter
https://pypi.org/project/drawsvg/
```py
# Jupyter cell 1:
import drawsvg as draw
from drawsvg.widgets import AsyncAnimation
widget = AsyncAnimation(fps=10)
widget
# [Animation is displayed here (click to pause)]
# Jupyter cell 2:
global_variable = 'a'
@widget.set_draw_frame # Animation above is automatically updated
def draw_frame(secs=0):
# Draw something...
d = draw.Drawing(100, 40)
d.append(draw.Text(global_variable, 20, 0, 30))
d.append(draw.Text('{:0.1f}'.format(secs), 20, 30, 30))
return d
# Jupyter cell 3:
global_variable = 'b' # Animation above now displays 'b'
```
以下通过 Python 脚本实现 SVG 逐帧控制的动画倒是正常,带有交互功能的基本上不能运行。
些脚本运行过程中,会为每帧生成一个 SVG 图形,通过 Python 脚本设置图形的状态,然后
逐个图形展示就成了动画效果:
```py
# Frame-by-Frame Animation
import drawsvg as draw
# Draw a frame of the animation
def draw_frame(t):
d = draw.Drawing(2, 6.05, origin=(-1, -5))
d.set_render_size(h=300)
d.append(draw.Rectangle(-2, -6, 4, 8, fill='white'))
d.append(draw.Rectangle(-1, 1, 2, 0.05, fill='brown'))
t = (t + 1) % 2 - 1
y = t**2 * 4 - 4
d.append(draw.Circle(0, y, 1, fill='lime'))
return d
with draw.frame_animate_jupyter(draw_frame, delay=0.05) as anim:
# Or:
#with draw.frame_animate_video('example6.gif', draw_frame, duration=0.05) as anim:
# Or:
#with draw.frame_animate_spritesheet('example6.png', draw_frame, row_length=10) as anim:
# Add each frame to the animation
for i in range(20):
anim.draw_frame(i/10)
for i in range(20):
anim.draw_frame(i/10)
for i in range(20):
anim.draw_frame(i/10)
```
以下是带有 SVG 原生回放控件的示范,SVG-native animation with playback controls。
此回放功能由 DrawSVG 开发者在 SVG 文档内集成相应的 JavaScript 代码控制动画回放。根据
生成的 SVG 文档,可以看到有一组 scrub 图形,即各个播放按钮和进度条。JavaScript 脚本代码
硬编码在 SVG_JS_CONTENT 变量中。受浏览器安全约束,SVG 动画脚本功能需要通过 HTML iframe,
或者将 SVG 标签内嵌到 HTML 上才能执行,不能通过图像等标签引用。
DrawSVG 有个明显的问题,即它只做单向的 SVG 文档生成,不能从 SVG 文档读取及加载相应的图形。
在其内部转换 PNG 等图形格式的转换依赖 [CairoSVG](https://cairosvg.org/) 模块,
此模块支持 PDF 等矢量格式。
```sh
$ cairosvg image.svg -o image.png
$ python3
>>> import cairosvg
>>> cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')
```
每次调用 add_key_frame() 方法,SVG 文档中都会产生一个新的 `<animate>` 动画标签,
animate_text_sequence() 方法会成对添加 `<text>` 和 `<anmate>`,
DrawSVG 模块会大量使用动画标签去支持每个动画帧,所以复杂的动画文件会非常大。
```py
import drawsvg as draw
d = draw.Drawing(400, 200, origin='center',
animation_config=draw.types.SyncedAnimationConfig(
# Animation configuration
duration=8, # Seconds
show_playback_progress=True,
show_playback_controls=True))
d.append(draw.Rectangle(-200, -100, 400, 200, fill='#eee')) # Background
d.append(draw.Circle(0, 0, 40, fill='green')) # Center circle
# Animation
circle = draw.Circle(0, 0, 0, fill='gray') # Moving circle
circle.add_key_frame(0, cx=-100, cy=0, r=0)
circle.add_key_frame(2, cx=0, cy=-100, r=40)
circle.add_key_frame(4, cx=100, cy=0, r=0)
circle.add_key_frame(6, cx=0, cy=100, r=40)
circle.add_key_frame(8, cx=-100, cy=0, r=0)
d.append(circle)
r = draw.Rectangle(0, 0, 0, 0, fill='silver') # Moving square
r.add_key_frame(0, x=-100, y=0, width=0, height=0)
r.add_key_frame(2, x=0-20, y=-100-20, width=40, height=40)
r.add_key_frame(4, x=100, y=0, width=0, height=0)
r.add_key_frame(6, x=0-20, y=100-20, width=40, height=40)
r.add_key_frame(8, x=-100, y=0, width=0, height=0)
d.append(r)
# Changing text
draw.native_animation.animate_text_sequence(
d,
[0, 2, 4, 6],
['0', '1', '2', '3'],
30, 0, 1, fill='yellow', center=True)
# Save as a standalone animated SVG or HTML
d.save_svg('playback-controls.svg')
d.save_html('playback-controls.html')
# Display in Jupyter notebook
#d.display_image() # Display SVG as an image (will not be interactive)
#d.display_iframe() # Display as interactive SVG (alternative)
#d.as_gif('orbit.gif', fps=10) # Render as a GIF image, optionally save to file
#d.as_mp4('orbig.mp4', fps=60, verbose=True) # Render as an MP4 video, optionally save to file
#d.as_spritesheet('orbit-spritesheet.png', row_length=10, fps=3) # Render as a spritesheet
d.display_inline() # Display as interactive SVG
```
/1. TOC
========
Jupyter Widgets 8.1.2 documentation
* [GitHub](https://github.com/jupyter-widgets/ipywidgets "GitHub")
* [PyPI](https://pypi.org/project/ipywidgets "PyPI")
* [Tutorials](https://ipywidgets.readthedocs.io/en/latest/tutorials/index.html)
* [How-to Guides](https://ipywidgets.readthedocs.io/en/latest/how-to/index.html)
* [Explanation](https://ipywidgets.readthedocs.io/en/latest/explanation/index.html)
* [Reference](https://ipywidgets.readthedocs.io/en/latest/reference/index.html)
nbconvert: Convert Notebooks to other formats
https://nbconvert.readthedocs.io/en/latest/index.html
## Tutorials
For Custom Widget Authors
* [Building a Custom Widget - Email widget](https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Custom.html)
> [!TIP]
> For a more in-depth tutorial, see the [dedicated GitHub repository](https://github.com/jupyter-widgets/tutorial).
[Edit on GitHub](https://github.com/jupyter-widgets/ipywidgets/edit/main/docs/tutorials/index.md)
[Show Source](https://ipywidgets.readthedocs.io/en/latest/_sources/tutorials/index.md.txt)
## How-to Guides
Using Widgets
* [Installation]
* [Simple Widget Introduction]
* [Widget List]
* [Output widgets: leveraging Jupyter's display system]
* [Widget Events]
* [Styling of Jupyter widgets]
* [Layout of Jupyter widgets]
* [Using Layout Templates]
* [Using Interact]
* [Asynchronous Widgets]
Upgrading
* [Migrating user code]
* [Migrating custom widget libraries]
Publishing Content with Widgets
* [Embedding Jupyter Widgets in Other Contexts than the Notebook]
Contributing to Jupyter Widgets
* [Developer Install]
* [Unit Tests]
* [Develop and Build Documentation]
* [Contributing]
* [Developer Release Procedure]
[Edit on GitHub](https://github.com/jupyter-widgets/ipywidgets/edit/main/docs/how-to/index.md)
[Show Source](https://ipywidgets.readthedocs.io/en/latest/_sources/how-to/index.md.txt)
[Installation]: https://ipywidgets.readthedocs.io/en/latest/user_install.html
[Simple Widget Introduction]: https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Basics.html
[Widget List]: https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html
[Output widgets: leveraging Jupyter's display system]: https://ipywidgets.readthedocs.io/en/latest/examples/Output%20Widget.html
[Widget Events]: https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html
[Styling of Jupyter widgets]: https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Styling.html
[Layout of Jupyter widgets]: https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Layout.html
[Using Layout Templates]: https://ipywidgets.readthedocs.io/en/latest/examples/Layout%20Templates.html
[Using Interact]: https://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html
[Asynchronous Widgets]: https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Asynchronous.html
[Migrating user code]: https://ipywidgets.readthedocs.io/en/latest/user_migration_guides.html
[Migrating custom widget libraries]: https://ipywidgets.readthedocs.io/en/latest/migration_guides.html
[Embedding Jupyter Widgets in Other Contexts than the Notebook]: https://ipywidgets.readthedocs.io/en/latest/embedding.html
[Developer Install]: https://ipywidgets.readthedocs.io/en/latest/dev_install.html
[Unit Tests]: https://ipywidgets.readthedocs.io/en/latest/dev_testing.html
[Develop and Build Documentation]: https://ipywidgets.readthedocs.io/en/latest/dev_docs.html
[Contributing]: https://ipywidgets.readthedocs.io/en/latest/contributing.html
[Developer Release Procedure]: https://ipywidgets.readthedocs.io/en/latest/dev_release.html
## Explanation
* [Low Level Widget Explanation](https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Low%20Level.html)
[Edit on GitHub](https://github.com/jupyter-widgets/ipywidgets/edit/main/docs/explanation/index.md)
[Show Source](https://ipywidgets.readthedocs.io/en/latest/_sources/explanation/index.md.txt)
## Reference
History
* [ipywidgets Changelog](https://ipywidgets.readthedocs.io/en/latest/changelog.html)
Python API
* [`ipywidgets`](https://ipywidgets.readthedocs.io/en/latest/ipywidgets.html)
* [Index](https://ipywidgets.readthedocs.io/en/latest/genindex.html)
* [Module Index](https://ipywidgets.readthedocs.io/en/latest/py-modindex.html)
JS API Packages
* [`@jupyter-widgets`]
* [`@jupyter-widgets/base`]
* [`@jupyter-widgets/base-manager`]
* [`@jupyter-widgets/controls`]
* [`@jupyter-widgets/html-manager`]
* [`@jupyter-widgets/jupyterlab-manager`]
* [`@jupyter-widgets/output`]
[`@jupyter-widgets`]: https://ipywidgets.readthedocs.io/en/latest/jupyter-widgets.html
[`@jupyter-widgets/base`]: https://ipywidgets.readthedocs.io/en/latest/_static/typedoc/modules/_jupyter_widgets_base.html
[`@jupyter-widgets/base-manager`]: https://ipywidgets.readthedocs.io/en/latest/_static/typedoc/modules/_jupyter_widgets_base_manager.html
[`@jupyter-widgets/controls`]: https://ipywidgets.readthedocs.io/en/latest/_static/typedoc/modules/_jupyter_widgets_controls.html
[`@jupyter-widgets/html-manager`]: https://ipywidgets.readthedocs.io/en/latest/_static/typedoc/modules/_jupyter_widgets_html_manager.html
[`@jupyter-widgets/jupyterlab-manager`]: https://ipywidgets.readthedocs.io/en/latest/_static/typedoc/modules/_jupyter_widgets_jupyterlab_manager.html
[`@jupyter-widgets/output`]: https://ipywidgets.readthedocs.io/en/latest/_static/typedoc/modules/_jupyter_widgets_output.html
[Edit on GitHub](https://github.com/jupyter-widgets/ipywidgets/edit/main/docs/reference/index.md)
[Show Source](https://ipywidgets.readthedocs.io/en/latest/_sources/reference/index.md.txt)
/2. Jupyter Widgets
=========================
```{note}
This documentation is for `ipywidgets` 8. See the [changelog](./changelog.md) for what is new and the [user migration guide](./user_migration_guides.md) for suggestions about migrating from `ipywidgets` 7.
For custom widget authors, see the [authoring migration guide](./migration_guides.md) for suggestions about how to update custom widgets to support `ipywidgets` 8.
The documentation for `ipywidgets` 7 is available at
[ipywidgets 7 documentation](https://ipywidgets.readthedocs.io/en/7.x).
```
Jupyter Widgets are [interactive browser controls](https://github.com/jupyter-widgets/ipywidgets/blob/main/docs/source/examples/Index.ipynb)
for Jupyter notebooks. Examples include:
- Basic form controls like **sliders**, **checkboxes**, **text inputs**
- Container controls like **tabs**, **accordions**, **horizontal** and **vertical layout boxes**, **grid layouts**
- Advanced controls like **maps**, **2d** and **3d visualizations**, **datagrids**, and more
Notebooks come alive when interactive widgets are used. Users can visualize and
manipulate their data in intuitive and easy ways. Researchers can easily see
how changing inputs to a model impact the results. Scientists can share
interactive results with graphical user interfaces that others can play with
without seeing code. Exploring, learning, and sharing becomes a fun immersive
experience.
![an animation of slider widgets changing a plot](./interact.gif)
## Try it online
From the _Try Jupyter Widgets Now_ sidebar, you can try `ipywidgets` in the _JupyterLab_
or _Jupyter Notebook_ interfaces, provided by [JupyterLite](https://jupyterlite.rtfd.io).
## Learning Widgets
This documentation contains a thorough description of the core Jupyter widgets
package and several examples.
There is a [video tutorial](https://youtu.be/QAtKtVcm11I) that takes a more step-by-step approach. The
Jupyter notebooks for that tutorial are [also available](https://github.com/jupyter-widgets/tutorial).
## Core Jupyter Widgets
Jupyter Widgets is primarily a framework to provide interactive controls (see
[Widget Basics](examples/Widget%20Basics.ipynb) for more information).
The `ipywidgets` package
also provides a basic, lightweight set of core form controls that _use_ this
framework. These included controls include a text area, text box, select and
multiselect controls, checkbox, sliders, tab panels, grid layout, etc.
The framework for building rich interactive objects is the foremost purpose of
the Jupyter Widgets project, and the set of included core form controls is
purposefully kept small and self-contained. We encourage and support a robust
ecosystem of packages built on top of the Jupyter Widgets framework to provide
more complicated interactive objects, such as maps, 2d and 3d visualizations, or
other form control systems built on a variety of popular Javascript frameworks
such as Material or Vue.
See the [Jupyter Widgets wiki page](https://github.com/jupyter/jupyter/wiki/Jupyter-Widgets)
for more information about custom widget packages built on top of the Jupyter Widgets
framework.
## Jupyter Widgets components
The Jupyter Widgets framework has several components:
1. A package in the _kernel_ to provide an interface for widgets. The
`ipywidgets` Python package provides Jupyter Widgets for the IPython
kernel. Other kernels may also provide Jupyter Widgets support.
2. An extension for the browser Jupyter frontend to manage Jupyter Widgets.
Installing `ipywidgets` automatically installs extensions for JupyterLab
and Jupyter Notebook (the `jupyterlab-widgets` and `widgetsnbextension`
packages). The Jupyter Widgets project also maintains a plain HTML interface
for embedding Jupyter Widgets on a webpage, and many other frontends support
Jupyter Widgets.
See the
[Jupyter Widgets wiki page](https://github.com/jupyter/jupyter/wiki/Jupyter-Widgets) for more
information from the community about kernels and frontends that support Jupyter Widgets, as well as
some custom widget packages built on top of the Jupyter Widgets framework.
```{toctree}
:maxdepth: 2
tutorials/index
how-to/index
explanation/index
reference/index
```
/3. Installation
=====================
Users can install the current version of **ipywidgets** with [pip](https://pip.pypa.io/en/stable/) or [conda](https://conda.readthedocs.io/en/latest/).
In most cases, installing the Python `ipywidgets` package will also automatically configure classic Jupyter Notebook and JupyterLab 3.x to display ipywidgets. With pip, do:
pip install ipywidgets
or with conda, do:
conda install -c conda-forge ipywidgets
Installing in JupyterLab 3.x
----------------------------
Most of the time, installing `ipywidgets` automatically configures JupyterLab 3.x to use widgets. The `ipywidgets` package does this by depending on the `jupyterlab_widgets` package, which configures JupyterLab 3 to display and use widgets.
If JupyterLab and the IPython kernel are installed in different environments (for example, separate environments are providing different Python kernels), then the installation requires two steps:
1. Install the `jupyterlab_widgets` package in the environment containing JupyterLab.
2. Install `ipywidgets` in each kernel’s environment that will use ipywidgets.
For example, if using conda environments, with JupyterLab installed on the `base` environment and the kernel installed in an environment called `pyenv`, the commands are:
conda install -n base -c conda-forge jupyterlab_widgets
conda install -n pyenv -c conda-forge ipywidgets
Installing in classic Jupyter Notebook
--------------------------------------
Most of the time, installing `ipywidgets` automatically configures Jupyter Notebook to use widgets. The `ipywidgets` package does this by depending on the `widgetsnbextension` package, which configures the classic Jupyter Notebook to display and use widgets.
If your Jupyter Notebook and the IPython kernel are installed in different environments (for example, separate environments are providing different Python kernels), then the installation requires two steps:
1. Install the `widgetsnbextension` package in the environment containing the Jupyter Notebook server.
2. Install `ipywidgets` in each kernel’s environment that will use ipywidgets.
For example, if using conda environments, with Jupyter Notebook installed on the `base` environment and the kernel installed in an environment called `pyenv`, the commands are:
conda install -n base -c conda-forge widgetsnbextension
conda install -n pyenv -c conda-forge ipywidgets
Installing into JupyterLab 1 or 2
---------------------------------
To install the JupyterLab extension into JupyterLab 1 or 2, you also need to run the command below in a terminal which requires that you have [nodejs](https://nodejs.org/en/) installed.
For example, if using conda environments, you can install nodejs with:
conda install -c conda-forge nodejs
Then you can install the labextension:
jupyter labextension install @jupyter-widgets/jupyterlab-manager
This command defaults to installing the latest version of the **ipywidgets** JupyterLab extension. Depending on the version of JupyterLab you have installed, you may need to install [an older version](https://github.com/jupyter-widgets/ipywidgets/tree/main/packages/jupyterlab-manager#version-compatibility).
If you install this extension while JupyterLab is running, you will need to refresh the page or restart JupyterLab before the changes take effect.
**Note:** A clean reinstall of the JupyterLab extension can be done by first running the `jupyter lab clean` command which will remove the staging and static directories from the lab directory. The location of the lab directory can be queried by executing the command `jupyter lab path` in your terminal.
Installing into classic Jupyter Notebook 5.2 or earlier
-------------------------------------------------------
If you have an old version of Jupyter Notebook installed (version 5.2 or earlier), you may need to manually enable the ipywidgets notebook extension with:
jupyter nbextension enable --py widgetsnbextension
When using [virtualenv](https://virtualenv.pypa.io/en/stable/) and working in an activated virtual environment, the `--sys-prefix` option may be required to enable the extension and keep the environment isolated (i.e. `jupyter nbextension enable --py widgetsnbextension --sys-prefix`).
Frequently Asked Questions
--------------------------
The issues in the [Reference milestone](https://github.com/jupyter-widgets/ipywidgets/issues?q=is%3Aopen+is%3Aissue+milestone%3AReference) on GitHub include many questions, discussions, and answers about ipywidgets.
**Question**: When I display a widget or interact, I just see some text, such as `IntSlider(value=0)` or `interactive(children=(IntSlider(value=0, description='x', max=1), Output()), _dom_classes=('widget-interact',))`. What is wrong?
**Answer**: A text representation of the widget is printed if the widget control is not available. It may mean the widget JavaScript is still loading. If the message persists in the Jupyter Notebook or JupyterLab, it likely means that the widgets JavaScript library is either not installed or not enabled. See the installation instructions above for setup instructions.
If you see this message in another frontend (for example, a static rendering on GitHub or [NBViewer](https://nbviewer.jupyter.org/)), it may mean that your frontend doesn’t currently support widgets.
/4. Interactive Widgets
===================================
- https://github.com/jupyter-widgets/ipywidgets
- https://ipywidgets.readthedocs.io/en/latest/_static/files/Index.ipynb
```sh
git clone --depth=1 git@github.com:jupyter-widgets/ipywidgets /pl/ipywidgets
pushd '/pl/ipywidgets/docs/source/examples'
while read nb; do
jupyter nbconvert --to markdown "$nb"
done<<<$(find | grep ipynb)
```
IPython includes an architecture for interactive widgets that tie together Python code running in the kernel and JavaScript/HTML/CSS running in the browser. These widgets enable users to explore their code and data interactively.
## Tutorials
- [Using Interact](https://ipywidgets.readthedocs.io/en/latest/_static/files/Using%20Interact.ipynb)
- [Widget Basics](https://ipywidgets.readthedocs.io/en/latest/_static/files/Widget%20Basics.ipynb)
- [Widget Events](https://ipywidgets.readthedocs.io/en/latest/_static/files/Widget%20Events.ipynb)
- [Widget List](https://ipywidgets.readthedocs.io/en/latest/_static/files/Widget%20List.ipynb)
- [Widget Styling](https://ipywidgets.readthedocs.io/en/latest/_static/files/Widget%20Styling.ipynb)
- [Layout Templates](https://ipywidgets.readthedocs.io/en/latest/_static/files/Layout%20Templates.ipynb)
- [Custom Widget Tutorial](https://ipywidgets.readthedocs.io/en/latest/_static/files/Widget%20Custom.ipynb)
- [Widget Asynchronous](https://ipywidgets.readthedocs.io/en/latest/_static/files/Widget%20Asynchronous.ipynb): how to pause and listen in the kernel for widget changes in the frontend.
## Examples of custom widgets
- [Variable Inspector](https://ipywidgets.readthedocs.io/en/latest/_static/files/Variable%20Inspector.ipynb)
- [Export As (nbconvert)](https://ipywidgets.readthedocs.io/en/latest/_static/files/Export%20As%20(nbconvert%29.ipynb)
## Examples using `interact`/`interactive`
* [Beat Frequencies](https://ipywidgets.readthedocs.io/en/latest/_static/files/Beat%20Frequencies.ipynb)
* [Exploring Graphs](https://ipywidgets.readthedocs.io/en/latest/_static/files/Exploring%20Graphs.ipynb)
* [Factoring](https://ipywidgets.readthedocs.io/en/latest/_static/files/Factoring.ipynb)
* [Image Browser](https://ipywidgets.readthedocs.io/en/latest/_static/files/Image%20Browser.ipynb)
* [Image Processing](https://ipywidgets.readthedocs.io/en/latest/_static/files/Image%20Processing.ipynb)
* [Lorenz Differential Equations](https://ipywidgets.readthedocs.io/en/latest/_static/files/Lorenz%20Differential%20Equations.ipynb)
/5. Simple Widget Introduction
=================================
## What are widgets?
Widgets are eventful python objects that have a representation in the browser, often as a control like a slider, textbox, etc.
## What can they be used for?
You can use widgets to build **interactive GUIs** for your notebooks.
You can also use widgets to **synchronize stateful and stateless information** between Python and JavaScript.
## Using widgets
To use the widget framework, you need to import `ipywidgets`.
```python
# Imports for JupyterLite
%pip install -q ipywidgets
```
```python
import ipywidgets as widgets
```
### repr
Widgets have their own display `repr` which allows them to be displayed using IPython's display framework. Constructing and returning an `IntSlider` automatically displays the widget (as seen below). Widgets are displayed inside the output area below the code cell. Clearing cell output will also remove the widget.
```python
widgets.IntSlider()
```
### display()
You can also explicitly display the widget using `display(...)`.
```python
from IPython.display import display
w = widgets.IntSlider()
display(w)
```
### Multiple display() calls
If you display the same widget twice, the displayed instances in the front-end will remain in sync with each other. Try dragging the slider below and watch the slider above.
```python
display(w)
```
## Why does displaying the same widget twice work?
Widgets are represented in the back-end by a single object. Each time a widget is displayed, a new representation of that same object is created in the front-end. These representations are called views.
![Kernel & front-end diagram](https://ipywidgets.readthedocs.io/en/latest/_images/WidgetModelView.png)
### Closing widgets
You can close a widget by calling its `close()` method.
```python
display(w)
```
```python
w.close()
```
## Widget properties
All of the IPython widgets share a similar naming scheme. To read the value of a widget, you can query its `value` property.
```python
w = widgets.IntSlider()
display(w)
```
```python
w.value
```
Similarly, to set a widget's value, you can set its `value` property.
```python
w.value = 100
```
### Keys
In addition to `value`, most widgets share `keys`, `description`, and `disabled`. To see the entire list of synchronized, stateful properties of any specific widget, you can query the `keys` property.
```python
w.keys
```
### Shorthand for setting the initial values of widget properties
While creating a widget, you can set some or all of the initial values of that widget by defining them as keyword arguments in the widget's constructor (as seen below).
```python
widgets.Text(value='Hello World!', disabled=True)
```
## Linking two similar widgets
If you need to display the same value two different ways, you'll have to use two different widgets. Instead of attempting to manually synchronize the values of the two widgets, you can use the `link` or `jslink` function to link two properties together (the difference between these is discussed in [Widget Events](Widget Events.ipynb)). Below, the values of two widgets are linked together.
```python
a = widgets.FloatText()
b = widgets.FloatSlider()
display(a,b)
mylink = widgets.jslink((a, 'value'), (b, 'value'))
```
### Unlinking widgets
Unlinking the widgets is simple. All you have to do is call `.unlink` on the link object. Try changing one of the widgets above after unlinking to see that they can be independently changed.
```python
# mylink.unlink()
```
/6. Widget List
====================
```python
# Imports for JupyterLite
%pip install -q ipywidgets
```
```python
import ipywidgets as widgets
```
## Numeric widgets
There are many widgets distributed with ipywidgets that are designed to display numeric values. Widgets exist for displaying integers and floats, both bounded and unbounded. The integer widgets share a similar naming scheme to their floating point counterparts. By replacing `Float` with `Int` in the widget name, you can find the Integer equivalent.
### :widget: IntSlider
- The slider is displayed with a specified, initial `value`. Lower and upper bounds are defined by `min` and `max`, and the value can be incremented according to the `step` parameter.
- The slider's label is defined by `description` parameter
- The slider's `orientation` is either 'horizontal' (default) or 'vertical'
- `readout` displays the current value of the slider next to it. The options are **True** (default) or **False**
- `readout_format` specifies the format function used to represent slider value. The default is '.2f'
```python
widgets.IntSlider(
value=7,
min=0,
max=10,
step=1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='d'
)
```
### :widget: FloatSlider
```python
widgets.FloatSlider(
value=7.5,
min=0,
max=10.0,
step=0.1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='.1f',
)
```
An example of sliders **displayed vertically**.
```python
widgets.FloatSlider(
value=7.5,
min=0,
max=10.0,
step=0.1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='vertical',
readout=True,
readout_format='.1f',
)
```
### :widget: FloatLogSlider
The `FloatLogSlider` has a log scale, which makes it easy to have a slider that covers a wide range of positive magnitudes. The `min` and `max` refer to the minimum and maximum exponents of the `base`, and the `value` refers to the actual value of the slider.
```python
widgets.FloatLogSlider(
value=10,
base=10,
min=-10, # max exponent of base
max=10, # min exponent of base
step=0.2, # exponent step
description='Log Slider'
)
```
### :widget: IntRangeSlider
```python
widgets.IntRangeSlider(
value=[5, 7],
min=0,
max=10,
step=1,
description='Test:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='d',
)
```
### :widget: FloatRangeSlider
```python
widgets.FloatRangeSlider(
value=[5, 7.5],
min=0,
max=10.0,
step=0.1,
description='Test:',
disabled=False,
continuous_update=False,