From 1eea10a89206084171bc5c97b601445ec6ca4bc4 Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 6 Dec 2023 16:44:16 +0000 Subject: [PATCH] Deployed 05e2a8a with MkDocs version: 1.5.3 --- .../applications/callable/index.html | 2 +- .../applications/callable_codeobj.pickle | Bin 4332 -> 4332 bytes .../applications/chaining/index.html | 2 +- .../applications/chaining_codeobj.pickle | Bin 11127 -> 11094 bytes .../applications/hotdog/index.html | 2 +- .../applications/hotdog_codeobj.pickle | Bin 3103 -> 3103 bytes .../mg_execution_times/index.html | 12 +++++----- .../applications/pint_quantity/index.html | 2 +- .../applications/snells_law/index.html | 2 +- .../applications/snells_law_codeobj.pickle | Bin 2601 -> 2601 bytes generated_examples/basic_example/index.html | 2 +- .../basic_example_codeobj.pickle | Bin 2159 -> 2159 bytes .../basic_widgets_demo/index.html | 4 ++-- .../basic_widgets_demo_codeobj.pickle | Bin 3340 -> 3340 bytes .../demo_widgets/change_label/index.html | 2 +- .../demo_widgets/change_label_codeobj.pickle | Bin 2159 -> 2159 bytes .../demo_widgets/choices/index.html | 2 +- .../demo_widgets/choices_codeobj.pickle | Bin 4715 -> 4712 bytes .../demo_widgets/file_dialog/index.html | 2 +- .../demo_widgets/file_dialog_codeobj.pickle | Bin 6584 -> 6581 bytes .../demo_widgets/image/index.html | 2 +- .../demo_widgets/image_codeobj.pickle | Bin 2422 -> 2422 bytes .../images/mkd_glr_file_dialog_001.png | Bin 5893 -> 4436 bytes .../images/mkd_glr_file_dialog_002.png | Bin 4436 -> 5893 bytes .../thumb/mkd_glr_file_dialog_thumb.png | Bin 9227 -> 8826 bytes .../demo_widgets/log_slider/index.html | 2 +- .../demo_widgets/login/index.html | 2 +- .../mg_execution_times/index.html | 22 +++++++++--------- .../demo_widgets/optional/index.html | 2 +- .../demo_widgets/optional_codeobj.pickle | Bin 2096 -> 2096 bytes .../demo_widgets/range_slider/index.html | 2 +- .../demo_widgets/range_slider_codeobj.pickle | Bin 2091 -> 2091 bytes .../demo_widgets/selection/index.html | 2 +- .../demo_widgets/table/index.html | 4 ++-- .../demo_widgets/table_codeobj.pickle | Bin 15913 -> 15901 bytes .../generated_examples_jupyter.zip | Bin 82533 -> 82533 bytes .../generated_examples_python.zip | Bin 49912 -> 49912 bytes .../images/mkd_glr_basic_widgets_demo_001.png | Bin 31431 -> 31406 bytes .../mkd_glr_basic_widgets_demo_thumb.png | Bin 25468 -> 25472 bytes .../images/mkd_glr_waveform_001.png | Bin 42276 -> 39148 bytes .../images/mkd_glr_waveform_002.png | Bin 35238 -> 31812 bytes .../images/thumb/mkd_glr_waveform_thumb.png | Bin 20500 -> 22997 bytes .../matplotlib/mg_execution_times/index.html | 6 ++--- .../matplotlib/mpl_figure/index.html | 2 +- .../matplotlib/mpl_figure_codeobj.pickle | Bin 8655 -> 8670 bytes .../matplotlib/waveform/index.html | 2 +- .../matplotlib/waveform_codeobj.pickle | Bin 8877 -> 8856 bytes .../mg_execution_times/index.html | 6 ++--- .../images/mkd_glr_napari_combine_qt_001.png | Bin 41727 -> 37843 bytes .../images/mkd_glr_napari_img_math_001.png | Bin 45624 -> 44603 bytes .../mkd_glr_napari_parameter_sweep_001.png | Bin 244180 -> 243025 bytes .../thumb/mkd_glr_napari_combine_qt_thumb.png | Bin 17880 -> 15704 bytes .../thumb/mkd_glr_napari_img_math_thumb.png | Bin 28475 -> 28049 bytes .../mkd_glr_napari_parameter_sweep_thumb.png | Bin 66955 -> 66475 bytes .../napari/mg_execution_times/index.html | 10 ++++---- .../napari/napari_combine_qt/index.html | 2 +- .../napari/napari_combine_qt_codeobj.pickle | Bin 8052 -> 8052 bytes .../napari/napari_forward_refs/index.html | 2 +- .../napari/napari_forward_refs_codeobj.pickle | Bin 2118 -> 2118 bytes .../napari/napari_img_math/index.html | 2 +- .../napari/napari_img_math_codeobj.pickle | Bin 7480 -> 7480 bytes .../napari/napari_parameter_sweep/index.html | 2 +- .../napari_parameter_sweep_codeobj.pickle | Bin 6888 -> 6873 bytes .../mg_execution_times/index.html | 8 +++---- .../progress_bars/progress/index.html | 2 +- .../progress_bars/progress_codeobj.pickle | Bin 2219 -> 2219 bytes .../progress_indeterminate_codeobj.pickle | Bin 2540 -> 2540 bytes .../progress_bars/progress_manual/index.html | 4 ++-- .../progress_manual_codeobj.pickle | Bin 3506 -> 3506 bytes .../progress_bars/progress_nested/index.html | 2 +- .../progress_nested_codeobj.pickle | Bin 3287 -> 3287 bytes .../class_method_codeobj.pickle | Bin 4286 -> 4271 bytes .../mg_execution_times/index.html | 4 ++-- .../under_the_hood/self_reference/index.html | 2 +- scripts/__pycache__/_hooks.cpython-312.pyc | Bin 10118 -> 10118 bytes search/search_index.json | 2 +- sitemap.xml.gz | Bin 963 -> 963 bytes type_map/index.html | 2 +- 78 files changed, 66 insertions(+), 66 deletions(-) diff --git a/generated_examples/applications/callable/index.html b/generated_examples/applications/callable/index.html index 574f811ac..107a0e259 100644 --- a/generated_examples/applications/callable/index.html +++ b/generated_examples/applications/callable/index.html @@ -2930,7 +2930,7 @@

Callable functions demoexample.func.changed.connect(update) example.show(run=True) -

Total running time of the script: ( 0 minutes 0.041 seconds)

+

Total running time of the script: ( 0 minutes 0.069 seconds)

Download Python source code: callable.py

diff --git a/generated_examples/applications/callable_codeobj.pickle b/generated_examples/applications/callable_codeobj.pickle index a953161547435cae69174ee440b013e6e043acf2..ce21b5a761fd31d07535c5ecd8a42b1faa237706 100644 GIT binary patch delta 556 zcmW;IUr19?90zc}yZ_d_XZMmdqJIcMAf26;FCWhDdk*KETB4S?>1XW1rTpad zM8Q8FOkJ#;s3b2}l4ZS^pDa|$?!Hp-%!SdZ;$Uf1&F6EcIJYTa3XSY>o9ILi^RD!G zq#beojCArrWDUJa3ql~xrN#~H;$wS124r?KCfcw^>7;1JUZr|-ke@^+`=TC(r227) zP0_499EiD+yij131%HVIj<r9V0U1eDAn8M$?INMR+(a*6Sk`E1}7}v9s?R0 I)EAZf|6J0wR{#J2 delta 594 zcmXxgOK1~O6b9h_>16VnOkz6$HEC;&)fAI-k{}k9ilEjiSbTt3EjEPMjN~CUQ4uWY zLKK5G{t-ksqPUN^a#w^vp&*K4q)<_OfDjOrf?yZkOm%ble$Khvdrq^r**g=Bsp*T! z+}Uh8YUHQV=Ze+wYUpw`RF?9|T)JBB*jvh{ibf$nTr&Q3R8CCL>dZppw6})=XN=dq zJ~o_g`1#ct;&ZsT;PNx!YOrQmv97og=8&=z1Dsa2A}$;dcQs39i^*2QARoFnaZFjm z9?6OAX1cHVF(kADyUg5rW;ai&eXOaS+^-Jf0Pm=A9AsUM;t=~i>-fQ=;i!;~W4tZ$ zC6UL3bc}P>6UT%&yE)?VBE|LI0i5Px?`9ZcoCLDwP_0^lryROm%(!oqlDul0bzEsN zT^8+GM-bOouqSYnkL?>)-&(0C|2H|6DO_mnvGT`HS?b_>M}&Z{^6Cg4aMaetC6`9s z*~R0wPSu`EP8zAnl2OgLGLJ}X#1lTX1i6Ses0rzK##sAWE?d6f1wXa#LtUJG9F_c- zGc_amFmGyJa^odeS%X}bG`to{;4Sx9bu@V18pZChaining functions together# notice which functions get called when you change each widget. -

Total running time of the script: ( 0 minutes 0.059 seconds)

+

Total running time of the script: ( 0 minutes 0.064 seconds)

Download Python source code: chaining.py

diff --git a/generated_examples/applications/chaining_codeobj.pickle b/generated_examples/applications/chaining_codeobj.pickle index eecddfd8a1d7e8e9860f4c176bfbb3dc17f1719b..b2f3db3de09aa16cf852f5816d596ad084fc7c39 100644 GIT binary patch literal 11094 zcmd^FO=u)V6kcVMOfs2F662ttt}HH$1RF(BTwD|*S%ZdPqN^b5(9=^+cRSOQo$gLH z%L?9Bm%iBxiXe)j7X@$P#e?8!y$OPzg#|$nMK6L_)qgdw=5=+=L=ZmQs~k`k{8w_{x( zEvaie*IM-3<(5d%#)RLMB1Hc#v!>l9YO1<+Ufa_uxj~^1fHL;`K|&cn9$+tB)E>qC3 zX7HRm;(-1f z7swnxAe^f#ocL|$l$%MalHV0(3&i=Jo8uK{VyfhiMVSI!u5s&es^m`+xTH${EP-J= z)ci#P0QvmJ4W(7`4`xRKjy)UA3h3oIzf%6meRCWur)h&_edDj#aXf<1c^UdYl~cQX z!;vF#9?MB_i@J$e-G+~C*vrFeZdR#=T@0#euOxw7FJ;X>rjjs_=r}-3c5$=sQAif3 zb1wjlQR3|T<#FPZ_hBmbSXhS~&Z0&!a=APBmUH|nsLWBZFbYDr>COB4gX~n`L9Ycl94&Y6tXWBrV5m~ z49uswAj21ErEz~6?|>&s-be-&!~l*83P7O6M*vV2#{NtRWEhJ)%W}nB2-8{nQ$RYCOokX4p9$HY0i#kn{U0MF zfE8o;9MH`1&j4c(322e(OGw4P2aH1n(IVB?fU1;!7#M>HU`3j50L@hNg7>(ghX#V(Qtys^$+=`yHSvLt^E2 zi2ZaPkG)GiL>O`?(F93L;s~+E8)Yi!aB@J2qc_Hrm3Y0~GSn{zR#2`eS=+Q{)V<{^ zV$Z32!Q`+j>Uf~VBEZ#zemS57Ql0FZRKa3(ssZ3a`Y9zYFsy0}^vzp=Z8hzi1)<$m zh!SHu1`tcUaTYKgSHOu}Cm@FRz5=eg0#4*w1(<5uIt!SzLX^mJA3)5G$dd98_Cocl>h($ literal 11127 zcmd^FU1%It6mG?Aes+^>LK{S=1XPGrMk$BErqv`ms`S+~&^WKPIt+|eW!GA9J z&#ji$WxhA|jB7<0->YY1Yq&S#?@UM@0ldEfn^;qvxa$O(y4s^A)(QLbhvT3y1%&~pFie0Q-ar0b^ zr7i-fen{t*Gb@_aX07v)U%_~HYMwGG4b5h@qV^+mHI5?;V-~mc3n_AeJMf7KrOy?H z0>rsfm`|Sz?~JU?U3kWd8r{cjNrMyYNEzHEDvVN;DbVGpu&&9H+>s{&zI|xh;$E>>)FC= z!EHP*%<-eYYs$4zlqt}K3F~3XRVUy?xn3k-Xt`Ph0OYeS49RkJLObSF;t4CJYIPwQ z*o&^=2QxL>veXa~t^sN=X^SST><&wg9MQ4^kn9U_64P<}w3Smm%h8OWM~QsK#kK8h z2rniZ0)zwdm-Jd{Rp%se#}9>@&+GNgG{{mTkfO*xV8psXImGUcewEG>X!3@ztq3Wy zXDHc{_}D{_KpN?QCn94cc7A^bJRoNHj)<^>RNoV+POE471`Cc}SQX30CBwoiC&{`S zT12~Pt}v+y&j6>$mqY)sC_GFE{o^7Okl<5cU0-$`tBIW}8=+LYBHNiNVEF&S)z#4L0Sd8r;7=V?d_)>68tgsE%w~Zk6AySsmGS627 zJg4}tuVHu~TITsi@Qf`vtRLRUAy@!b=J-x1`h(%L22#a3Lt&oe5f2$>iXux09H$%fkf>B>>lQ$z;ZHOKggg?7hvRQ z7J+?TtRE!Hca|IZg<0)W25v?C2!P68#_O1eB zq~~L2u~7t)Sy%#K-kca&R`82sgDEz1mJQ43y4|2DI=UEQ2lz-)V$*Qx!io{Q$eSAK z1r((PvYF+qNskuX^EY>t5ls1QtHdxP{9@{vTV?YHsyz!(lNqscyZC1G7NY3UOV%Nw z36d7S|5-(E$;=B!}QDJffla=+^js{ zgc4X=d9y57ZZB^E;8Z%~1e^GYZN3d`>wL@!V=T0H3Q=-Q?*hd1z^J2{-Y&Kf$PCwkIXWk>qwqyBOlG=~Kv?ol zxbZK&6E?pFvG4x(Oy;*`5(XXYdw|&8Z=1{?OC$@_`56F)c;{sPLVF-)+OISconybz z7?9iVz?ORdWd4zuGVf6G#<-~k-U;*^U-GS>^`8DqCN( zx5B?EsvX&cE753j%?}^|ZT55l@??!P5{DkPG+kbZ3Hotdog or not appif __name__ == "__main__": is_hotdog.show(run=True) -

Total running time of the script: ( 0 minutes 0.054 seconds)

+

Total running time of the script: ( 0 minutes 0.050 seconds)

Download Python source code: hotdog.py

diff --git a/generated_examples/applications/hotdog_codeobj.pickle b/generated_examples/applications/hotdog_codeobj.pickle index d04bdee60a73f447be96f5645ae736b1fe935bec..6d343084cecb693ef52242f06aeab74429bc7251 100644 GIT binary patch delta 698 zcmaKp&ubGw6vx@T{h95m(3A$!Ae(B9rde93KR}T5(28KiOHZQ9#)QsFk}cg`rC<#R zLd8WJ-r~hWMG%SwY4IWmR`l-8gE#T0{s}$!X0iuQUiSN$@B6+tvoqVp?c$bGKH`Ti z3!+xA;)E=?m)=aP8)-F>dtSGl;vhF}Bx*Nk#T{C`$=OGfk>Sdv^jehSygq6sIt{tq z@xn00X|VAtR3(eZfdaE|AIi9!J4enwEQoIzm%xJKRP*HtY{)$A%co(AoIhp>_k_dg zvT8w{Tv<5*Go&?zQMRU3@P|4_^jkR(7lmKJK(pWy@qudNlCntE19e$^ZM4)exRTX) z?kaI#yGGT%R-{=aT$V?(RbA)j;XY5^pyUI65pD^c#9w*|yo_tc7_>6xCtV?aYuI>b z6yT2FS?H4fG@OxDW<8GSW|@{)_|dQ-q(UP<19yc^;IsTOSSNl(-hI+<`Dy5r%BBMk zNza;R;1TJTIgaaQ0X7Anf+wW>s<`)5a7`Z2X4sS(>T|xUH~2h1_d-yjyDooO*QJLZ zo(95bEoDZcH)FpO`Moe@CVMH;DCO$#nr6=C?5Q1QZDv0pU-u%$d$d)8j^E@hyS$}6 v*r-hI{gYhi#a*71+X77XPQ-9Wa^O8p{w`J24@1k4E}Z=Izt%6j*p8jQGLP9< delta 622 zcmY+B&ui0Q7{^JUw{MdsktuO@T{p<4vvzBCP)BzV>cN46h&Me*=yWWFHq)g6LAJAl z3>Ka^P=taY2>t*;7zz_{m%(6vfTG?NJb0ey^S;StmwZ0&_xpVVA^lRnwBg)TUDt1Q z7hE^Fm8>Myh>24YLC{-HBHmrP6L#pR&WG(zuk8m(WTcrJcuUK@#4AQ>J8*AzT0xMk zg{_EP^208@tBU{h5*+mm{HvF_nzqdLjEDF~Yx0S-YwHe7 zQujn3<4$_>b+Ha-Df(8lVTP#aBYaj?as5R6v4Z#cv3T_e-ctq@BYuBbJZ$`>m@r4{ zeP!g(Km_rZsv?>iT&G1dS4o3r?hM?ZAl8P{fCTq)Cb$%S&7FjK;sK1|H8w~0g{{N6 z%*_08=*oT??h+lgNR7knY$Hr;9>~tdQD(v_d7YQg&(F|S*mmB@%*Computation times#

-

00:03.743 total execution time for generated_examples_applications files:

+

00:02.680 total execution time for generated_examples_applications files:

+-----------------------------------------------------------------------------------+-----------+--------+ -| pint_quantity (docs/examples/applications/pint_quantity.py) | 00:03.472 | 0.0 MB | +| pint_quantity (docs/examples/applications/pint_quantity.py) | 00:02.439 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ -| snells_law (docs/examples/applications/snells_law.py) | 00:00.117 | 0.0 MB | +| callable (docs/examples/applications/callable.py) | 00:00.069 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ -| chaining (docs/examples/applications/chaining.py) | 00:00.059 | 0.0 MB | +| chaining (docs/examples/applications/chaining.py) | 00:00.064 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ -| hotdog (docs/examples/applications/hotdog.py) | 00:00.054 | 0.0 MB | +| snells_law (docs/examples/applications/snells_law.py) | 00:00.057 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ -| callable (docs/examples/applications/callable.py) | 00:00.041 | 0.0 MB | +| hotdog (docs/examples/applications/hotdog.py) | 00:00.050 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | values_dialog (docs/examples/applications/values_dialog.py) | 00:00.000 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/applications/pint_quantity/index.html b/generated_examples/applications/pint_quantity/index.html index c07ea1ca9..661597417 100644 --- a/generated_examples/applications/pint_quantity/index.html +++ b/generated_examples/applications/pint_quantity/index.html @@ -2918,7 +2918,7 @@

Quantities with pintwidget.show(run=True) -

Total running time of the script: ( 0 minutes 3.472 seconds)

+

Total running time of the script: ( 0 minutes 2.439 seconds)

Download Python source code: pint_quantity.py

diff --git a/generated_examples/applications/snells_law/index.html b/generated_examples/applications/snells_law/index.html index 567b40ccf..c7263eda5 100644 --- a/generated_examples/applications/snells_law/index.html +++ b/generated_examples/applications/snells_law/index.html @@ -2932,7 +2932,7 @@

Snell's law demonstration using snells_law.show(run=True) -

Total running time of the script: ( 0 minutes 0.117 seconds)

+

Total running time of the script: ( 0 minutes 0.057 seconds)

Download Python source code: snells_law.py

diff --git a/generated_examples/applications/snells_law_codeobj.pickle b/generated_examples/applications/snells_law_codeobj.pickle index d726e89f185a623837722624e032b764d0e708b7..acd242f7555a20ae02d7488d71ff3fe0315da2d6 100644 GIT binary patch delta 353 zcmZ1}vQlKimdR_G6d6S(pJ$R`6rcQr(S%JVgQv4Jaq>r|>x`O{d0Av9o3j~C7H3gl zG?;9`qQ+=EIiBSkqaBb`o~*^f%jh^cj!kOvLe?jY0h0yTRVS}zQ)UbXvtF@CF=d1S znO2OEV1WX5UdEWob?oMh@jy~}@=bOD#-z#895RznaELIb0$DnY8I!9ytJd`o|2kgl$u&RC4;kvB{#7oV@d{h#$<@DU?x4r8Izls nR2XMZ7GU&bTrfF`QJ!(}#C5JJD-b3y7iZ?7=w1!hU8)BFoCs`J delta 324 zcmZ1}vQlKimdVFB?PWzWcsfgKr)Xrb_b?Y{=1s}q>|x1GEXkOX!JQ#KIgHbjQD*W2 zPI)$Ykh;{#GdNrrRVLr%kY`k%_}PR_2PB#}IhjMB%@D$5;?!d_n{3Fb!e}{hojR*s z22V%n#Jv)1ju8F2jMo|cCL3_bPA+CKoNUD*Jo!5#FJtKB5+*gqh{>~=zA+{PNoBBT z+T>X*Qj_m8KVdAL?8B-$`8kU+V+ELHz$(pH4P;p{)`9tJSa}&6C+}i4XKVqI%9G96 z1sK~WtFaj{c1;dv(_!qLyq!&MG7Gy1;{+f}k8$#3Np=W-8jz*OICF9(y9`)<4v?k8 jIDhgoc3s9rldrIAGA;$XR+>YEaRrd2%dr~lky1SXAcBasic exampleexample.changed.connect(print) example.show(run=True) -

Total running time of the script: ( 0 minutes 1.433 seconds)

+

Total running time of the script: ( 0 minutes 1.478 seconds)

Download Python source code: basic_example.py

diff --git a/generated_examples/basic_example_codeobj.pickle b/generated_examples/basic_example_codeobj.pickle index 5978143a2130040b7956347838ee14a425df73d1..701269fbf3c3d3241293f553a0d50a82183e0591 100644 GIT binary patch delta 32 ocmaDa@Lpg;GyCK_?A?r2lWW}0M^Y5^8f$< delta 32 ocmaDa@Lpg;Gy7yw4qe8w$<7=qjFppX*(Y)|W$<>Erk3gf0Jvicwg3PC diff --git a/generated_examples/basic_widgets_demo/index.html b/generated_examples/basic_widgets_demo/index.html index f940c36cb..aaeceb8fe 100644 --- a/generated_examples/basic_widgets_demo/index.html +++ b/generated_examples/basic_widgets_demo/index.html @@ -2900,7 +2900,7 @@

Basic widgets demo

Out:

-
<MainFunctionGui widget_demo(boolean=True, integer=1, spin_float=3.14, slider_float=43.5, slider_int=550, string='Text goes here', dropdown=<Medium.Glass: 1.52>, radio_option=2, date=datetime.date(1999, 12, 31), time=datetime.time(1, 30, 20), datetime=datetime.datetime(2023, 12, 6, 16, 27, 47, 592000), filename=PosixPath('/Users/runner'))>
+
<MainFunctionGui widget_demo(boolean=True, integer=1, spin_float=3.14, slider_float=43.5, slider_int=550, string='Text goes here', dropdown=<Medium.Glass: 1.52>, radio_option=2, date=datetime.date(1999, 12, 31), time=datetime.time(1, 30, 20), datetime=datetime.datetime(2023, 12, 6, 16, 43, 31, 126000), filename=PosixPath('/Users/runner'))>
 


-

Total running time of the script: ( 0 minutes 0.197 seconds)

+

Total running time of the script: ( 0 minutes 0.206 seconds)

Download Python source code: basic_widgets_demo.py

diff --git a/generated_examples/basic_widgets_demo_codeobj.pickle b/generated_examples/basic_widgets_demo_codeobj.pickle index 773549ddaea16177770a4e8da19e9002ee64541f..49a2504b4773c3d7fc075e319038e0c19fbd5525 100644 GIT binary patch delta 443 zcmX|-JxCj27{~eNzH;7)p-nWgF;NpGh(@UaK@jO=prB%*=-_aW&=VRXk|-_OqEJvg z#Pc5!ghE9S3l=H}4x)og!Nub2BDgs_I9U4T2AALSdp_P5p2ul)8aL96o1qp*p0*14 ziX-Q&k_c*{m@9u2;;-hVsY2e(wQ=06M;&d9A;?ptq7AmWTFyKAs8zDlc2T^atfUqz zDO+=NcReCSZPQ(9N8CL~s;%BE=Y4nR=5Hy^L*L-09O9Mq4*j&{82hv!!%`Dx6*WYhJ?@jB%qT zfC_g-zAYHzff2wCC8G!5nK3%?gO<^SJ;8|A+xIs5Yy|OBSQifY0vQ}}2+cTV(cHor l2YeazqIxIGy>3a<7{z%ene1-XRz#`B7{x>ll591K_9lXOv7l8blp=IX0xRZ^hveX&9(oiP zb$Kg-G$^zPf*=TjP$+mQ^iT?dhZYMx^w^u%9-IsndKrH2eQzFoGj7z4?pUMxtX**| zr(DeY3x4X2pK^mGTMGBTfh&sTT(uz0@Ul!77GHb0UcN*e54nn@Xm-qvYMuqN2amXI z#t`LHWCUGYi*%#MJDfwmcbmchPt0LF<}WjeEVJf_7^`2j`2oK%$)62f{El&E0sLD7WcUeV-Ib@5!ZlJ-0Du rSMrs`V&1C5zt3>OZcs@_ceVR~??jx>j_JLP;|t$KcC{Custom text labels for widgetsexample.changed.connect(print) example.show(run=True)
-

Total running time of the script: ( 0 minutes 0.060 seconds)

+

Total running time of the script: ( 0 minutes 0.049 seconds)

Download Python source code: change_label.py

diff --git a/generated_examples/demo_widgets/change_label_codeobj.pickle b/generated_examples/demo_widgets/change_label_codeobj.pickle index 5978143a2130040b7956347838ee14a425df73d1..701269fbf3c3d3241293f553a0d50a82183e0591 100644 GIT binary patch delta 32 ocmaDa@Lpg;GyCK_?A?r2lWW}0M^Y5^8f$< delta 32 ocmaDa@Lpg;Gy7yw4qe8w$<7=qjFppX*(Y)|W$<>Erk3gf0Jvicwg3PC diff --git a/generated_examples/demo_widgets/choices/index.html b/generated_examples/demo_widgets/choices/index.html index e72ddbeb9..3078b99f4 100644 --- a/generated_examples/demo_widgets/choices/index.html +++ b/generated_examples/demo_widgets/choices/index.html @@ -2950,7 +2950,7 @@

Dropdown selection widget) container.show(run=True) -

Total running time of the script: ( 0 minutes 0.053 seconds)

+

Total running time of the script: ( 0 minutes 0.070 seconds)

Download Python source code: choices.py

diff --git a/generated_examples/demo_widgets/choices_codeobj.pickle b/generated_examples/demo_widgets/choices_codeobj.pickle index 9b85c6781eada4c388b83e476e5f52f761f9afc9..eab9bc77759149f35343281f06e266287f8b6141 100644 GIT binary patch delta 922 zcmZXTOK1~O6o#8QcOJ>iQg;2#!(WPLQbt7~k6uPQV5OLwTcSf*ubN}!B=f8Jm?qRkPn+Y;2 zKbv|=QfJBOid}Z5oa8+xStFHfIq%e5ucnl%*Xa7`v25MTt%H&E} z%W@vtY&p`b(hxP~>^%FWUGy1j%%6lPHQ0tf&R+V{=xq48&+Bo$fzS@G`9wFN6L~2x zhV7+5lxcdeN8@_ZBc2+-)S{k-L7^SYFj`^A<58m#PI_GMn=p*LX2jWhqX9+)_rV!d zVkY1m>ZI8sdZU6)d9XT%6H?ndH-zCySi zzPcy5jD9ZEBfq1DJ5HIdAhKp3A6iUp+Wo*)exB6E-uU=rIT2`OJ<@)!N&`;#iwJeW zSJZ8(o_&yxVS8H|7Hd6A1D`JMJeN%Pj;TJ<&X!>WT}}jA2>l`Ke%N%|yI*4q&2`eo z2Gma6vrf9r5&9fEP+aEk;~tRT)I*w-Q&2QP+v7$I-zH+H-8|U!aLCs7XGzx1lST{eQv+ N%j{DW{@d8Se*r$r2x1VJPVlpqM9=zq^Hp)b$x^|`y}e|O&^wFtS_is?euGL>=1pD=QkDHTeWjJd4Ewmo65sn%7hOiP#N zE%wUQq?qnpIhC19m&+E5%EtwbQMrpWQ*DublFy>-_qVW9iUtR$#&k8rt|;T^+H6e? zvgbk@R|61p@@Z9r1oEPK5|d}@2(G*8F#_Shu6y$V6VpGg zBT@zDWTcts>X+_vTCwbzZAd|%yO5sEWoGduP=zjGe?bVdLBSs0f?$_yT@#xLed2_@ zq6SZq4~vr+4~zTReIdxIVw0n4qWvhgZ#Q3JQy`rz1)WfJ_#+6yYlm+^0N!w(gjK{j z5@yR%Gpunw0PBbkNCY+z-;zFfkNAtk;RE7SV~BS*Iq!jwh|7-mne!g_g4iy#^WIm^ zFile dialog widgetuse_app().run() -

Total running time of the script: ( 0 minutes 0.126 seconds)

+

Total running time of the script: ( 0 minutes 0.135 seconds)

Download Python source code: file_dialog.py

diff --git a/generated_examples/demo_widgets/file_dialog_codeobj.pickle b/generated_examples/demo_widgets/file_dialog_codeobj.pickle index 64618757a67bb504cf5b47ef0b665066abaef0c6..e8e515950f15b494b8217c094f95a2dde7fca0fc 100644 GIT binary patch literal 6581 zcmd^D&ubGw7>!Wd)by7S3PtEelom927Ye1tQXw=nP$^WF&1RaN>1LDekJc6n1wj;6 z5L{1!e}Etef*=TjAP9mW2!bF8UIf9bS7)->oy=r1nKTEb?Wvi4?|t)qGdu5_Jv{yB z=~Sxm7i5f@WdXy3HQNn?%!*S64k#}|!wVmVv#a4uFun;bP>04AaB{9$+YN7qGY5El zz}BlE3?{Dmc7wj;!{~W1SgnJ?~I@Pl1gt^m)?X`4;7hDXC-BtmLf*YU6x zj}L=1bTz}$T{pbvRn!K4@* zD#YnX?Mt}e z)K(k_@ct$5cplz@cCt}AR-#H^F4=E$N$}N0QC%$FZf*h%u`#|mjP<$OX3yn(gvzvJi2&uIGn`SNom zA&D=)P!bTmPUcG`DzogbD5WP~eyzac&(}AUqvp$RWdvUR9R;iU@_RXjkMN-duIS4j zMbdjUokyw#b*iOBuZW4}u24KtcCR>dDbhY_LOh zJZ`}fX%~N*qj#Iv(R9IgK!d_zeo>52<98J9e9QHk{7Y`tIm6WL3T|ldh0Vs7b2^*J zBCOcDwQRedPI}rHfMbu>-97Rwr@0Lbx!esk$69W45(SFRn17<#&6c5qCs1?n1+?)6 zAo>08=ZI3LQmJT~7g}4LxQgz7Fva0yibK8&G`(J@YnhI}g^&&}UGkyjMVBr#)?`H= zJQ5~>#kY05y69{oPKTq9Gq}a;tUk%8Qz|b%mB?q4RX=XsB)Z5HLvXH$98lW93N%`3 zoI#hFh?1TXU15+XsI5d-)iP)5I>&HMU~`G`Oa=PtFHu2Nt8uh@4Yvnz{_v&Ayhx=&FXr9H^T$Xw}Hb zGOX5skITkl0yD^HWEaB$5fa7W+8IeTC4@gvDWqXZ4)#74a@Rz|^-V~cNsHKUK#2wy zZkUDZOXiIRODBwEHNs$nG^>lPK2rE-S_W-!#l(QL*-FbW+MSPEJtPNb8lD>`m%1rc zS!eB|8fA0sJkAJ3p*_E^zob2^DUuxM`V-|8UD$|>1gl=bVjf)i6Ri9pW6pzstl#(~ znT0FRr3)pu6ZIH|<6SVNC6wO-dqzt@R=s^zi^|nK$0&odfp1nEkRFn>>Qd%lEt?f9 zE^}Uk#~sLobDnYfwSrty5k&RN3|yKAOTfdB6r(KSs+uB3Ff;H8>NUy;RW(J7P-F1^ z86SA@bSU+aiXf`j8F=RcyaB38>1Hlk)Wr-bIkaV~XGzHr^;csw2nQCS1Mrr!%{$6o z$o9F??Ikn7ZTNdEoXR%uGgz*jjmn+yU$)Ih8fA0se9Q=6355|C{t`?(gCoAwusvLV}islgMEzgLW-XPd881X2AB1MAx6TQxSx1z2-UXU4_8Np7bpfZY9-ns_ySRyJ@86W>7gCS#c^M}-1I7tsZp;GyixbebXl z3sN*_ieutcIsN??q-oPMyU&@v&E~TGlgwOilZ-pCLS_urTj;yVg?!;$;DHuPfHgUo zR0-3#>>O=>%!t1|q@M*MB3!5h(DB>1l4vENCEqC07xxy9{V1ZFRK7RBz%ZLlR$0FK R8mCT~aS~ba+o^a^{skQ8og@GN diff --git a/generated_examples/demo_widgets/image/index.html b/generated_examples/demo_widgets/image/index.html index df34dd63b..be4ca8161 100644 --- a/generated_examples/demo_widgets/image/index.html +++ b/generated_examples/demo_widgets/image/index.html @@ -2908,7 +2908,7 @@

Image widgetimage.scale_widget_to_image_size() image.show(run=True) -

Total running time of the script: ( 0 minutes 0.047 seconds)

+

Total running time of the script: ( 0 minutes 0.049 seconds)

Download Python source code: image.py

diff --git a/generated_examples/demo_widgets/image_codeobj.pickle b/generated_examples/demo_widgets/image_codeobj.pickle index ef9707f2ca560403d48f54eb35c3fcab4da43698..567244410b893f887071b63712725a0d33342a2a 100644 GIT binary patch delta 240 zcmew+^i61jK4a!YgXGEnobsFk8N8jPsXeTolleFuC;w;Un0$(fi;p8WF+DRmy)<)5 z26u+!WIjfziD&mRs(=`%a_W=qnM5a_V7$s`HhCVCBBSNx15A#Squ2@=-6q$u%TIpI zcAPN~#6r~;GWh}fKgQ(A_c_!U(5jwP2Rv_I@yy&nz0nj yn#Cf@SOH`?F;-8$$!aiJnN^vw4$K0nX#}%CYFdCSTgLXu;%qh?U0{Ee>Hz?$Sx_bb delta 190 zcmew+^i61jKBMPEgXD>Sm5TeJt{me={Fv%mK3wu}Mt+#qx!*Zt{CpHO|Hi a-pyB!%jC;pY==mLwB>Hz>cra8(0 diff --git a/generated_examples/demo_widgets/images/mkd_glr_file_dialog_001.png b/generated_examples/demo_widgets/images/mkd_glr_file_dialog_001.png index 65daa34a1c48833c1c69ff943b721baf232d0405..4ab55982815e3c689bf00d3539957d2af9c2e04e 100644 GIT binary patch literal 4436 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 IIoc}hKUd{g)&Kwi literal 5893 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 diff --git a/generated_examples/demo_widgets/images/mkd_glr_file_dialog_002.png b/generated_examples/demo_widgets/images/mkd_glr_file_dialog_002.png index 4ab55982815e3c689bf00d3539957d2af9c2e04e..65daa34a1c48833c1c69ff943b721baf232d0405 100644 GIT binary patch literal 5893 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 literal 4436 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 IIoc}hKUd{g)&Kwi diff --git a/generated_examples/demo_widgets/images/thumb/mkd_glr_file_dialog_thumb.png b/generated_examples/demo_widgets/images/thumb/mkd_glr_file_dialog_thumb.png index 151a026aecf0df48554d3cb14676eb5eabeea6aa..0c7972afd64189c66a55763fd051beaff5032fc2 100644 GIT binary patch literal 8826 zcmeHNXHZjJw~mTkz=EJC0Tmln1*8`Xz4uO3L^??CU_(>{6a=IrNC_=35L##|BGN(& zARUa<&>=)ZyX(9&_uu{b&G+j%=#0rp&faUU^|ZrlEe%D+L+po8C={cz(p?=CYS%mX zd+NYGc*WH$)dz(-e@pr9Ej{nVxuF1ez450FOCw3WEo!%i_dI2IRV93s;nR<2ln0KV zI`uypc;$1w=}CV@cvG*BKl#q!;a(F%hrK5$xA6U*j`E@X0z)Nw$K>U0xE`Q(-Qha; zC*TIoYiF^={7TK}otLBZt;9O<+c$)0;X*V?T18v6WnU>j3MC_G=p~3kjfTE{f}m(J=cISd$_e=qjCZHeJP3bBZ?)#(U~W)A$3D)X?$QFVZ@)&%b{qg^uu-!Stg;pNxLw zj#3`~^T(a`AT>e${4x3S@7p$|2TD(d);}C5b#-<9v$769r)ng2MK*qhPfJKjcK7sT z8u49(1;`)RYb^93A1+c)j?sSYE)! z+EsK!Zg%$6#}I9=h2i`=Axzk+Dzm`ao$^?+QPswLWlny6ceZvq+#l~aa5E{8KJ8jz z)?ezFKwq27{r2tKi6XwMF;-WFgmgogI8>UqvZT2LVpZV>?h~hmE6DvM=Sl|A5e=tT)LUOXt{i$(|3HQNII-mwDS<-n>7`JciuhpR7o(Kd{bj5t-t~7$tvbX*Gd95bGTdH7gpo~JR-KqAR>(7Ay{{Hn62R zF`3+j*`XWqo8XlK=&RQ)n3N^lr`|E06-yl)G&_0nBnNfn;SFr<)|@ke+GA=pP#U-# zm6Bahps_O1+I2!x>RfY?d#}0IG=WmkwLX~=WY)awV;pm_b_8c593QixX)32<>E!6> zXy@b(OcB%E=75Hc{@A1&JfPPD-jLpk&(yOx3<%Jye5fB@UqTGO~A=R z!Fa1?*73>7+|*RLO3%5-wn<$Ji{a~$LuUlh!yP#UOfD%Btqhs^%ev z-M$lX)~hW-ZBr3Jo9Qa5sgwvT4q~ECgW3AI2DaZ`93=dSR1K&5oPXc0 zt0|q)njmUF-W1IvC>T31*Hi97CZ#Jf&yCb#VEwQjiFvE*V@uwhYhQ&NcNIFCnwB|r zzhpe4r>~zO$CWx(7m{04q*Lun)w#mbi3{4Y&o?esSea}yw6(SE|1qrwlO-Z5YG3z~ z5t?Y=*cqqhqKC#YE4M9*9==8gtZFl&rHq`bsWCBvn1X!MGP||eJ_*{O8}-{^!KtMN z&fb6S*9p5#s6~JHAV#qtD22DvE8He?YHBQG=^YVz78V7jP8IS|mo- z732RNF0`Npt~c&mq7pZ(Ap7OZeSlk=oBq(V;ul2n^YdXE^|_C0a~;)!FWmj~$r4|V zd*ClMRXM)qPPn6c4PCVd{iT>EOuaLOJSQF=*dT$bFCl&1odKq%mr&Vi{Pv0hbm9LzANnT z>l&;_J6&PAYK5rl<5K}`|Lkij+JEtuzP`R~(}%0<(!Thc4!=?_Cwt%idQVF?OGDqn zBKZWWxrpWUUA$d4&(^qLP)FoNRbiWUE&wP-c44LU_4Q@n>i(L5N~qBB*WZs(s6M?L zi=r%#iw=drzz!MP`w&_TdhZ{$7BYitu4Wc!;Wy2UweVH$u+bwoMD(hQ4t<82VM|K%RbvIZ1%uXAIi$R` zf`fzOMeJh)DrbvMc=AoID5=UlDEwGZIWJ*lZT&C0@$m2fbg#ng^g`JLdq%%L7xDl5 zc=E53*ja-+cb>!5Q2*PX-hJNLARP^@=Wgti3cd|z@xFoF(ObLi!N@7I`Ks8( zaiHhZosiY9`#G}#5G)(Q^&dUT1Y(@8rda^PT1yO%UA_;f2p|btf`#@{q8$f_zL$?5 zgtvolpR=yktz4asXJc{?Cf$7SUjW`nCwu@UiLVE2Z zRN_&~$4~O1tkYv5oSrxPv6gwYFxe$G9q0MY33?Y4!%5GXWwINiF6ZXtsFakH5GLa7 z-N&O1?HVI5_7_=&K5C8604^EwUum^-a3H-o$t!&S8$)ZNxb9QAFUG{GDk*-maxLIC z4h|0A(Wm?MOiXe_?0d2^GR9vqXIS72-z(jfU2oLH`_Y_`CW^%0`?|aJ#qD3RYp;l)FrO&=^XF!=5OxIR8K%~6gh&7j0`(xXG7@w zOPa}fwq2Qx%ZbXOL|9EHmy}@yD~Wdw94Y1nsLt{t>2YWtCAwt6rG)s@+K146Kb$NGNgWyO9*I*2jMR z!3%+^#oN`(O}xaV*ggB1Yye@|g&w{A5zdhdKx+r2L@cmXnQ`b34`%{B#elrA$xAjc81!b$cG`8zA2z?gzXrDGYKar-9vsZ;weVAKliA37 zdE|5&=k{U*(yrLk;k*<0|=>S_|2Y zzP8m+%;s&OM=k9iuIlRP>3zm*FUP)7NGFWPn7Y%3yzJ)(E7&F6vmdo3=Of_Om8stK ztI(4A{e*=#L3pN6yww1r0s^Yxun_z_ELf%Wd_Qv!azMA9@3V!2L)46WkFoW1 zynTUo1X?;#^OCr@c)XBxc=1v#+%$>pKA1ckZ(Qa!tDU{$jJ zvhvoHqO1&udH;p!!Ie{=aN2EH;~em*5CH z+k&>;`by`Hq^RmxTBi3DnEQSA3tSkkF5*)KpWzaI5xwxvnU57wMhILY(#z1?qx)EM zq=b_X03n4=!GZb?+a}9y-!a4llxWCqx$Eoco$V!O-HBzs4{JuI)o*Q9d?ppYsvWF* z<|ipx34jI^3yct{(#siW3kw|tV+;&IJe&@0Z9mglL?0oT1)dJJ1_A;wIXgRBsiLBy zzt}p0hnH8x^2d=OuaN+DvB#;G)Z;%JTKLFE!V&S~dUNe@)dnC^dtM#8;J&j(qlAeL z1H*@eQ=T~o)%tDN2JL(v@IPKQFgM#T1M&$Gc?#iYu~^-#nQlW&H!(@l139F%0q0)e zOhkh_2T)9Xm+IM)L={0nzj^Z}k$mw>;}7u4XPGF-b<(uK^tCll;Qy`3pzW+uhrYC? zCY7+W;yPAVRs`CxUkUh~`UlsCJbKNEE@33`E3fa~hR$Zc>F_ZSwAl=tMKSno3;!i~ zMh*!*N-wVW#laJ+M9GCIw%WhJh}rX?^i0ndxAoL9%kn8VwYKW}`Be`4OeT@zSR3$WVIJpER7> zqK))MY06*|oCwPHJ$W493_4!>7&1ir8r!G8d7;P~EW8LJEko9j^8(aUE|;C%)R* zz)8MpAj4^RX(VfK+-YrW>~Jg_%0xt6UNKQe3T+6+=Mgax3#4#WQWB9#?2?{&AcR5K zy78?)B#k4c6zpZ!-zBn$HSsJok$R$-cA=3PqQ0TJ?&L609wDKX6QcL9J|u7{i0hy2 zD~3qsU#$(Hh(1_)I&A^BYtOzZL?kJ^J@qN*Z%9zPTbpzi;)_PM=DlFaD$-PvF4Cl7fjoa}5ZXnTWvlMGM`x^Rs2zP7+jkVNVUH`TL}JWcwEgHmYd=!+LG zvJ2b1L-Y%B;J``AJ^7|t4V*z{*2zAZbSfolKiXRk^f(DoK|m*}n$pw{4g)c5lU-e! zviZtyDcN6Gq*Nq zkOA>tzT6;QW;xLkhv;AgTaj&CI++o$W&k2Qzbd2D@X{S+xK6 zk~jYG*zF;g299{ypcA)g3LcQKv%TR_$0#b6Qqv~6AT{*3juHF|qCS2^a4wj&&+V7}`xMFMXd51Y zhxTLNf+ZHJR=5L%@t)8;Iglu%lxs`-uQRcQ)`x#A>h0;7IJ;TOr&?&#(#N<{evStM zKBka}{uNs%Cr_s?cw4P?YnxV!1I>)c@_1>#Qt)EnY0}~JuCj(g3P*W%SU}6bAOg0CopjPvPB9clR1z$0i<$P^7;7qfJWW;H9#;EfRa;Q1vR&{Nd3MY88YI` z!veKV@x}xN1vOlVQ_FO0s_AZTe;4y~k@R&25iOaS3NR^1yMhJ;A_r4}x9=4|BCWKv z+rUO(eK`FWpMo|=hDC`x4Y7&n?fpzBm$2z_|-P2v> zi~%H>K`^SoypjYS1^gG_Imzc3no{(8GHCprp98ZLb_t2eiD6) zG(uh~2j#=p?3zi-(9lu~kkH(kAL|`~T$UKjEW6Z5uN+r(sT^8f_n(0*;6|LghPw)f z^`f^Fk!mC3_4L@Nz*NnVeyKS&wJbShi1lb1X&SgN>xwXQB!x2>@d zz2_X4l6cRP&p$T7pZPzFJsP5VDGEtyKohz>^E6bkm($TXBi3as8-j8Aoa?+JUyESSo(J8+gvDZ&!J-4@s}Bg@tI;}?0_OSZ(F4H4@1JbS(u{W<-1oe} zT>%e+a_y8J&=SxqVvy-{U*#%|&a2cNL65!+I3hA3a=}_=`1Pr8-`FrSszr04& zdtW_s96)LdP7&H9qFk8y+%$Vg!#R(=h1~ z`?CcQK8tVx^#FB8hQB(1N~Lh1nU$gaAVRbCtHST)j#J}d4ONZ=#STAJ7S04T6N(E! z3JZh}oeHVFB11;5F(V_Rd5!8jwM*T7eOEz6!ovVO>rvEWJRAZP5`uh)vGI4g`Hew3 zAR~9>3KtsH&ItPF(4j*g)Gj66IcU!BxT_I_-+Pg%7R8@;*j`!@7k|%T1w25?{HK98uvkw z$7TivX4nkXSRN1wV0gpA!T=27WdaDGwFZVl_q&Uyw9)F>zdaxbXc#~uE-{DiTAfOd zm%apzX-EkPWBn_g!PGpi1OAyjZxGP+09$fwn&P=Dqxlk>5TpNSI3YX%ffH2WZw96>X~Cl z{jtAF`N11P4mUXh_7~z9eaPXA_%dlDK^PFWvcElpwpUV0AXNfxt%k2Rsq!vdUS4*m zb{pD5AY(#s$IAR2eSV@^Lat0@BSY;;)N61{V0T16!oUXr|OzmtLbB z#Td*!9aYUJF4l#6fT)iAyu9qX)m*z7ifC_Gvk8P6ScM35eq!R;A#ZXRqTv8ufQ^M> zWjr?YgaLA)G!TPUI#xfKmxHai62&KNe*JSF#6~PPY}ed-EEoys0TrM#k#H0MY;_fEa%5i#%ojLIkRd{e zdr_C4I1a$f+S%K8g>y*4+g+^h@GakfV88|I2(x!XK$#0^DDrRvl2P&XL#Xx=ct8TN zGuQyQEwGyzP;iE0WkQUx(bXmI!M?>c#1#t-2VQq x|KuZnBmaCp)E9>T-c#%U|6PRt>(?#-21ve_{I62=lhJ$=e?d2aTTX|gz+RJ6&2MHZ7u9|Dk|z|_~T+Y z2>)?6edR|*CDf&jy?Dbnb#c(o_r}I+%Ia2Ll9TYmXf>?^!cIpR#B{})N@M8ovaZl-|I9w1WP;n>lFi+B zRdZ|wjjL-`@xTNl~o7QVKH$e+nAT>o@Mgt)+3o?C+nQFvFG@-wY7ysM8>?U-5gTq z=>-J^ABKh=ynFX9mGwzBGkO$pHkZfeIiE^0i|XFWQhA7m4;?ymfaYOh`pwe<)(e9^!*A;9$WAVyf$A|@2f~^zT3cr{uF_7r zqP4WN8YbP@81bLbQ+-(v!ex2i5h$>BB>@bPv`x^_)io)yreiuTX*vBp4U1xf3aOs0{M{-|A2*FA;)k1+ z1v-yJVo{si>o;CsouQYNwKs`3b8jnVI2bI8H)jr0SF+zR#QJQCEX%hQ8<#nqm`?NI z+xp|dLc;7yCYZV(Djy~&eX@*J6KI(0&3*UwZTN;=OAkGNU_E-$-hC-%37?Z-Yxz(O~dhe_xAOq)iV!fY;FJjQU~ZDAqh;%7rb#gN}L zFM+Zf!z8Jv}$(=H_4~ImN}X-@fTk1q9^2e~&rO)AQqpr7B5H zz%mF=AYhbyma;N3XxfUyu_$=wbwfi9FR#-5U$3u*|NeaoMnJob9U#;b=jQG{`t)j_ z>)EqsJwJaEL^qGfGKIHIW@KlF4mejoE3#=>`+3`CwUJ5YjMJ|(hIz(T{BP=arc!!( zdq+3?SACUp^7XtcO?{R5l=(#F~0ib%!Xvw=mL~*f;+M zrYt|?OWRhw;$M5m-hO<;|6yD%PsSFfO5AqME+vnW5FOnhQCQR1o+S6~{rh5yR4Q)T zen{Ul&F8PtUs8^u!FQ~wV;Ikwt4me$(%;(JiX$`Y{3l8IK5IIn~_V0D+iV+$pujT@?>JO5U&$#8!`mR{|Z!UbD>C7}KcOJCYm`L*( zvicm(<~jfK*|kiKBCmPF-2l7M#*ocVqc6k_xRkslgAX3DZhU;GX5;7Wrzhk>k$1t2 z<0Vb3H79DfhHU0~-lYbScmB@xMkdMGUx%u!@mu%ZnN0B8=ruYaXLmRxBqYzYGFDf* z^09fXzii;P>jkG@YG@w2ws@(-e9DRQh4tw}wE^qp_507*gfu?*u3C>wxDEufU|L}c zZ}ao_FPM+X94*-}#pT4=r~8F=q{x>9?zkUh=Fx&trrMLBX%apK)6tj7v-mA6}kr zjS+g0kTAZ!g&wb;||2|0|>p&$apj{apzXK^Rt$5YFxS_4E&3f>oxxqK-YWm_hqCVycb@%4A%(@ z3tzo`yRC&k=!&{JZAbF?5~9A9mEc3Q2hGhIjiYDulFtdUGDOG41$WO1^DujCuUN5j zaA@o6N6m`o?fG6tu`%;1VsSWTm~qa2{eVk7?*r%{XeTi#DO(sX&%8D{he$}S!|!(G z8p$lxtmCS@7r#LX{i^g3jT6<+wrP3px%4OLUSVzgAr6rT@e#)D_Y!>=U!jSQyBxsQxzIpRlyzMmugC=<1cWi0JOh~ zZJ7`-hr$^iiriPQW@jxQ(9_mFbi2%H^qWLsRuF}}nLPf^AZN_I@@+wZh=M{AaA3T& z**B<9aY@NL+bg4co8|RyfB*peqxbd#$HvB5TU$r!c9$~M!xD8J8y`O*@5}=SSfPp8rl?ff*c5TwI(wnx}cz z^ZM1R4bTOCi=}6?9&B#m;n!y&~7MD0ej>8lvl4_JuoS;lLaV(`fqAtQEkuGOL?1{n|U+W&=kMX z`;=S$Ic0yCVmsda3~8_QbQ}?bH?Hy&&o#_P2?+%^HeM3BlGyM}eyFv=Z5&$8Vy85} zpkS)uA#KH=^Y7Aon%A$h$J_STPqat?0YRx;y7UOYxvCAw_~OM;@@_pP<R#!r|7-V3Zs}*d*`d@xDDgCsLwcd2@er=??a_EgDB93R!O;V zKSMiCOtiu5D7~XJFeg+at7R<>a)lT$%8x-{nn8N}@t4 z!k&nahX!3G?=Bk{8MRC%SP(SKy9*^msNEFP5F7+-uAEMfBu$sl#sXCVoP&Hh%E>t} z-$4u_`xzFRcVt|SevLf^>s|ZXtq;riHufd5zw{pGy`OoXiX|Bt850#eM0|$v@=c*f#z{eBIVMi& zELdKu&ye2%8tUEl><=HJDLX{UYkeX{(!3@Sfd`NaKeDtr0z?sY1MJ@ngKBGOSpwHU zgD7ciY;0_{sNJ}6!xeZ&&i}8&bAHwDsR|xkP~}igHv9iJt`IS4_?6Eb`q2pqEgbsFpE9E` zI?F?~K+CbQ?9TQ3-v73iSsM0s*89uub0fS6r}-j2{;XvKRe z+5-*xgf$NTttGvS7pd#FzsQ{XN)h7Z7vKs=_>3AK7apU{GYCF*OQUbmnf z;%!#}v#3PtH9-?-=it&7{1QKZ#_oFGA1Es&ZDuk(LB%kD(gWW4Ws#7W==&QZEG|C# zvGSz{NhJYqJ47UM4!J*+Q?@$HBG%lo=&5M`Wl&arWOb=+~FObS8k z{M+Rss;b2O-7Puq1!KZy39+*dAK+XyD}prL$&)7$mT`1+M4AnDagCp{%8w8y08tdQ z*L7p#R*)8A5)$Je6{Ps0!T>$*-n%C*BQp(UJq~X|T1zEh^H-B*yzS`vPQ_>_x0tl_ z)NBqh`|VqXoNh---=w?S-FESTB51oBBnCW^90qGai% zT&N-cn};Gpn!M|c?&1&fyafdXD`;=OLfD_T=+3yzlzka_trPo6yaRpli?HBjy{ zJszc+4ZX;t;QqL)>w0?Nnl>PohK9z$^=VShy}knBQ>SF_{ggB;F#X!Cui8=CXRZq_ zN`GLgrbd~{+;^0Y3PawuG54Q+L&B?Siq=+pFY1_@@&LKoOn!U0x9Acy4&pTjIvco@ zjgzxQmAuLVr1A3Q%l72+ZJ1n;-~dcOyR*MbCFoiB?m)XyIsN{4sD9WbY$;AqS4U@z zvwj=#ZzDhimMbHlhLeKJ6BnqVGy(Tuf(S)}3E+*rD)t%n(1G|9+#irC!vPv}8V*Dj z?5``@Y5A8>3&JGSAmX+8eT*0WhFI7$#J9dj88-T18I($(m8i*TA zuhgxNmTMDVCnhKRHAkU?0L10I=58d*yWqUN%kXyYbB{g#Hce*4je#*GlC~;ktp7ga zVhjO~BPuP;TtBQ20tRf{?oxHs=HfsJes{AwJ)vb>5E!na0v)g<>L1F%a3DM~Qiwgm z(j;ExH6O2CB*FRGU-gxOx_@^IDyL3j{>=yt`Hmmq3))*PJnw01avTK6Q-0MUaYN&)Mr`F2guD4Fs=1(2S2o${c)ET-;@T@mK^F z;o`Egcqq*^#6*NJaUy%5qobpxuWt{Y0MTuCd&B~?9ER)gdlRCnqg}c(rKCSZ*d=!l z4+XGbnVL}|&@bQ|WbN9y5W9gWYfvI3b{#HB zYSFO#42~X<)}T)U%r~b}TH%k)-4!UF*ML4FXNlv?3bt`#ES;WXezVBzQ849qDfU~{R`~IdWbl_87rT9mW zXaG3vTIODd@ma(F51%|2&S~!Z5CGk6{F!|0ix*g^lHT6lk9T{Yz~a0&USslbSZ5(6lzBC-LbQC2W1|UnhI=+$K5{YIM-vv7_+_Yi-0z41tJrH zi{aHj`A#`FIZYr0fB*MKYFu3q@<>4A_IIV_tbnbhiRtO?H@ch!6=RHGb&fOuSsOzx z123_K13P@;>|>aCSFx?`Qay!0-XR5no@;@Ft+9NsLU!}_bTrxC_$E*2m4f@2Tq_lyp za2%{UPkZq2E2BblD(Is0g$1Xfz;!)kJ{Cl$;Q#%l#uZ%2efRD)7=HK+O1K3Ps@HDa z`i6+n4^~ZDy1Iy1Z%!@2cI~gSvzyb^{YDmc~l9h7W;EXkPvlsbwP6EG+6Z#%tb%PXs1E z4LFZi%@+vqFt4`?MUAZQ0B2U1N*|ZH^%?1NM0UCm)>C9sDXvPRF3VMKSA(0ZIt5EZ zCH|$ZhZOoHNSh&`a0z^k&Fb-3xruz05GU0s!N=V6XO&6+m(VRWa;7y6sPv+4&1DlZO{ z=h&0dLA3#qxzuhPpC$%j#KpyL7#XdPhVggR_<2BucOYF2G8h;GOnhhlZTWz;cYwAK z1Ev5_{eY+7>@}cH_=EOjt9_QIK)#&2|N8}#bVUP3ryxJy7K|-$V{~k6BY=uNgeCe) z>^_QV3j^g*pm7k+1RDa%5HPcetofW-sFp(BUHDxZ3H_<)HHU?00HjtX>7RRF@vw#hRV&4AKd&Aw^I37tlNU9WN#9)KL z4_U?2(NKezhY*%nb>-8IE3`C}x?crFMV(|Tk?EvNs7P!(^dLbL(V$dfGeZ<#HP>4~{8S1l0~gbalaciUUp zXUP-^2Vm`$u=Vwx+uwu*KmwuU<+nZ_JGC~rewq4Voca&ITd<070u%4=LGw zc*vT-n`l7ev||nlPqjH@$ZqHHmf4!*=uHsLvgeo=P{7De7twBeUlrD9>LgqfdLU0%gKv$=8Z46)`u@LKtxH@AA|Vc9CzmE645 zZIPU=wZ)xcIwiObfNaXq@m=kjew`ACq`K84D+t0MD%liWYu0HesZCT1R<-|J^bUIS zpd#(V-Gs>Z2VE5fzL;r#C?4_H!c>K?R8OuO9=H|5F!Un6=f?}ziHUnkQ+wScHL3t~ zDTG-fddUz$dHnX`THBx4+Ewsg;DREB#4|QI`DAz0xvooO{OR zVj6NqvA%=ZNOELs-D-JfpNY%qt`qoo#We7(pk$H4gVjnN0 zm%HT6F`ujF8WBjx7@pcZidMiC;M-XuzkH>oNz>AjbY#%Q*_g2Y#A#sbX!aiq{`X!g zww~DW6NtA(;vg&vt|R1DS>f92l&N&ziT#)|Sr!OEMYs-+c`CXg*)`w3vMpPTOH$Kl zL$M?Tn6IxgM70FBO+J~mf%}9`-|avQJ3BjExY%d;!!VPQZH>!Y1{M}k!^`yHj#%pp z^bqfZef<38OH6#cMqpsgm>|miIHIY?#{u|-q@|y$39xpvy-uWqka65oQCml+akl4A zO?a!%WzXRSSG2XF3~!uZ-i$`&pmUA6i{#SviKmVZ4v5!VS*@E!AD+b&mi{ ziiFrm9O~tDp8JB+2ry`NT^-*80655%AqCS!BJ2|voVW~faFc&LNR#h#3#>s1+wb&; zr}8p}?}0^_UzP?ru?1Hu?xZpx#h&14e51c6tsCEDL1dS(w7GeTxnH&*VEp2V9)@VUf*H3iD z@n4W@r;$&=l`D-*5WtK8Nx^+gY+_<7Tr0r^9nsG!50kA)Xg^1fQdNZD4Q{Id)v18Z z1;F5dZ-dZD53U-*A<1lhdP4Hn$8h8nuZm$|qM)z&4^jULB4=31#PFY{!xB6p@MwnJ zcO0rwpaOq~1h}BQJ;pvC`dxOv4LC#$+Z?#l^)gfy_&;XmC1B^Bb@sCn6Ww*K>+BVs^_Hg1a^BQm<95|w?CUB!&5Jhx+a2k zT7wLh6*gQ)=gI7T%N_Rp8*o7gCI^xbNIM}M3y8@4*$&T}bk4v0&!~`-NYVre0zrR~ z5lizzku@(Xy7D`Ql_Bu%bu;*dgF*?ecBFUFdwkUw?x^f1H1DUzNOY#*L@`7bBFRT& z$sCKVqxBSg{ongDh|jP2*Mw0h5zmAF|D%fk!#hCczxWuH*yz;v9Dd|OrF|KPEx2U) G=sy6Kvw5fh diff --git a/generated_examples/demo_widgets/log_slider/index.html b/generated_examples/demo_widgets/log_slider/index.html index 010ebabcc..807396496 100644 --- a/generated_examples/demo_widgets/log_slider/index.html +++ b/generated_examples/demo_widgets/log_slider/index.html @@ -2916,7 +2916,7 @@

Log slider widgetslider.show(run=True) -

Total running time of the script: ( 0 minutes 0.070 seconds)

+

Total running time of the script: ( 0 minutes 0.049 seconds)

Download Python source code: log_slider.py

diff --git a/generated_examples/demo_widgets/login/index.html b/generated_examples/demo_widgets/login/index.html index 21f4caef8..3b2a0dca6 100644 --- a/generated_examples/demo_widgets/login/index.html +++ b/generated_examples/demo_widgets/login/index.html @@ -2917,7 +2917,7 @@

Password loginlogin.show(run=True) -

Total running time of the script: ( 0 minutes 0.045 seconds)

+

Total running time of the script: ( 0 minutes 0.044 seconds)

Download Python source code: login.py

diff --git a/generated_examples/demo_widgets/mg_execution_times/index.html b/generated_examples/demo_widgets/mg_execution_times/index.html index c1f8f8499..cd8999ccd 100644 --- a/generated_examples/demo_widgets/mg_execution_times/index.html +++ b/generated_examples/demo_widgets/mg_execution_times/index.html @@ -2862,27 +2862,27 @@

Computation times#

-

00:00.612 total execution time for generated_examples_demo_widgets files:

+

00:00.610 total execution time for generated_examples_demo_widgets files:

+--------------------------------------------------------------------------------+-----------+--------+ -| file_dialog (docs/examples/demo_widgets/file_dialog.py) | 00:00.126 | 0.0 MB | +| file_dialog (docs/examples/demo_widgets/file_dialog.py) | 00:00.135 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| range_slider (docs/examples/demo_widgets/range_slider.py) | 00:00.077 | 0.0 MB | +| choices (docs/examples/demo_widgets/choices.py) | 00:00.070 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| log_slider (docs/examples/demo_widgets/log_slider.py) | 00:00.070 | 0.0 MB | +| range_slider (docs/examples/demo_widgets/range_slider.py) | 00:00.068 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| change_label (docs/examples/demo_widgets/change_label.py) | 00:00.060 | 0.0 MB | +| table (docs/examples/demo_widgets/table.py) | 00:00.062 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| optional (docs/examples/demo_widgets/optional.py) | 00:00.053 | 0.0 MB | +| change_label (docs/examples/demo_widgets/change_label.py) | 00:00.049 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| choices (docs/examples/demo_widgets/choices.py) | 00:00.053 | 0.0 MB | +| image (docs/examples/demo_widgets/image.py) | 00:00.049 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| image (docs/examples/demo_widgets/image.py) | 00:00.047 | 0.0 MB | +| log_slider (docs/examples/demo_widgets/log_slider.py) | 00:00.049 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| login (docs/examples/demo_widgets/login.py) | 00:00.045 | 0.0 MB | +| selection (docs/examples/demo_widgets/selection.py) | 00:00.045 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| table (docs/examples/demo_widgets/table.py) | 00:00.042 | 0.0 MB | +| login (docs/examples/demo_widgets/login.py) | 00:00.044 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ -| selection (docs/examples/demo_widgets/selection.py) | 00:00.039 | 0.0 MB | +| optional (docs/examples/demo_widgets/optional.py) | 00:00.039 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/demo_widgets/optional/index.html b/generated_examples/demo_widgets/optional/index.html index 19d190394..cc02dccd4 100644 --- a/generated_examples/demo_widgets/optional/index.html +++ b/generated_examples/demo_widgets/optional/index.html @@ -2915,7 +2915,7 @@

Optional user choicef.show(run=True) -

Total running time of the script: ( 0 minutes 0.053 seconds)

+

Total running time of the script: ( 0 minutes 0.039 seconds)

Download Python source code: optional.py

diff --git a/generated_examples/demo_widgets/optional_codeobj.pickle b/generated_examples/demo_widgets/optional_codeobj.pickle index 088f15ce1f278849142936705a5c99487024b0f0..70919a05f5a1f0c721a8c8926af2cb02f385f848 100644 GIT binary patch delta 476 zcmXYt-%G+!6vx@lc9n88%rMeKQ9=raQtuIxAVfwb1X62E+ZIm6xx$C&xfqn(`x^ZP zq5nevKo7mtOa2Kx_T1Ur%lUln_Z;r8sXUdRmD6awKeT#Xt;5b)@s1Tep{v<#=Ec;L zep|P+PPI3%nMdqi%k5xJhNHgKHE>{_sE*ki44Jv$MJ-3wJDTG#I*DZCOJ?lBZF}TO z!HHXc_wgh}|MqQc!#9GOqaGv#vm7=*cnNmUXZ#_yXZ$MNqLQTBqN((Bj3pu^aCa-iOArf`~UGx5^xi`pO4T#Bir~S L5-kw_&t2soP&|xJ delta 511 zcmY+B!Ak;B5XRY^^{t_s3vEzZf@EYS3lT*S1VLy-VGsm?A!b`|Nmom^=+GY!tdP8S z=+wQN&{^spbm)Hwx+HY$*6eE`I(@(S<{JiPdU{X4HRs8(*`ke0e!w%=JmV=&rEYOg z&$~{wZ8w~PYyb8=Qg0l&HH&v&Q!y|4TaWP56ompg95S{T7*rZDfU2g*hYQ{ z#aS_Az>eT7?4r(*33fpY*b|(Cebi3il?3OYjQUC9B6lb_3l?fzodb%xq0Yc5s(+A< zYJd~)ld6}_sCMI8UbxuwFJGwzKcT7@E$=q1s$Hq&8|QUShdk20YTC{TrxAMLPvPq@ X_BZ)Ia)nFY)CIf`38#s_#5I2a)KZ%Z diff --git a/generated_examples/demo_widgets/range_slider/index.html b/generated_examples/demo_widgets/range_slider/index.html index 5a2bf5c63..6448fb0a8 100644 --- a/generated_examples/demo_widgets/range_slider/index.html +++ b/generated_examples/demo_widgets/range_slider/index.html @@ -2914,7 +2914,7 @@

Range slider widgetfunc.show(run=True) -

Total running time of the script: ( 0 minutes 0.077 seconds)

+

Total running time of the script: ( 0 minutes 0.068 seconds)

Download Python source code: range_slider.py

diff --git a/generated_examples/demo_widgets/range_slider_codeobj.pickle b/generated_examples/demo_widgets/range_slider_codeobj.pickle index 9286fdf81855d2f173c51e38a7ac67c41414352a..8f866e5e7aec46abff78cb36019ed65a89ce1a77 100644 GIT binary patch delta 223 zcmZ22uv%ck!pRrebs0q_|7TZW6rVWz8l%eOx$Lr&`xyfnwI@GhRAbbeT)?C}S)1uH zqa~On$;!)UGueRoAEWnVeHIT!KOm_(c`l1IV<4Dyk42O*1k3`d44)j&syul;s|aHh zkY&smJ9#pz0Z&2(PiJZE6pak_9^T1?tcr}ulRvT=F{S}Yxye!N0*slH+t}nLdjYlO z09ksB`IEP@888-2e#WN5SUTB}U2?Jxy9i?ikfq634R$a{Z5@!M%h3ojJhfC00NQdu A=l}o! delta 227 zcmZ22uv%ck!im2wFv?8kXOf+4$znKJl1YJ4d9oFg8l&3eM5b?yhCotzay2tAqsin1 z7OBaLnV&E^Prk^aI(aRNGNT)i<-q6(=3BCeFlG3FnN=*jjQ*1wSj`!OfTZ%|+pGeN zp_66VWG0_t6Jd-1vUC`uC)cvcf%$PjmL6l`h($ diff --git a/generated_examples/demo_widgets/selection/index.html b/generated_examples/demo_widgets/selection/index.html index 2e1e33567..4390487ec 100644 --- a/generated_examples/demo_widgets/selection/index.html +++ b/generated_examples/demo_widgets/selection/index.html @@ -2917,7 +2917,7 @@

Multiple selection widgetmy_widget.show(run=True) -

Total running time of the script: ( 0 minutes 0.039 seconds)

+

Total running time of the script: ( 0 minutes 0.045 seconds)

Download Python source code: selection.py

diff --git a/generated_examples/demo_widgets/table/index.html b/generated_examples/demo_widgets/table/index.html index 81e37fe6d..db9ffcc79 100644 --- a/generated_examples/demo_widgets/table/index.html +++ b/generated_examples/demo_widgets/table/index.html @@ -2898,7 +2898,7 @@

Table widgettable

Out:

-
Table(shape=(6, 3) at 0x139598bf0)
+
Table(shape=(6, 3) at 0x135339010)
 


-

Total running time of the script: ( 0 minutes 0.042 seconds)

+

Total running time of the script: ( 0 minutes 0.062 seconds)

Download Python source code: table.py

diff --git a/generated_examples/demo_widgets/table_codeobj.pickle b/generated_examples/demo_widgets/table_codeobj.pickle index 3273e50631e3cfa7ebb86aa27f4ca652d2c2f1d9..bd2d1cf9967eda39e4e52284bc607726d951e9ed 100644 GIT binary patch delta 2065 zcmYk7eQZ-z7{)p8ZQ1VDZr!+D*KOUpwd>lhTi2D9wfo>BfX2xZi~)fVzzMs%@(l|j zPG(Gq7$(XCeoRGCNJJ1dqQ(V9jYRwh)MNxg7?6+Twj2zKJm|9+yT==Bj0#T^*g> zUAy&cy$AbpW{O^p<;ch_7Ehb>u|p$$n~7U;?P5Dl=a%E$+G`9KVbVXv2l*vwXMmBHevVu2Scd+!Zr|R$3>S(nk$xIWOG5ByLDGLTagm2V zd62P%^s}aO$Ymq_JffZmekyQdNm3VIPPgA{VJxFM$lT$$NZVG ziS%peEsc_X1H+|$E>J=GAB?S}|7kjA@@;G_t0VnC+$^h1Cl50=2tt*2s<5Kd+axkE zgq3cG(9l=jDqI}HQd5z@Lv>$Ts>Fl|xWWF`SSFfcAxn77 z@L6icL?#C6otC=s#+{g*;sQU^`%zc#qeL1v*B4VVjhsQv5@R$~pf&DCFs{)IiIZuT zz{Yrx?iIKgFTp_EM{N?PQ2U6($#c^vH+oRu;AD?kV7|l}S}2gy;5D7a66>(dm4lv! zTr6tPs6${~Lp7}s*xOJ~U2-VJjRuEhrTm1c6P;*JWXfdAnlYo0)(dQya+tOXlsBHE zXXQ|W!la%01a2qGFgv-0cBk=Uhm&5C7_s!r5|5@ln4Nln_6hW-e6(NScd8DgjBZgbb z=!(Fl#0zvyKu=6oe;-|kze6Wzn70Yf;j8dPxDwyi6!UdxuTJrGkoriqov*{O>NdU( z$Et&pn zTWrHpmfJa&nW;PQZ=eEgRhrnzR4;a6X_d#+dzfm(%XqG8vUruF*Id6B;b6HrzmF+K z`w2t&Q`Ccey!4Bcm2u2!d?HU9^SN*_BW5)|8&fLY%qp@P$HqIWGc~Jme7rM|VS_7{ zi!G`<-JcV3cAe@&iOSh0N7W)#!#Q(ZCDi&{+~V~o)cICpP_8J=3XpMjSHOwkEZOIg z#+)B@_#|WujVe9`8JE+_NyZiKPys^O3&{9|8{@{QY!%&knz%lq3dy+19nx?+yM&Be zCI)Tn{>8m=VV;fMe@uMFR%kWu$P>L~<8Dk)mdxi6b#;ezb@!^ZoB1Ega4Dz?^;^8-tN89#DV;P( zbqe~lApZe`D4xc(S}`Rgwoo$d9CF#IS-}NoHENwcnwmzrZblm4n4~GjEXj>@uY!jP zsxjo!s7+!MwJX?D5T&^aa$G*HVD?%u9+bM3<|}A-HPXWLtlVm`f&q4x%E6CI{FHYn z2p2Zd3OQ7nPM3l=3lp?b4i%=eMuE+pr1f&BG@Wh*Pr6g|m>dGqQMcUv^aF_`^(qJ! M9nS6>HM?v72gqG;EC2ui delta 2014 zcmYk7d2Ccw6vjE{&7+-Zr=6BJbjq~TPG`Ez(#{OsW~MD`Kq6rc2?j+Vr11JI(26x0 z5z)Azg6QXh4MYqHNfT7SfD0;WKommMs9;?X6crFsV?r=4=)L!~>ObfFzVDoS@0)k; zyR&`Wz&ghU{prA7$C}Y7sf^^9U8Z|u-!haoPhxX5Zf*|bn7z{KL~g^IY_7*pT?x)K zq}aT77@c^(z)$!8tNu(GY(Dg_OpecI^AQB2<1mdgNi^9%iIh#=ULek6T zGuR?}%TrFAPA+6~JF=-7Hh17`%8w1HDmHg2l#A{Xlwfl}8ET>3m^{9l%~x9VAP+*Qj~b}e7o*Y%W{ zXa0h;Gl=H0T4bFGx(dr#O}``MD#d^^M1LvToHI_hM$xEIO8H%eZfUlv)~(T!ZgAD> zmQ&J0u83~sOWNm3>Q*J)8=5s!a++ro9ubY6HiPF$Y~uxlqnQLRBuvVN#0;f4UFOuRMN&`T z#e@ynG%vNQa;fEnOTt+pQyA~G6%pa4wl?mTsa6;sUPExTSE)sAl{lXJ2ou^fe1}Zc zs^>1kp7t!Sm#IcNj(g>+sLD@i)`Nr<9lP@}{3<#hGj2m~v4P(F4|QvYY?)*g2JCg&Tf ztHh0UA38K17H`GeG#Wc1HCPu3kyFrQ%2#@0%u9ueqIGU6#-?ZuF2)S<3Th!A4o9Qp zM=BP8I~JmVpbQ0-E{u37tVqsYi@#$PYGhPUg6ffow@^~VDm)zbP$Q1V%T>KaP(5YP zP+zHZyPzaZ#FF}Enj&IQ_VYBxjHZ6aZ21fJG?gRU;^ujbdz$+li~i?17YkwEl4F8L z*kXJcoW-kT3S(B4pL)<$mF2azaU$fV+i|LDCfzAwooZNzm7xy0M`>BV4_}4a=>ZYz zFe&VzhcPc4r$@0qJe4+!SgA%mfotJrdP-?I>RD{94kA)(P`{uQZO5_dH0=;Ej7Muc zv=iMm6{@~VP=W@qt)_)`i&&-VFJnS&NY(cVYUKTl`D5O}!9)SN4X-@ie1x&oXvcL) z+d5=;`M9)#xN5lZs<5|t#eL%q@h6Ne-Y~9=_48*EGknT+hP-b6l5x$O=5J&YUu=no z&oEYxt>f<*gJa9Y1jFC_k5aet1>2U(U9wRu$3u*sk`(_cQ@NVu3M1E7i32`^f0LNx zKNz?8{K~l|G3Fpm?B*HWz)QX|hvPqyi;F%F=V(ZkR={6suuEcs-5O3-HaUw$r+o{? zIx<|MVQS?Q`IW9bN~PV diff --git a/generated_examples/generated_examples_jupyter.zip b/generated_examples/generated_examples_jupyter.zip index 50dddc654906f5b92d498a00bef1a126a845183a..7778a4419b63917632cd1c5055d8601702c0ba40 100644 GIT binary patch delta 517 zcmXYsJ4ixd6o5N7Z$7ey9%fM~J%?H%h}7%V8}_h-g1{PrFsP+KN(iEs(m!$tqK2Qw zgpe*YUBacNmT-xrmWHCisfLJ%28Yi1?JnQ>&g=fCn39Vr**-H>X=FvJ_`V ztz4=h+Ux6NX`LBvXR(TCcAc7unI4z$+x{;rd2XmA@>i-ZOB>9Hh2nN%Vdh%+QPe5= z^@XhP*`s{Ls`_I=01)n$5qQ1OiveNu2Yi=X%XKWT}ml?Xo3q11;aH^ZKYt;0gWQF&<^i1Wx`zmW+}yTkv@2mDd-%4RtuiX zH4g-cdmac8?>rE}^SHwc!j;tMlxjzyhuR;I- delta 517 zcmaFb!uqs@l_$WPnMH&F1j?Hi@~|?MH*e-+{lg2Qd4z>nnJSw%D@Z(L1JUgAGuc7( zA~kt7rmE)6hjl)2g6QpLf7n6vR=ZWKOx4Ys6J7FoK>SMqdsspAgfI!P`c*N@!ScaL zm%#eeb85iyOAC#`^sTZ^Fr8Y%!U-}byH!#aM7J&C;$Z4(-aKhlgaT80^X50FK7i%# zU2))I>IJ&*ezq!*-rmc?xRQgZuX(!#FC#Z6h~X;6C<+#dkz;(#3KH>DVPs?nF?_Tc zuYyIC4H;!PfZm<%Xvt^~qMIxkT|o2+OGY1{cc+V4F}j23cq>Lv5WUI@C|=b({Rc=K zNIP0Hx`OBqYaqY6dHO|bpnf1<+=kHuL?_xn_{(h=y+QI{Y#7}@;x@KGK9KITg~*?` z1)2}!OW84cfz+kh0nG){YwdvMb~R7`X2<9c^!{{rdx-pGd!Rddo2Ngt2igOqwH<)` jzUJwb4nTE4`ji7>7>HJKgz$?Uf$D(#y-+@%6Jt04yyLL` diff --git a/generated_examples/generated_examples_python.zip b/generated_examples/generated_examples_python.zip index 1071bbf0031aaa35ae3588640a18cb9adfc07286..d26dc1f3655f63ce98d62128e646e82de2dbe39d 100644 GIT binary patch delta 496 zcmey-%KW31nJ2)TnMH&F1kzhK@`y4r<+pBDW}MFnqK|OhV`M69-Mob7C=-az=AXh0 z5@!_FXW}btZ3~|lFnvZJD+5Cx>*NhQBAbIm7qNoWeUp0545IJLZDwRDYTZ0VfsF&i zpQEuK%#YQQ2b))?vmMMg*J}dn+ilzfw$IZv7);MIn+%pWwz$j!GKa(VzBq_}8N$iJ zRNcDyOGJh=Q*rC&xRRHwAaTzs3pS?4*3HcglNFenTQ^HA{Kf*J1(va~g88eZz*F zK!V-7!GhOzg9T;wIDzC6_P79@F?rb@M-cDj9#;_0U@w?gyw?N7+q>5pB*(PR14Q}k z1IzXAa|6j;-{%gZ6!trTsFeLKKtE1iwciKm#mPVRgXJ6#cmh2*x#xf@(A|?S19?D7 e?w}8d$~hPeq7FiM{D;6w!VdWWeKvW?p%4JI2g0ZT delta 496 zcmXAk%_~Gv7>DPcd+%g)%_t_*5F;CD^3nJzEQXokW)>3@He_L;C<`VTB{`vdjKxtb zL?jCqj3erPnu)()iX9uJ*=w4Oa^K@@o}S-(&guOXH~HcwFU5v=q0$B?fzy(kL(7;p zaAywSOX&xPRxrJkUJ-E4b;v``RkR>y5^s&4#*U6tqRo~P$(>Y5N8A@8+$(s$d6dNT zvzBsb71KkXy#)NE(d2-WO?3#k=6_<|)x05stARb{a>pp+X(wR}bms*4r=;(*3Yd>O z1hkFm&%|ss_|#Hf1j@;7JKDh%uM;2I$JBFP5Ks!!@+-Rt^xSv_$lGrV9JoJS#shmE zzL?iPIt7%#q)q9yYLW#d2)I{ds}%WFLVy7^0^zPITN{%%m4!80KiISuveqD1S`aL+ zg#oQPvqgOfOxFhh$Y2&V*zCZFK=^J9!gHV55127SR!4GeM!||En+2a`t038X4qH7) d&axCHwV5bjJ~Iko=HFb|Foa`SHoMHm{{TWg#B2Zn diff --git a/generated_examples/images/mkd_glr_basic_widgets_demo_001.png b/generated_examples/images/mkd_glr_basic_widgets_demo_001.png index 0c0452c72201c17107f6bba0b637bbd88827776a..bad00a4f25e6b34661a8188bb55275c31b87757b 100644 GIT binary patch delta 12142 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 delta 12167 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 lv)?j${LdO%0lq;#rOL?k{{V#)yJr9Z literal 25468 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

K@GgZ|FVxdPtgw%e1- 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 literal 42276 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 a@xRWK?Yj_u9_;E7#MIc_D9_O8>fZsG*A(^u diff --git a/generated_examples/matplotlib/images/mkd_glr_waveform_002.png b/generated_examples/matplotlib/images/mkd_glr_waveform_002.png index e2a0e2a61e9f72358d48ab6a4d00e7d211c4b5e3..f69dcaf30e795ef8afac5319d998ad7b77746c3d 100644 GIT binary patch literal 31812 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 z�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ų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 literal 35238 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 Il$U*F*r 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 RpQGT{4JGxfIaiE){}&i0#9sga diff --git a/generated_examples/matplotlib/images/thumb/mkd_glr_waveform_thumb.png b/generated_examples/matplotlib/images/thumb/mkd_glr_waveform_thumb.png index 5565ddf15cc48610a3783e8421285ab0d8d03ac9..f1be91935ed00d5e202eed2c283cb0c7bfe61d7c 100644 GIT binary patch literal 22997 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

ZRTM+z@AI@ z&-b&<&v$1a&P8tT_6~piUb9X5lK>!r-*^)CAbj|kL8TEnA`~$gF|y7RI-f# zBLXf$iUXS;=SMFKz?UYrF903>Khr1wKYa1HS~ygc3T%8KAuN>OGZ%arZb#81InY@e zW?l4FgUcuLJYJRg7JRuZx`%8ur+rd2b~jc5Z^+{cRrEJPd_`j=>tn^MB zR0NH#T-l?vbaWMe5r7SN&NJtX0!-5LFiSWSD214Ue`%pJl-cdB0f4EIP5#c4S8f1l zpS$;9?Hn8oOoUtrfJzq)JfK*Z8A>Rfm)*k)hdV~7!+x7D)&CV zMLo9o-Wlw7v0!%+rxAo9;j{l=C)!P1`1oSp3Z06~jr99`{#;D5{vEpave(+;1V+ak z;zDZ{@JEf3>eEaa1i}q@9Q0ST^Y>ogWa8lW7b2S86#stzviNqpE?uQok;c1sRn!$k zk$lK(bT!`J5C-eN2bi9}n2^ziZa!5Zv*iX*ofCk@%MuiiXqu&QT)b*+n^}GI>U)<| zVw&SBmqzFE@%I-Ib1@CAmn4|9>Z7e^3s%*_IFRFCJsybjEzt`i+v7$9jiyBgNOv$V z(fX@3!on*QN66WQeAO5f5)^numbg7~HI*>r;m*3`_###T120w)anesQ-}UlwVeo|! z;&k|)y_;JM_vjVqrAW|RKoI4_)wbZPANsBSPGpMk) zbds5zpAcqE7Bh6_+JTIozdeP!E;i$vwVg0@xO?G$E?v|PN zXnP5(Tv=RKGZHwidi-kb<)7aRSC4s3l5fnU)YWOx0sfnh*nOJhHL5Dr=+FzW_P&1{Vc0R*rvp%dExdtaZ=Khg2? zM)f`&O26865{|G4HL2Q|540!0)80#TyZmH0Q-~plW7Tb?h0KCEdFBB6XU&j&&SlRb zM=jz39hSn-$12NX0){^rF_`y^oR6HGa@1-`Y{)K7b`o$>aO19K-IB~%pAC+@?y?d7 z1a9<>xGZig15dC4PDuSrS_K6~&C*S)k8@yO;@#6Jk3R80kn6GsnHvc3UN}FGy!GypRn4A{n{Je{sisGU0!d~KeV`MrR)-bSu?;qCX3f8$V|&tQ<9wK; z>$WsW_vFcJ3a`_{`UhN2!=LGey&@}HTzr2WzKkrphlzxt=Ztq5XdT8BYIm@~))DsUY~+haBow}9j$t>Z_@U7f2PpyW%+l-!94$>kYn5s-Nv2#5bA>M?g@JYz^Yc`L z^6C!$z0j!uCFya#Qya$L4bh!`=CcQPB;-W-wd~{6-YoFT7b+k`+ocah+vnWiDD4ukz5v=Y>b796ttR3;gF@|>=E7*{eijqC*PSPiF&%XtUavRHv& zV=WHjdcE9MxY~(i-8}*JV{GahGTkcbFqUKpobg

ZB&U;Sz%-CZ&H(zHOR355y1N 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 times#

-

00:00.619 total execution time for generated_examples_matplotlib files:

+

00:00.747 total execution time for generated_examples_matplotlib files:

+------------------------------------------------------------------------+-----------+--------+ -| waveform (docs/examples/matplotlib/waveform.py) | 00:00.408 | 0.0 MB | +| waveform (docs/examples/matplotlib/waveform.py) | 00:00.482 | 0.0 MB | +------------------------------------------------------------------------+-----------+--------+ -| mpl_figure (docs/examples/matplotlib/mpl_figure.py) | 00:00.211 | 0.0 MB | +| mpl_figure (docs/examples/matplotlib/mpl_figure.py) | 00:00.264 | 0.0 MB | +------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/matplotlib/mpl_figure/index.html b/generated_examples/matplotlib/mpl_figure/index.html index e8a77ad5b..594a65999 100644 --- a/generated_examples/matplotlib/mpl_figure/index.html +++ b/generated_examples/matplotlib/mpl_figure/index.html @@ -2931,7 +2931,7 @@

matplotlib figure examplef.show(run=True) -

Total running time of the script: ( 0 minutes 0.211 seconds)

+

Total running time of the script: ( 0 minutes 0.264 seconds)

Download Python source code: mpl_figure.py

diff --git a/generated_examples/matplotlib/mpl_figure_codeobj.pickle b/generated_examples/matplotlib/mpl_figure_codeobj.pickle index 85a3d3b940b798371f73e40acf15438289f90c44..8eab9e50514a27e62e19db4191b82eafe07cf60b 100644 GIT binary patch delta 1102 zcmXxjeP|p-7zXgn+|FG$w|AH1l6bfGvGIYg>tke&*qE@Ji0TF~kp|o{oH~DAg_dGi{ zH@D1P82EL-+OOumow4SyA$v+v3h!hKaB^`;8F;yxq>`TUxMZ3N{>jZss_H3+ib#l6 za6Av+=O2^QhfUtFq>Xsp+aYNyx(gXJ7Veg`4Lb|>OWKa#3R!$s*d*ye*u|&N6FMyz z_gXpJ3b|s`SHIOP#^aC1a94 z)$Ek?IeNvD;v4L3{v8XBgJ`w|&$n!sbOje%?vV5s&b3xhZv8>he?C{H97$Kvn95@4 zwnbs#LaGxZsj`UpYI9u4^_q8y7!v7z(SX79og%5nb}XbDL@UmudqrB0ML%cpkXuGR z(=0r#wW5R>w_jBBSoWW{dbJ557&Me(rFA^WQ0kw9e(+m2!~>0s2=zb%c$`Y#ke zYnshY1wThiil19fZoR8`GDzzc?_chZI(nA_CcW+SDSjzX8Fnn8c*>-0u`I5|l8UE; z)TQ{4(R?f)^oN7AQt_NoEWXs&f~5P`j7H;2`y2_9-shOntMRJhH;vB6JFK@1%uDdU z^5k;zk8{eTc?HGq8*L81sQ8T0^>9(&?H0x7g0xEUCr0k^pmsg6qyb^x_i$o+0*Lj@zJpfeHHn#S$Ry{9^*fjR_>Y>6F4FAAzl=y z6|45Y%MY+c9#DMEeBy@m@Tb%Vx*jC`4sIHK73onNl67^5SCkcpH837or#NafAMqTH LYx)1p@$UZt9b`X4 delta 1072 zcmXw(duUWg6vi`?oox1zePpj`vU~5|-K?qEXwswxgQ7JUsoH9lU{R|CQ(H1SO*Sbt zR7FWlX^1wq>X$8|s0f8ZK#BG7hhhW~Q4o!7QE00uifw7ZVv)9r(ld9>Kj-|u@60*# z;BxP@TyJspi`>OMt{jfX_j76DnExYIg~Rr%ZdoJ!J9^u(%3aT1!;pI+(un~s=VC0; z$mM)WHV!5NTrR+e*UUyVI-lyU-*Y*N?WToXg@O8j zg)huVpt!5OBeS8SH=}!wW3a4>%aa%@d&1>;N-10~_j7pxcV2nUx@d6fmWf`YqKXXO{fi;)&{FE9=It~c2b=U`i1(~X$_fp8mhpH;0@M~ ziO@3k8O0hb4#(J_LtlocupJIv3zx8A{1TqazM@!-w~Y|ni=omaZkHM?N7TUf;Y?{0 zJ3ukz)DNL8lERXR!Hy8kWZ&R&B)|S!q6RjKS|je%j}q0fF}lSpcEY&}&3B!qL+-%| zq0Z~m23Z1<(Su*m>Sq?m*KCVWS0+_Gr`lDmn)!%OKjg`Zc)Qv+_H=e{?99ARpRT&8 z{WXO)Dhodl>b6!xh3^UVK+}W5l|ucYX^v~1P>(h3bG;+ff0`^|!X@4is(_PPC^|7= TC%K2?Z+nI>K%Vm>=&k!7xv@YD diff --git a/generated_examples/matplotlib/waveform/index.html b/generated_examples/matplotlib/waveform/index.html index b9a5294a1..4153ff554 100644 --- a/generated_examples/matplotlib/waveform/index.html +++ b/generated_examples/matplotlib/waveform/index.html @@ -3132,7 +3132,7 @@

Waveforms examplewaveform = WaveForm() waveform.show(run=True) -

Total running time of the script: ( 0 minutes 0.408 seconds)

+

Total running time of the script: ( 0 minutes 0.482 seconds)

Download Python source code: waveform.py

diff --git a/generated_examples/matplotlib/waveform_codeobj.pickle b/generated_examples/matplotlib/waveform_codeobj.pickle index 7f185ba71f00e459339af45bb5fc5e5428cdd012..84252b1d58b698518077b35d98ca5e00e80c0c79 100644 GIT binary patch delta 1223 zcmYL|ZA@EL7{_-G_i}roFGx#iX?tlY7${K6dxp+s?oG2XF@pOb$}U~!=}BK00}>=7 zo5aYrE?N0^aYkdZ54vP=n`VjeWf5o8;LJ!!j7HH#4H~DJQx`v&n8kBjV4t4f|Np$? zJom}Hu>H(->4<##WL64wn)d1wu^s8rWbWx){o!1FMoQ_)ST1wV&lD%q`^OW8H#C&g zc8!*HC7MMm6-4&xt0ekp$rL+@vgml-G|&?_tWi^LX9spsXj4A<05E zVM@}l;A_DPQZ3nrjL%QmPQ2|Krfd%)^0Q|)4e+_ra7 z_KpZa^g3*my$9VK*{33CST;%*aI!+fIftnELZH}T z5%U!-lr4$ih0Q5yzC_U3MA_Hqch*z(tym*M+4sga_mxJ|i9{?q7Eh-R{zQQL;nB2l0rI!4O8TS-r|E`{DfpTfCDgd*`LKIYaZb?qEVZ-XdrX}B+ zxbCfx{A(g4nPna{)V;$6DG%Y8ua-39qVIszVPqrnfg=6@!BH(PJuHm5;^89xD8Uoe zLsFm6h4b}Fd-J>n`}`8ZN>d5nCk*4^I<~4EGLH#~N%cV_0}V7q&|9M^2lFMfxaN

wxF71o--&@nv?k}1@d9D*(&qb4E30KM&_>@WV1N&n|Yhe-!xRj(l7JN z27PGp;H+hf%-=WEie-LJYcb26a{Hm=83l)^(M#wV2k$-<1zh7e$*Z zD0zg5OKP}?`zcPiT4)``6_=0HBT>_(Hm|ot{q3X;FZr9KPNU;9QW zq@1*1fch|6d5-ei@U+duHupT`>m{xw8w$pGTR9m-vu5DB)`>2yfyD5>$E17{E_rrP zem^d16J!K$dB-Uq!*RBg?1H;wgrwC+@lREZ@j32X#C~6=&iAS_#_@^KuJdOszT0Tg z`J%<6t`4#f`&|v>MSK@rUBVB@%nber%1a!A=8BS6uvYFK#$RR+ZpwK3myA`6;|sW5BF=obrz)wp0EoKCj7BeoihSJXhyqn~Ma zW@hK`h}rD*k`*fohsc)B#2=eYrDi!c8};^@qL1s57Clr@i8=1JvqDGu3^D_}Es^811nAlWQZ4M_B zTa?=EsK>Cw%fx+_>SAJ>qN9#RCbld3*AcWL9=22)6LCc&P6NlBGIPvQtC*Nj^kLB# zmXiLIqHuZ8il4TWtTUr1R^HCU9*b&G>#Sg6PAS!aLj5O;O72nd6#7EFhk4jIyoXoxCa)EBRedHHOQSuuGJhS8) z-t{z)zj47cuKlMHFKXj9!6=rzlbVxC<2c)46JCmis!{5v_@QcoM%3cZ9c;15ULt39 zlUAHI+x1m4UiKH+>ZrZTVmYwimdGdVRi*5@q&`JG)tzKL&PKu&8wzoY@=Y{()543` fH{Qza*E^_);q^!>*{s6JR%|hQ91j))G9CW|+U0#) diff --git a/generated_examples/mg_execution_times/index.html b/generated_examples/mg_execution_times/index.html index 87c294966..2a591ee57 100644 --- a/generated_examples/mg_execution_times/index.html +++ b/generated_examples/mg_execution_times/index.html @@ -2862,11 +2862,11 @@

Computation times#

-

00:01.630 total execution time for generated_examples files:

+

00:01.683 total execution time for generated_examples files:

+-------------------------------------------------------------------------------------+-----------+--------+ -| basic_example (docs/examples/basic_example.py) | 00:01.433 | 0.0 MB | +| basic_example (docs/examples/basic_example.py) | 00:01.478 | 0.0 MB | +-------------------------------------------------------------------------------------+-----------+--------+ -| basic_widgets_demo (docs/examples/basic_widgets_demo.py) | 00:00.197 | 0.0 MB | +| basic_widgets_demo (docs/examples/basic_widgets_demo.py) | 00:00.206 | 0.0 MB | +-------------------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/napari/images/mkd_glr_napari_combine_qt_001.png b/generated_examples/napari/images/mkd_glr_napari_combine_qt_001.png index afc53b7c17dfc991048cd2b4e87a587b42331632..ceacbe776c4f966765b95434f921f33d3a97223d 100644 GIT binary patch delta 6996 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 delta 10911 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 L>~78NKOg@G6=3uo diff --git a/generated_examples/napari/images/mkd_glr_napari_img_math_001.png b/generated_examples/napari/images/mkd_glr_napari_img_math_001.png index 5704dd7b8250280c5ab125da07f23ea55ab68ad4..0f729fd40358f5017efc6f1d6dcd3f4e065f3690 100644 GIT binary patch literal 44603 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 literal 45624 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 qzo?m{T&)VSX3c*SG5@PYhDO(AW8m@T2r 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

g#-$^rV>OzCz8taJ1}N{18J-Dv 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 O*}m0(OX)X1B>xA16czjc delta 43936 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 YuxW4X`L}i$@V8^zp8phWIdb-Y0E~*UjQ{`u diff --git a/generated_examples/napari/images/thumb/mkd_glr_napari_combine_qt_thumb.png b/generated_examples/napari/images/thumb/mkd_glr_napari_combine_qt_thumb.png index aac111f7ad2b2fd975ffce7c1930b4b21ae82828..cc88f20ac5d83bfc7bc32085504320ca897e57dd 100644 GIT binary patch literal 15704 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 literal 17880 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 VD{lLYaH}=EyUH3$1qv1~{tKH;gu?&; literal 28475 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 KxndcU!2bbHN?a`f diff --git a/generated_examples/napari/images/thumb/mkd_glr_napari_parameter_sweep_thumb.png b/generated_examples/napari/images/thumb/mkd_glr_napari_parameter_sweep_thumb.png index d008b7494ed54134ec3c3854a7ccd1da9b238cf6..1e8ff9373f3adb953adcc74f8cbf6128820bde8f 100644 GIT binary patch delta 26013 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 delta 26508 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 zKro|ak!+mmPsKwkComputation times#

-

00:31.441 total execution time for generated_examples_napari files:

+

00:28.149 total execution time for generated_examples_napari files:

+--------------------------------------------------------------------------------------------------------+-----------+--------+ -| napari_combine_qt (docs/examples/napari/napari_combine_qt.py) | 00:19.889 | 0.0 MB | +| napari_combine_qt (docs/examples/napari/napari_combine_qt.py) | 00:17.571 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ -| napari_parameter_sweep (docs/examples/napari/napari_parameter_sweep.py) | 00:06.221 | 0.0 MB | +| napari_parameter_sweep (docs/examples/napari/napari_parameter_sweep.py) | 00:05.931 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ -| napari_img_math (docs/examples/napari/napari_img_math.py) | 00:05.255 | 0.0 MB | +| napari_img_math (docs/examples/napari/napari_img_math.py) | 00:04.589 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ -| napari_forward_refs (docs/examples/napari/napari_forward_refs.py) | 00:00.076 | 0.0 MB | +| napari_forward_refs (docs/examples/napari/napari_forward_refs.py) | 00:00.059 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/napari/napari_combine_qt/index.html b/generated_examples/napari/napari_combine_qt/index.html index e0bf7d60c..577af41f0 100644 --- a/generated_examples/napari/napari_combine_qt/index.html +++ b/generated_examples/napari/napari_combine_qt/index.html @@ -2937,7 +2937,7 @@

napari Qt demonapari.run() -

Total running time of the script: ( 0 minutes 19.889 seconds)

+

Total running time of the script: ( 0 minutes 17.571 seconds)

Download Python source code: napari_combine_qt.py

diff --git a/generated_examples/napari/napari_combine_qt_codeobj.pickle b/generated_examples/napari/napari_combine_qt_codeobj.pickle index 0a3c38379a555ac8803623ee3d3d6a80816211cb..5ae5b52313fb3252a2d4c944e733273b4265a585 100644 GIT binary patch delta 947 zcmZvaYe-XJ7{`0gF3rv9Hg&1nj+Q!SmX@fbqFB+LtVLlLZ>KpuJIu}8_Q68xL-!^m z|3eTKLeT|^gp3M;`VvtlWKj@Ak`R%g6yzsC>pf@Ir@lP={_pdDp7(h#vvsp|7fU*q zdK&}no&KoYEPMK7Ph1-ky8Lqd-*Q~v6>g6O*;4B6UT?Ir#2ZZ%MC5pKBGnoZ!#&ae z84Q6)t1l=-A~JZZixVxVx9;V{Wq50Kpg(OrC-RuHHgIAAcG?bd;wns9>=;Zh!fSJw zs!)?6P(7}u9HK3W$_DI8_0hgWQB$JG2ft+_czqcK;ni;&D9IYQo`vVx`2#nXQ!kEC z!NAM|I*BRrV3c?|!>EeRt9n6WqJB(pD`9ixaNgbB9 zmHd!OO8GU^YxA&LYoi;C*3fMn(bmu%7CkA3?%sAG6b<-f(Ino()AaIOaYQtqi?N#) zm&P?cv5+h##q}YfTj&WWriUm?^3gL~N_tGAAcG4*V<)|3*bH=V>Ql<41~ zlL`{5P$zj5nm1n1Nu>!=_A=&4WlXW2e-PU5dws>TJJRdn38ThUJ&Pl_{J<@%6?RV+P z$b#KT^a2a^wfJc_(<=;T7UNWA5sfk0Om9@J%gms6Dk+{1=+4?kA6azcOO}JZr$UNn YLM6pBiC}gaeZ^3At7&F&Vt=gU4>vM8aR2}S delta 962 zcmZ9Kdq@;f6vjKVGwyqJ*L}L{x}o{Z>1kM&8-b7!M3zL7>7r}1L%QOsQP4wz$k;&o zhM)+GKrkqzf`}+Ef}*gjC@p$JloVot|3%Q9EBZ(O9De8f&UfZ=@61-uRu9M#XKx~Y zAl@a%T3eeslZlS*l-8&fAJ&S~Vn?h!uHnAqu1;sPCtG{=$F;P*Bi0$~O2~65Ep3}K zno>%#t6NKF%-LGnlt?wT?2n~VT7M7jN+IkuSt$$QjJFg-)L4v&F-&1bYiTj>b-w`D zj9aLP)l!7aPAcW3JLQngg%~gu(sE88OnzF$NuOK8Xa%iBv$=xSvzm`Gi=Co)WUiu3 ztQPCNsYbE)_r%i$m~nV;DKI4{bvT_S-2}h8Fq*3V3mZDkW8*MT;;hhA`#N#}hFqsb*an6mmdP36A+H$c07+pbwqHyWCp3z-l4*z(tOoArD>Vqz?^YGQ5(8VaaO}uj`+9 zYI=?Po+UW%DWo@yHlQu+z%!2@y>2IcG81k^cdA0x%N* diff --git a/generated_examples/napari/napari_forward_refs/index.html b/generated_examples/napari/napari_forward_refs/index.html index 1667263de..d5db37e7f 100644 --- a/generated_examples/napari/napari_forward_refs/index.html +++ b/generated_examples/napari/napari_forward_refs/index.html @@ -2933,7 +2933,7 @@

napari forward reference demo# you could add this widget to a napari viewer with # viewer.window.add_dock_widget(subtract_background) -

Total running time of the script: ( 0 minutes 0.076 seconds)

+

Total running time of the script: ( 0 minutes 0.059 seconds)

Download Python source code: napari_forward_refs.py

diff --git a/generated_examples/napari/napari_forward_refs_codeobj.pickle b/generated_examples/napari/napari_forward_refs_codeobj.pickle index 6af19d7de58d786f5e72239baf3ad33353369dab..2a2fcee8e1bd177c65584c1cbce936f908860fb3 100644 GIT binary patch delta 476 zcmXYoO-lk%6owhkb;htu15IFBky>OXBQ1(33Zf7Dpa_aWP()3-LpDQ=Q?yWM8B9>z zy9)XN{el)j%jhSxY0;v8(W2vRR?qXk=RNQGyMAwSRT)kD#IBw-gs-oAcD-decEPhu zmpNC$SI?Yduh|fMQAzgsz5l6#w~LnG4@!U3k63P{-mJQ=;IGOsKOh-}qGiEglz(f9 zpy}GDLLq_eQD_WCke$#8ZabkQrzF8sFc_pV48WwkC*@BLy-i~L4Q6rCHA>9D%3yFt z44KAZ0hjr3ntzZqECsGXoUmmX=3q4_@4^%c=uhDp*pf{0n5M%H`n($FZ(#%Wq-S9t z`KS)@AJu?E={YDOe}k?hJqHzJNsG%}O?nm@$Xjg+81hA%fK%kRmIqrh!Oe&c=Zro) zPs1hRD>Zk`=&jfA=|ORCt+KMQwz9psTM%WDX^RZgd{T3qreHmOq~=-8mSwwwMOg=b MZ^k1x^4Bx}0BJ;wW&i*H delta 457 zcmXYt&r1S96vx?p`-|8mDMP~|wu~fe(__$0v_g_XLn>rT({^Fq1=ocj3OYu6$Yzfr zbmD>B zzGycCpQ}5L75GBix%4btOLfn*x~A<0zC6x!*Kj)Bz?kwS)72Z+h3f`nURs4|Lne=6 z7NW?3xGcmB`N3=UHr3u|oJcUE=q=A~bWO+BuRN2yLyVDogFG#Z}J^Gu&SgFQO?+&G{0E|cF;#`3ELw!PO6|ytPk{Bn$cZF z-1P?qD1}@hXIuh~CjP?BL1p6f303qZUL|cl3a6oGp@uB;ntV=wi32o5Um;t(3Jq+0 z@EK@@TzD2DV4}_n8L*HAVFMhbCuqCode napari.run() -

Total running time of the script: ( 0 minutes 5.255 seconds)

+

Total running time of the script: ( 0 minutes 4.589 seconds)

Download Python source code: napari_img_math.py

diff --git a/generated_examples/napari/napari_img_math_codeobj.pickle b/generated_examples/napari/napari_img_math_codeobj.pickle index ac4222cece08c534f5d2d781ffb9f17a6f70ac64..217517def874bb4c1e35f0a7516d9c3bc36adc80 100644 GIT binary patch delta 1004 zcmXw&ZAep57=S%zJDc-P-P+bZ+}Kj*N6Jjg@2@0H6cUAk0>u_C&rWVhO~hiMgrTrV zdnZbf1VPY;X;~zcg&_S168upVSrJ6!kEmZl(APQlvOn*6p7)&l9`1eLyHvGQHQ|E> zt6dvYhy9^I96GHoQ%n;&*)z}=h{uwT4Fvll!SLxxzZa&hJ{YliFtvbN??g73G4H|D z1?y&K8TC;8_&^}0YYF*#1C9QOKi(D3i^lV)Hl}S03?3Zn55%c1ril#o2gAK_Dp4=h zPoArWy|@dNK(WdJOL!L5!ko$l5mhg0lWAMT@jOiq- z*>^ynJrmQoj1TP=Os6>(V0s1q+8Z#v#+PjHWEe2LE@O>71=Aa_;Aq11CSP)t&08|c zn|GnWnF+BBFQ)S{zRj>=`ankN;DsJ>EW~sPCY^3L>oj8egd@N68LT+VFkRsbztg41 zbQPvFYiJ#wTT3u~16x+!hj*|km7L7%j*35y8&otz6Fl3j!iDppR|nMA%* zmqJ)n*mqq%A4@l3!wGw@GZ1!OvE77S5EM@FLUW3juyMs|2#Y21^7%^%lPg~q)*@v> znPenvN-^HB89_r*C1F<;%7qgW|NOJu?k}nlVRuAcOnISILifOC>y{q#l>B23`2GV* CJ15Zq delta 1055 zcmY+CTWC{R6oy?p**&?M#58G}G^EoeHQJgssMV^}s)Ojm)Pf?4O!a6(cQ$Q|+As$1 zqIe-f;tHZzPy|6Jc$o@TK?NVZzvv){ASjAZ5ClOGbnSBtGA}FNxAwnQlC#g`qRB<2 zcXfqRE4K!lk2$wVQ-Rw~82e$d!vE;7>h6(>t;3)h{z(zHJ(V!Qc z_{QG@)2Yrj+=m-#d!Ux8>2>G{B#ikG(L#vesz5j0?W#ar<*h9+Z5sWjRu!?fRz;o6 zQsRYqEiy?YTqpAMJ_)U8*_qE)guVFtUS$do2fLsPZwF&qw;9GQ?hY<{)Q+;dg~?^u z8BE1i{(qA`IH)%9YW>J6O$63Hg2}=A}>E`<#M+==yiv=+@t8ac96>>imuuI zz_qq!E{|31tS!LhNz>Z6Jf$dVkDazhxGb46k4ya3#@P-BmuHkcwzuNAJ<8=d)4I4E ztM-l51!V^u&A7o4=kk(i-CSO-_Fp@^TwbZ#a~o|QSJvl@;$o+d%d4i*&$^*#kCVRR arb)4STdpvuXGb&J)PuQ2U3G2geDWvC9WOWl diff --git a/generated_examples/napari/napari_parameter_sweep/index.html b/generated_examples/napari/napari_parameter_sweep/index.html index 555b4b9a6..8f53ec360 100644 --- a/generated_examples/napari/napari_parameter_sweep/index.html +++ b/generated_examples/napari/napari_parameter_sweep/index.html @@ -3318,7 +3318,7 @@

Code napari.run() -

Total running time of the script: ( 0 minutes 6.221 seconds)

+

Total running time of the script: ( 0 minutes 5.931 seconds)

Download Python source code: napari_parameter_sweep.py

diff --git a/generated_examples/napari/napari_parameter_sweep_codeobj.pickle b/generated_examples/napari/napari_parameter_sweep_codeobj.pickle index 20140823e8e440b64cb1b0892022af407bb240ce..3db4dbdae0595c63c89fa6edfe565338a7ae82d4 100644 GIT binary patch delta 884 zcmYk)Z%7ky7zgm4+aI@Xr*6A#Zu$S;{4Z&0mYPW-&>Nu_5k(LLmHqDLo8El+JkRgB-*MdYxna4%JZ`!2 zcFJ5)FAYW1R4N*YhmQ`cNxe@mJENCr=6GaeP}juWYP^3enuvF*QC+i+BnH&sK^--= zf(*^EUWHRiA~~kxpv^65wrDEcKO9M=^a*w9r5DAtpJY7uY{^&riZr3JtCcj(lvLxo zV%Mzk$Y>-P)fG|6#=P7iCNRV2Xp2j3UP%j zBJIONOCH87BXo$%=ygM~E>MK!CdYs87{HpfhmN5qEk;Q!n(|3~yqabrI){%LrI>NZ zn6c%c-Cj-;h}mmN!|cW?%-dJ#DpNC}b`edYAGJ0YHi=HUj%u-uW>^-nr#*C=>xf;V zyC`$i@Hwx;N%vS4qFLTE<{oevbB|CjRUucB=?PN{J;kWhOwU-BAS`9l3w)Bc(<_!i zUe94NJ;>)@Gd0ly-lR9vBFpvpB_uKm`T0AhI{LuB%(#D>?*q9ovE~xs`k@E3iYBD1emrJQbncSBz|55tTA+qjFx~^odl3 z@4g`W*EvG0mT@c9@x~XgNDb)A3ei@UA}qNfGD!e2{l*y#0|s)bkr uvbT}Ou-6-OoMc^NsRuRd30yNZvaMM%Wm{t7#`FrcTVfXseH+QpVKbJnA&(5=22r1Y=_B zzpkvHyCPaiK@b#yQ1l^X5F}wG6opjKO>`lw_nako^XK<}-~aQx?>Xl=8@1nSxmo`5 zW{fL4qd7Mim<)`^d*UTC@scPP@{a`KQB7BBHL4jI?T-wz6(Qsw^N$aD{>P*G)P^q{ z937uv1*z?LG-ELA>l^lm!|?@N)a2)gL17^hhzbM#NH{#`5BYkBBg$#96>F@w0QPi8 z?5`Mm)gbgKHO6>aKV6q=p5 zmTg75+KvP24(i01dX7#r&BqH)M?KijMX8^uL-7N+&hNvj!38USfySA0Qv^G_9iRCl zG!3UlqVrhP6wv&=ghovSB-7pSY0dbN-hzZyho%e{T}4D&fu)SEbc2zXZsCr$g%V5) zFKKgC!4;WUm4)srbXzCT1N_ePU@fzd9x^&Xj}$Lwo+u<|R{Z%KG|#9;x4`bM{2>v~KPY%6x&QzG diff --git a/generated_examples/progress_bars/mg_execution_times/index.html b/generated_examples/progress_bars/mg_execution_times/index.html index aa85859c7..a81e554d7 100644 --- a/generated_examples/progress_bars/mg_execution_times/index.html +++ b/generated_examples/progress_bars/mg_execution_times/index.html @@ -2862,13 +2862,13 @@

Computation times#

-

00:00.319 total execution time for generated_examples_progress_bars files:

+

00:00.244 total execution time for generated_examples_progress_bars files:

+---------------------------------------------------------------------------------------------------------------+-----------+--------+ -| progress_nested (docs/examples/progress_bars/progress_nested.py) | 00:00.106 | 0.0 MB | +| progress_nested (docs/examples/progress_bars/progress_nested.py) | 00:00.081 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ -| progress (docs/examples/progress_bars/progress.py) | 00:00.084 | 0.0 MB | +| progress_manual (docs/examples/progress_bars/progress_manual.py) | 00:00.060 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ -| progress_manual (docs/examples/progress_bars/progress_manual.py) | 00:00.082 | 0.0 MB | +| progress (docs/examples/progress_bars/progress.py) | 00:00.056 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_indeterminate (docs/examples/progress_bars/progress_indeterminate.py) | 00:00.047 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/progress_bars/progress/index.html b/generated_examples/progress_bars/progress/index.html index f7121eaf0..43c9aaf8e 100644 --- a/generated_examples/progress_bars/progress/index.html +++ b/generated_examples/progress_bars/progress/index.html @@ -2922,7 +2922,7 @@

Simple progress barlong_running.show(run=True) -

Total running time of the script: ( 0 minutes 0.084 seconds)

+

Total running time of the script: ( 0 minutes 0.056 seconds)

Download Python source code: progress.py

diff --git a/generated_examples/progress_bars/progress_codeobj.pickle b/generated_examples/progress_bars/progress_codeobj.pickle index eba89f111e04b828218e1abc36ae3097235dc1d1..af086d86cfdadec5bf14907989a00578d9f402fa 100644 GIT binary patch delta 334 zcmZ22xLR<6o;+JgQDRXg_i8nsh2dRX!jb5p1EaHN&yC6{F8=S_^Wob148WY1ch zlbTupRh7ZsBb8K|nNyOP7Y|bypI;Q8n_7~QpE4zbvxfsJT|6a&J3};sXJWrJqr~JK z#(Rvallz%uC+}o2oII0Bfl+7jE+#cb{mBoRzA;(>N#)7EnRyv)CqH13nyk$7gwbbm zAgk(RT~=jAe;~_&F$m1x$s)p(5ejDhV&P?sn8aqz7(Izid2%$H0At+bxok3%z1T$< z6M-xp#+1o_+2p|dbRbKQF>7)>JA|JLWa%*$Oy189QC|#X=`fZ}e#5TISP3L0C+`HB iR|9r1$h>-p(}7}56IUBEwokmT!qJt%(^;BYss{klEN#00 delta 296 zcmZ22xLR<6o(OAkPHJkwl-Ma6wNo^DSn?8cQ>RQkE<4fB0w$Hg*~3zj2^7xY&fuTy z&0)+aGP#~Zg-<+#r?WJ*hpnV2F)uxJaukOOvrGoh#5$|Vl8iSPbtlVm$WG>G3S=~y zoXDicXg>J^lk()%OqUs*z^s|9yo|1sH!%NW44J&1#e*>%NUBbjWtC=(0<+>+MHyqk zERf2C$@f{6C+o9`FeU?8#*Ar`h1m>vGC?i?Iy-~Chj;QvRz=2~$%Sl2jQK!PZt^X5 z0mh=qZ0vHAPqB(HmI7INj1`kj*$o)0C#SLNFxE{z$Syf~4Z8?qBao%Z*aCJiNNqci MrOVL;_FkzT0IK3!EC2ui diff --git a/generated_examples/progress_bars/progress_indeterminate_codeobj.pickle b/generated_examples/progress_bars/progress_indeterminate_codeobj.pickle index 79deaa9f6e6338287b2bf02d418a681eacfeeb33..c4a5defe43535369866e6a027eed5c8d471596f0 100644 GIT binary patch delta 119 zcmaDO{6=_!o+MXEW^SrpaZYM#!Iao38nsh2dRX!jb5o~G=3tVY7-}KH3X#j;>|p^Z zosz+w!9VdpJfp;91x6=E`N_$QVXSHyJRPMI&l^qtz{tYKTarXNBq?P6+mt^MWO-#0& ztjJ_Jaa$y#KQy8r4#oXO@6@0BEnUYnVYItoRgYb05v9qeWJUp vegw$iOf%R4k03Xs diff --git a/generated_examples/progress_bars/progress_manual/index.html b/generated_examples/progress_bars/progress_manual/index.html index 7325ce1f3..6fbef03d6 100644 --- a/generated_examples/progress_bars/progress_manual/index.html +++ b/generated_examples/progress_bars/progress_manual/index.html @@ -2898,7 +2898,7 @@

Manual progress bar

Out:

-
<FunctionGui manual(pbar: magicgui.widgets.ProgressBar = ProgressBar(value=<function match_type.<locals>.<lambda> at 0x13fe3bce0>, annotation=<class 'magicgui.widgets.ProgressBar'>, name='pbar'), increment: bool = 1)>
+
<FunctionGui manual(pbar: magicgui.widgets.ProgressBar = ProgressBar(value=<function match_type.<locals>.<lambda> at 0x133c50220>, annotation=<class 'magicgui.widgets.ProgressBar'>, name='pbar'), increment: bool = 1)>
 


-

Total running time of the script: ( 0 minutes 0.082 seconds)

+

Total running time of the script: ( 0 minutes 0.060 seconds)

Download Python source code: progress_manual.py

diff --git a/generated_examples/progress_bars/progress_manual_codeobj.pickle b/generated_examples/progress_bars/progress_manual_codeobj.pickle index f22e03ef2612aa3f5b696617bf4fc65a950ed1b3..36f2b3b0a6edffcc21f696987f06ac7062ce8020 100644 GIT binary patch delta 471 zcmY+=KS/zS`&lgs6D`E0a_wmBP8f|5W?aS%bVv_%ZG2tuK#w8T@-T+q9a#6u7q z1%;qVpKFJLqBshHX6Y0NxDb*1uR*icPNT}_qr z{JQIj-UPntvEk_#DZix;_vqsbhcw@WqG=o&la^(>5W=! z9jtoPgMUH-^MV)GLZJGC(FTr4sa`c{iz80kIHL;!Po>jqsM*{izn87c`d6HH9MC?` qD0W>TI&A6T$}tArVcfbJRBP$s@H>9HZ>Wie@SIL@DWoyO=Kcee_?piE delta 392 zcmY+;&ntrg9LMoKJU?d7reQnqWJqMS&7x>GNzG|7r5wZ)vrYSv&2m)aw&L06sg)v8 zN-4EcN<=B;B55ZM`~}KIN%Cwrmrt+yz7OBBT2^=ZxhXfh3qo2;MU8?okN=xUpq(2wWtQoUL zpZ={<6q@z5Mn=$4giC*%!ZO2hJ4Y~y6&BHpRd&^N^A*onujxUsV}tK?ztH(sKMup( z9)<-KrJA+{7j|o^mV0!F-JBPlI50JcBaVpy95XL^al%7!0H>^oew=Ywax*A9Q8wkr iIhUjWE?APhxa6JW!!Nested progress barslong_function.show(run=True)
-

Total running time of the script: ( 0 minutes 0.106 seconds)

+

Total running time of the script: ( 0 minutes 0.081 seconds)

Download Python source code: progress_nested.py

diff --git a/generated_examples/progress_bars/progress_nested_codeobj.pickle b/generated_examples/progress_bars/progress_nested_codeobj.pickle index 7ece34cab513ff0b88eaa4d2b4beb28642eb1a78..6ea0922a4d51477413a9589601f876beb9bb4b58 100644 GIT binary patch delta 704 zcmZXSPiWIn9LGt2`JWUfw6b>#6dSzjP&>yn&?9z2Lb zl$94nVNMVP#i0lTVW1Pe$b=zy*g^2(&6CF+g!#+syLtM4e&6@W`;m~X!d79iHYJDi zjdsgPt|s=4#E!*w!*`Ncor~Jd(CxI7SoS-!k(YMYBG(Juc96toznck2XFg1b9;p5t^AqQzq9;sRojL1NNh`l(^_4tK=x`mCQS zs^4h2%~s^5nuXd~qf+``}LO;>~*eJSSz zv-ie^ljz?UO1$P{TH6xlQi=lStQ7A6qunF2L3Ww^xnC`|EgMaaYDKKD?) zg7_&@foaT(;Ne|=VK03k+l;C(hrKTj@x~Wz@UeL$?uRbsy4XT*U9{+=JVZmGz^7#? z4-4$vq6IMvH<3TcgLFqahDJ)0a*fln#NQG73fx1ptCXpxlwpzc1*s?!%7)|cke8cE z79J!2RK{S5rA4Q;0eFhMpcd(ll7nZAtMDB2hq{Lz&~osC@d&)a9M}5YYsMq+7W0W# zWZo*{D!jwo&G=C*ba-eaa8WL(d|N6sC606rt{GVAaK^PD*hUon4YPQW)z8%pZ; J^sjQF+CL_D+SUL7 delta 688 zcmY+C-)qxQ6vs)8Iyg?8JLBzd@f}p-^>`B;*_#neK^-=s2eDEX-jJ@2?_xnBPaxRCvpWDw3b#{?2 zX+G%~Z8PvkmaUGt*tA^zhGBac2<>juv(12Q@?)dEa^Th++U>bfCi|l0tgYLI;{@yt zUxhSP**E?w7oJ770%u~?Cs`;&wIcfgDil!7KK%UTYY{CnbNKe5u@-vx) z8q!hD!YSl?r3iK8FJj|}Mq)8KPo~AT(X!TCo)u7;p2vpW#04zvCJL-1sBj6BIiU>8 z$Q?mrePIc!JHqAY)L2c-5V{%{yGa$Upx#I}u)L8x&VC97_JkjcT}`aUD(tkdb098( z9dUyF5ev|b^^BB--hn>)LJz~YlE(f?8R$oP9&RCjOS&?k>I3g~P^C#h7GB75=f>6h@!N=dz1a?1j;#J2wt3tn?&mp| zhmYt!ai`J!C}sGH4;s{kF!%KTo_^2c diff --git a/generated_examples/under_the_hood/class_method_codeobj.pickle b/generated_examples/under_the_hood/class_method_codeobj.pickle index 4344d3e689f1c32fb6e48a50b05f0ca84114e5f7..c34e114ca3ad1aa5f8cc721bc60059585091754a 100644 GIT binary patch delta 437 zcmXBPUr5tY6bEp>*Zuy@{dNaaW3`53D$%9}K3GH$MBu;~p%4T;%xT`1FpvgCFbxDX zG=nc%QqYSJq7Np4FM-fQ4}l=)OJT5qZ=w(3OBk5f-(K$doOAAhb2j5^ao@NxzqIZP zgP-jVL|Cy~5#>)Low#zRi`f}uS;1Au&b+uckRQrD(^Q3>PS~*@O1ujlros$ zstgNN)a=A_-U+tiB|ikC)pAKQg;)F+j8zL0n(dh6BN^j~TaVXTZ9>g*PId_OR);9d zQVK;L%al+HYz|!!YLWLt*M$10!(~Qf$oy2j!4U;4Gg}+uJMjZww3681Z0!NQGh;OI zy|08VPhCa>wzb-@!%ZW`MWYYDcx1%!o6^i-pX+9XGiEOixMvRI567$vd}#IHFDq6( nzglVhr(q8oc@s4?d}`knPL2VQ=A7T=p>r{i59@}vSF!yJU$Trg delta 462 zcmXBPJxE(o90hPse4jBlFAz)GG(HTeL2NW&hl1eHp_GDj5d;Ut5G2nB^$G?Ye{RN zCuozZM?2pLn+eg1F7}Hg^4tComputation times#

-

00:00.108 total execution time for generated_examples_under_the_hood files:

+

00:00.106 total execution time for generated_examples_under_the_hood files:

+----------------------------------------------------------------------------------------+-----------+--------+ -| self_reference (docs/examples/under_the_hood/self_reference.py) | 00:00.060 | 0.0 MB | +| self_reference (docs/examples/under_the_hood/self_reference.py) | 00:00.058 | 0.0 MB | +----------------------------------------------------------------------------------------+-----------+--------+ | class_method (docs/examples/under_the_hood/class_method.py) | 00:00.048 | 0.0 MB | +----------------------------------------------------------------------------------------+-----------+--------+

diff --git a/generated_examples/under_the_hood/self_reference/index.html b/generated_examples/under_the_hood/self_reference/index.html index f83c91ed9..7ac8e0d75 100644 --- a/generated_examples/under_the_hood/self_reference/index.html +++ b/generated_examples/under_the_hood/self_reference/index.html @@ -2913,7 +2913,7 @@

Self reference magicgui widgetsfunction.show(run=True) -

Total running time of the script: ( 0 minutes 0.060 seconds)

+

Total running time of the script: ( 0 minutes 0.058 seconds)

Download Python source code: self_reference.py

diff --git a/scripts/__pycache__/_hooks.cpython-312.pyc b/scripts/__pycache__/_hooks.cpython-312.pyc index 0b4c8c213b4e79aeb2b6a2fcedfa8db9eb7590ba..c9fe08fbfe6ccb63ca511470d1190c417858a9a1 100644 GIT binary patch delta 19 ZcmZqkZ}aCm&CAQh00a(;H*(de0{}C81myq# delta 19 ZcmZqkZ}aCm&CAQh00cG*HgeUd0{}Bs1l|Au diff --git a/search/search_index.json b/search/search_index.json index 3ece2ac4d..3ec8edc90 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"magicgui \ud83e\uddd9","text":"

magicgui is a python library for building graphical user interfaces (GUIs).

It aims to speed up data workflows by providing a simple, consistent API for creating GUIs to control various data types, that work across various environments.

GUIs may be built manually using a variety of widgets, or generated automatically from python type hints.

"},{"location":"#magicgui-organization","title":"magicgui organization","text":"

magicgui can be thought of as performing two distinct tasks:

  1. Providing an simplified abstraction layer for GUI frameworks, allowing you to use the same API to create UIs that can move between environments and frameworks (such as a desktop app, or a Jupyter notebook).
  2. Providing a mapping of python types to widgets, allowing you to autogenerate graphical user interfaces for functions and dataclasses by annotating with standard python type hints.

While there is some degree of customizeability, the emphasis is on rapid development of relatively simple GUIs, with minimal boilerplate. For highly customized GUIs with complex layouts, it may be more appropriate to use a lower-level GUI framework.

The API is organized into 2 main levels:

magicgui API layers"},{"location":"#python-type-mapping","title":"Python Type Mapping","text":"

At its highest level, magicgui provides a mapping of Python types to widgets. This API allows you to create graphical user interfaces for your functions and dataclasses simply by annotating them with standard python type hints.

Type hints??

Type hints are a way to annotate your code with information about the types of variables and function arguments. They are completely optional, but static type checkers and other libraries (like magicgui!) can use them to check your code and/or provide additional functionality.

Typically, they are provided after a colon following a variable name or function argument.

In the example below, param_a has been annotated as an int, param_b as a str, and the return value as a list.

def my_function(param_a: int, param_b: str) -> list:\n    ...\n

If you are new to type annotations in Python, here are a few resources to get you started:

  • PEP 484 - the Python Enhancement Proposal that introduced type hints to the language. (See also: PEP 483)
  • Python docs - the official Python documentation on type hints and the typing module.
  • The mypy documentation also has a lot of useful information, including this cheat sheet
"},{"location":"#create_widget","title":"create_widget","text":"

magicgui.widgets.create_widget is a general function, used throughout the library, that allows you to create a widget for a specific Python type or value:

from magicgui.widgets import create_widget\n\n# passing a type to create_widget\nwidget = create_widget(annotation=int)\nwidget.show()\n

# passing a value to create_widget\nwidget2 = create_widget(value=\"Hello World\")\nwidget2.show()\n

For more details on how magicgui maps types to widgets, see Type Mapping.

"},{"location":"#magicgui_1","title":"magicgui","text":"

The magicgui.magicgui function is one way to autogenerate a compound Widget based on the parameters of a function:

from typing import Annotated, Literal\n# for Python <= 3.8\n# from typing_extensions import Annotated\n# for Python <= 3.7\n# from typing_extensions import Annotated, Literal\n\nfrom magicgui import magicgui\n\n\n@magicgui\ndef my_function(\n    param_a: int,\n    param_b: Annotated[int, {'widget_type': \"Slider\", 'max': 100}] = 42,\n    param_c: Literal[\"First\", \"Second\", \"Third\"] = \"Second\"\n):\n    print(\"param_a:\", param_a)\n    print(\"param_b:\", param_b)\n    print(\"param_c:\", param_c)\n\n# my_function now IS a widget, in addition to being a callable function\nmy_function.show()\n

For more details on using magicgui and magic_factory, see the magicgui decorators page.

"},{"location":"#guiclass","title":"guiclass","text":"

magicgui.experimental.guiclass is a newer experimental feature that provides an object-oriented alternative to magicgui. It wraps dataclasses.dataclass and adds a gui attribute to the resulting class, which is a magicgui-generated widget that can be used to control the dataclass instance. (The widget is only created when the gui attribute is accessed for the first time.)

from magicgui.experimental import guiclass, button\n\n@guiclass\nclass MyDataclass:\n    a: int = 0\n    b: str = 'hello'\n    c: bool = True\n\n    @button\n    def compute(self):\n        print(self.a, self.b, self.c)\n\nobj = MyDataclass(a=10, b='foo')\nobj.gui.show()\n

For more details on using the guiclass decorator, see Dataclasses & guiclass.

"},{"location":"#widgets","title":"Widgets","text":"

At the lower level, magicgui is a library of widgets (the individual elements that make up a graphical user interface). Each widget is customized to display and interact with a specific type of data. In some cases, it makes more sense to create and arrange these widgets manually, rather than using the type-based autogeneration features described above.

Magicgui acts as an abstraction layer for a variety of different GUI toolkits, allowing you to use the same API to create UIs that can move between environments (such as a desktop app, or a Jupyter notebook).

Currently, magicgui supports the following backends:

  • Qt (via PySide2/PySide6 or PyQt5/PyQt6)
  • Jupyter Widgets (a.k.a. \"IPyWidgets\")

You can use magicgui.widgets to quickly build graphical user interfaces.

from magicgui import widgets\n\na = widgets.SpinBox(value=10, label=\"a\")\nb = widgets.Slider(value=20, min=0, max=100, label=\"b\")\nresult = widgets.LineEdit(value=a.value * b.value, label=\"result\")\nbutton = widgets.PushButton(text=\"multiply\")\n\n@button.clicked.connect\ndef on_button_click():\n    result.value = a.value * b.value\n\ncontainer = widgets.Container(widgets=[a, b, result, button])\ncontainer.show()\n

To learn more about the available widgets and how to use them, see the Widgets Overview.

...details

Behind the scenes, magicgui declares a set of WidgetProtocols that each backend must implement, and every magicgui Widget is a wrapper around a backend-specific widget. Most users will never need to worry about this, but it's good to know that it's there if you ever need to dig deeper.

"},{"location":"#events","title":"Events","text":"

All widgets (whether created directly or autogenerated based on type hints) emit events when their value changes or in response to interaction.

To learn about connecting custom functionality to these events, see Events.

"},{"location":"#installation","title":"Installation","text":"

See installing magicgui.

"},{"location":"CONTRIBUTING/","title":"Contributing","text":"

Contributions are welcome!

"},{"location":"CONTRIBUTING/#development","title":"Development","text":"

To install magicgui for development, first clone the repository:

git clone https://github.com/pyapp-kit/magicgui\ncd magicgui\n

Then install the package in editable mode with the dev extra:

pip install -e .[dev]\n

To run the tests:

pytest\n
"},{"location":"CONTRIBUTING/#code-quality","title":"Code Quality","text":"

magicgui attempts to adhere to strict coding rules and employs the following static analysis tools to prevent errors from being introduced into the codebase:

  • black - code formatting
  • ruff - linting
  • mypy - static type analysis
  • codecov - test coverage

To prevent continuous integration failures when contributing, please consider installing pre-commit in your environment to run all of these checks prior to checking in new code.

pre-commit install\n

To run the checks manually, you can use:

pre-commit run --all-files\n
"},{"location":"CONTRIBUTING/#adding-a-widget","title":"Adding a widget","text":"

These instructions may change in the future as the repo structures changes. If they appear outdated as you follow them, please open an issue.

To add a new widget, you will need to:

  1. Create a new class in magicgui/widgets/_concrete.py that inherits from the base class most appropriate for your widget (e.g. ValueWidget, or CategoricalWidget).

    In some (complex) cases, you may need to extend one of the base classes. If so, it is likely that you will also need to extend one of the Protocols found in magicgui.widgets.protocols. This is where all of protocols that backend classes need to implement to work with a given widget type. (Don't hesitate to open an issue if you're confused).

  2. Most likely, you will want to decorate the class with @backend_widget. Using this decorator implies that there is a class with the same name in any any backend modules that will support this widget type (e.g. magicgui.backends._qtpy.widgets for Qt support.).

  3. Make any changes necessary to your new concrete class. For example, you may need to change the value property and corresponding setter to handle a specific type. This part of the code should be backend agnostic.
  4. Export the new class in magicgui/widgets/__init__.py so that it can be imported from magicgui.widgets.
  5. Implement the backend widget class (using the same class name) in the appropriate backend module (e.g. magicgui.backends._qtpy.widgets for Qt support). Usually this will mean implementing the appropriate _mgui_get/set_... methods for the Protocol of the corresponding widget base class your chose to extend.
  6. Export the backend widget class in the __init__.py of the backend module (e.g. magicgui.backends._qtpy.__init__.py for Qt support). This is important, as that is where the @backend_widget decorator will look.
  7. Add a test for your new widget.

For an example of a minimal PR adding a new widget, see #483, which added a QuantityWidget to be used with pint.Quantity objects.

"},{"location":"CONTRIBUTING/#associating-a-widget-with-a-type","title":"Associating a widget with a type","text":"

To associate your new widget with a specific type such that it will be used when someone annotates a parameter with that type, you will need to update code in magicgui.type_map._type_map.

In the simplest of cases, this will mean adding a new entry to the magicgui.type_map._type_map._SIMPLE_TYPES dict. This is a mapping from a python type to a widget class. (Note that all subclasses of the type will also be matched.)

For more complex cases, you can add a new conditional to the body of the match_type function. That function should always return a tuple of widget type, and kwargs that will be passed to the widget constructor. For example: return widgets.MyNewWidget, {}.

"},{"location":"CONTRIBUTING/#building-the-documentation","title":"Building the documentation","text":"

To build the documentation locally, you will need to install the docs extra:

pip install -e .[docs]\n

Then, from the root of the repository, run:

mkdocs serve\n

This will start a local server at http://127.0.0.1:8000/ where you can view the documentation as you edit it.

"},{"location":"dataclasses/","title":"Dataclasses & guiclass","text":""},{"location":"dataclasses/#what-are-dataclasses","title":"What are dataclasses?","text":"

dataclasses are a feature added in Python 3.7 (PEP 557) that allow you to simply define classes that store a specific set of data. They encourage clear, type-annotated code, and are a great way to define data structures with minimal boilerplate.

New to dataclasses?

If you're totally new to dataclasses, you might want to start with the official documentation for the dataclasses module, or this Real Python post on dataclasses. The following is a very brief example of the key features:

Example dataclass
from dataclasses import dataclass\n\n@dataclass  # (1)!\nclass Person:\n    name: str # (2)!\n    age: int = 0  # (3)!\n\np = Person(name='John', age=30)  # (4)!\nprint(p) # (5)!\n
  1. The @dataclass decorator is used to mark a class as a dataclass. This will automatically generate an __init__ method with a parameter for each annotated class attribute.
  2. Attribute names are annotated with types. Note that, as with all Python type hints, these have no runtime effect (i.e. no validation is performed).
  3. Optional attributes can be defined with a default value. If no default value is specified, then the field is required when creating a new object.
  4. Creating a new object is as simple as passing in the required arguments.
  5. The __repr__ method is automatically generated and will print out the class name and all of the attributes and their current values.
"},{"location":"dataclasses/#dataclass-patterns-outside-the-standard-library","title":"dataclass patterns outside the standard library","text":"

The dataclasses module is not the only way to define data-focused classes in Python. There are other libraries that provide similar functionality, and some of them have additional features that are not available in the standard library.

  • attrs is a popular library that provides a number of additional features on top of the standard library dataclasses, including complex validation and type conversions.
  • pydantic is a library that provides runtime type enforcement and casting, serialization, and other features.
  • msgspec is a fast serialization library with a msgspec.Struct that is similar to a dataclass.
"},{"location":"dataclasses/#magicgui-guiclass","title":"magicgui guiclass","text":"

Experimental

This is an experimental feature. The API may change in the future without deprecations or warnings.

magicgui supports the dataclass API as a way to define the interface for compound widget, where each attribute of the dataclass is a separate widget. The magicgui.experimental.guiclass decorator can be used to mark a class as a \"GUI class\". A GUI class is a Python standard dataclass that has two additional features:

  1. A property (named \"gui\" by default) that returns a Container widget which contains a widget for each attribute of the dataclass.
  2. An property (named \"events\" by default) that returns a psygnal.SignalGroup object that allows you to connect callbacks to the change event of any of field in the dataclass. (Under the hood, this uses the @evented dataclass decorator from psygnal.)

Tip

You can still use all of the standard dataclass features, including field values, __post_init__ processing, and ClassVar.

Info

In the future, we may also support other dataclass-like objects, such as pydantic models, attrs classes, and traitlets classes.

from magicgui.experimental import guiclass\n\n@guiclass\nclass MyDataclass:\n    a: int = 0\n    b: str = 'hello'\n    c: bool = True\n\nobj = MyDataclass()\nobj.gui.show()\n

The individual widgets in the Container may be accessed by the same name as the corresponding attribute. For example, obj.gui.a will return the SpinBox widget that controls the value of the a attribute.

"},{"location":"dataclasses/#two-way-data-binding","title":"Two-way data binding","text":"

As you interact programmatically with the obj instance, the widgets in the obj.gui will update. Similarly, as you change the value of the widgets in the obj.gui, the values of the obj instance will be updated.

obj = MyDataclass(a=10)\nobj.b = 'world'\nobj.c = False\n\nobj.gui.show()\n

All magicgui-related stuff is in the gui attribute

The original dataclass instance (obj) is essentially untouched. Just as in a regular dataclass, obj.a returns the current value of a in the dataclass. The widget for the class will be at obj.gui (or whatever name you specified in the gui_name parameter) So, obj.gui.a.value, returns the current value of the widget. Unless you explicitly disconnect the gui from the underlying object/model, the two will always be in sync.

"},{"location":"dataclasses/#adding-buttons-and-callbacks","title":"Adding buttons and callbacks","text":"

Buttons are one of the few widget types that tend not to have an associated value, but simply trigger a callback when clicked. That is: it doesn't often make sense to add a field to a dataclass representing a button. To add a button to a guiclass, decorate a method with the magicgui.experimental.button decorator.

positioning buttons

Currently, all buttons are appended to the end of the widget. The ability to position the button in the layout will be added in the future.

Any additional keyword arguments to the button decorator will be passed to the magicgui.widgets.PushButton constructor (e.g. label, tooltip, etc.)

from magicgui.experimental import guiclass, button\n\n@guiclass\nclass Greeter:\n    first_name: str\n\n    @button\n    def say_hello(self):\n        print(f'Hello {self.first_name}')\n\ngreeter = Greeter('Talley')\ngreeter.gui.show()\n

clicking the \"say_hello\" button will print \"Hello Talley\" to the console

Tip

As your widget begins to manage more internal state, the guiclass pattern becomes much more useful than the magicgui decorator pattern -- which was designed with pure functions that take inputs and return outputs in mind.

"},{"location":"decorators/","title":"magicgui & magic_factory","text":""},{"location":"decorators/#from-object-to-gui","title":"From Object to GUI","text":"

The eponymous feature of magicgui is the magicgui.magicgui function, which converts an object into a widget.

Info

Currently, the only supported objects are functions, but in the future magicgui.magicgui may accept other objects, such as dataclass instances

When used to decorate a function, @magicgui will autogenerate a graphical user interface (GUI) by inspecting the function signature and adding an appropriate GUI widget for each parameter, as described in Type Hints to Widgets. Parameter types are taken from type hints, if provided, or inferred using the type of the default value otherwise.

import math\nfrom enum import Enum\nfrom magicgui import magicgui\n\n# dropdown boxes are best made by creating an enum\nclass Medium(Enum):\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n# decorate your function with the @magicgui decorator\n@magicgui(call_button=\"calculate\")\ndef snells_law(aoi=30.0, n1=Medium.Glass, n2=Medium.Water, degrees=True):\n    aoi = math.radians(aoi) if degrees else aoi\n    try:\n        result = math.asin(n1.value * math.sin(aoi) / n2.value)\n        return math.degrees(result) if degrees else result\n    except ValueError:\n        # beyond the critical angle\n        return \"Total internal reflection!\"\n\nsnells_law.show()\n

The object returned by the magicgui decorator is an instance of magicgui.widgets.FunctionGui. It can still be called like the original function, but it also knows how to present itself as a GUI.

"},{"location":"decorators/#two-way-data-binding","title":"Two-Way Data Binding","text":"

The modified snells_law object gains attributes named after each of the parameters in the function. Each attribute is an instance of a magicgui.widgets.Widget subclass (suitable for the data type represented by that parameter). As you make changes in your GUI, the attributes of the snells_law object will be kept in sync. For instance, change the first dropdown menu from \"Glass\" to \"Oil\", and the corresponding n1 object on snells_law will change its value to 1.515:

snells_law.n1.value  # 1.515\n

It goes both ways: set a parameter in the console and it will change in the GUI:

snells_law.aoi.value = 47\nsnells_law.show()\n

"},{"location":"decorators/#its-still-a-function","title":"It's still a function","text":"

magicgui tries very hard to make it so that the decorated object behaves as much like the original object as possible.

We can invoke the function in a few ways:

  • Because we provided the call_button argument to the magicgui decorator, a new button was created that will execute the function with the current gui parameters when clicked.

  • We can call the object just like the original function.

    snells_law()        # 34.7602\nsnells_law(aoi=12)  # 13.7142\n

    Now however, the current values from the GUI will be used as the default values for any arguments that are not explicitly provided to the function.

    snells_law.aoi.value = 12\nsnells_law()  # 13.7142\nsnells_law(aoi=30)  # 34.7602\n

    In essence, your original function now has a \"living\" signature whose defaults change as the user interacts with your GUI.

    import inspect\n\ninspect.signature(snells_law)\n# <MagicSignature(\n#   aoi=12.0, n1=<Medium.Glass: 1.52>, n2=<Medium.Water: 1.333>, degrees=True\n# )>\n# notice how the default `aoi` is now 12 ... because we changed it above\n
  • You can still override positional or keyword arguments in the original function, just as you would with a regular function.

    Note

    calling the function with values that differ from the GUI will not set the values in the GUI... It's just a one-time call.

    # in radians, overriding the value for the second medium (n2)\nsnells_law(0.8, n2=Medium.Air, degrees=False)  # 'Total internal reflection!'\n
"},{"location":"decorators/#connecting-events","title":"Connecting Events","text":""},{"location":"decorators/#function-calls","title":"Function Calls","text":"

With a GUI, you are usually looking for something to happen as a result of calling the function. The function will have a new called attribute that you can connect to an arbitrary callback function:

@snells_law.called.connect\ndef my_callback(value: str):\n    # The callback receives an `Event` object that has the result\n    # of the function call in the `value` attribute\n    print(f\"Your function was called! The result is: {value}\")\n\nresult = snells_law()\n

Now when you call snells_law(), or click the calculate button in the gui, my_callback will be called with the result of the calculation.

"},{"location":"decorators/#parameter-changes","title":"Parameter Changes","text":"

You can also listen for changes on individual function parameters by connecting to the <parameter_name>.changed signal:

# whenever the current value for n1 changes, print it to the console:\n@snells_law.n1.changed.connect\ndef _on_n1_changed(x: Medium):\n    print(f\"n1 was changed to {x}\")\n\nsnells_law.n1.value = Medium.Air\n

Note

This signal will be emitted regardless of whether the parameter was changed in the GUI or via by directly setting the paramaeter on the gui instance.

"},{"location":"decorators/#usage-as-a-decorator-is-optional","title":"Usage As a Decorator is Optional","text":"

Remember: the @decorator syntax is just syntactic sugar. You don't have to use @magicgui to decorate your function declaration. You can also just call it with your function as an argument:

This decorator usage:

@magicgui(auto_call=True)\ndef function():\n    pass\n

is equivalent to this:

def function():\n    pass\n\nfunction = magicgui(function, auto_call=True)\n

In many cases, it will actually be desirable not to use magicgui as a decorator if you don't need a widget immediately, but want to create one later (see also the magic_factory decorator.)

# some time later...\nwidget_instance = magicgui(function)\n
"},{"location":"decorators/#magic_factory","title":"magic_factory","text":"

The magicgui.magic_factory function/decorator acts very much like the magicgui decorator, with one important difference:

Unlike magicgui, magic_factory does not return a widget instance immediately. Instead, it returns a \"factory function\" that can be called to create a widget instance.

This is an important distinction to understand. In most cases, the @magicgui decorator is useful for interactive use or rapid prototyping. But if you are writing a library or package where someone else will be instantiating your widget (a napari plugin is a good example), you will likely want to use magic_factory instead, (or create your own Widget Container subclass).

it's just a partial

If you're familiar with functools.partial, you can think of magic_factory as a partial function application of the magicgui decorator (in fact, magic_factory is a subclass of partial). It is very roughly equivalent to:

def magic_factory(func, *args, **kwargs):\n    return partial(magicgui, func, *args, **kwargs)\n
"},{"location":"decorators/#widget_init","title":"widget_init","text":"

magic_factory gains one additional parameter: widget_init. This accepts a callable that will be called with the new widget instance each time the factory is called. This is a convenient place to add additional initialization or connect events.

from magicgui import magic_factory\n\ndef _on_init(widget):\n    print(\"widget created!\", widget)\n    widget.y.changed.connect(lambda x: print(\"y changed!\", x))\n\n@magic_factory(widget_init=_on_init)\ndef my_factory(x: int, y: str): ...\n\nnew_widget = my_factory()\n
"},{"location":"decorators/#the-lack-of-magic-in-magicgui","title":"The (lack of) \"magic\" in magicgui","text":"

Just to demystify the name a bit, there really isn't a whole lot of \"magic\" in the magicgui decorator. It's really just a thin wrapper around the magicgui.widgets.create_widget function, to create a Container with a sub-widget for each parameter in the function signature.

The widget creation is very roughly equivalent to something like this:

from inspect import signature, Parameter\nfrom magicgui.widgets import create_widget, Container\nfrom magicgui.types import Undefined\n\n\ndef pseudo_magicgui(func: 'Callable'):\n    return Container(\n        widgets=[\n            create_widget(p.default, annotation=p.annotation, name=p.name)\n            for p in signature(func).parameters.values()\n        ]\n    )\n\ndef some_func(x: int = 2, y: str = 'hello'):\n    return x, y\n\nmy_widget = pseudo_magicgui(some_func)\nmy_widget.show()\n

In the case of magicgui, a special subclass of Container (FunctionGui) is used, which additionally adds a __call__ method that allows the widget to behave like the original function.

"},{"location":"events/","title":"Events","text":"

All magicgui widgets emit events when certain properties change. For each event there is a corresponding signal attribute on the widget that can be connected to a callback function. For example, a PushButton emits an event when it is clicked, and all ValueWidget subclasses (like Slider or LineEdit) emit an event when their value changes.

"},{"location":"events/#connecting-to-events","title":"Connecting to events","text":"

To connect a callback to an event, use the connect method of the signal attribute. The exact signals available on each widget are mostly defined in the base classes, and are listed on the API page for each respective widget.

For example, to connect a callback to a LineEdit widget's changed event:

Widget APImagicgui decoratormagic_factory decorator
from magicgui import widgets\n\ntext = widgets.LineEdit(value='type something')\ntext.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n
from magicgui import magicgui\n\n@magicgui\ndef my_function(text: str):\n    ...\n\nmy_function.text.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n
from magicgui import magic_factory\n\ndef _on_init(widget):\n    widget.text.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n\n@magic_factory(widget_init=_on_init)\ndef my_function(text: str):\n    ...\n\nmy_widget = my_function()\n

It's all psygnal under the hood

magicgui uses psygnal for its event system. For greater detail on the connect method and its options, see the Usage section of psygnal's documentation, or the psygnal.SignalInstance.connect API reference.

Tip

Note that connect returns the callable that it was passed, so you can use it as a decorator if you prefer.

text = widgets.LineEdit(value='type something')\n\n# this works\ntext.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n\n# so does this\n@text.changed.connect\ndef on_text_changed(val):\n    print(f\"Text changed to: {val}\")\n
"},{"location":"installation/","title":"Installation","text":"

magicgui is a pure Python package, and can be installed with pip:

pip install magicgui\n

or with conda:

conda install -c conda-forge magicgui\n
"},{"location":"installation/#backends","title":"Backends","text":"

magicgui requires a backend to be installed in order to function, but it does not specify a particular backend by default. The following backends are available:

  • PyQt5: pip install magicgui[pyqt5]
  • PyQt6: pip install magicgui[pyqt6]
  • PySide2: pip install magicgui[pyside2]
  • PySide6: pip install magicgui[pyside6]
  • Jupyter Widgets: pip install magicgui[jupyter]

Important

Note not all widgets are necessarily implemented for all backends. Most widgets in the widget docs specify which backends are supported.

"},{"location":"installation/#extras","title":"Extras","text":"

The Image widget requires pillow. You may use the image extra:

pip install magicgui[image]\n

The magicgui.tqdm module requires tqdm. You may use the tqdm extra:

pip install magicgui[tqdm]\n

The QuantityEdit widget requires pint. You may use the quantity extra:

pip install magicgui[quantity]\n
"},{"location":"type_map/","title":"Type Hints to Widgets","text":"

One of the key offerings of magicgui is the ability to automatically generate Widgets from Python type hints. This page describes how type hints are mapped to Widgets, and how to customize that mapping.

"},{"location":"type_map/#default-type-mapping","title":"Default Type Mapping","text":"

By default, The following python Type Hint annotations are mapped to the corresponding Widget class, and parametrized with the corresponding kwargs (when applicable):

Type Hint Widget __init__ kwargs bool Slider int Slider float FloatSlider str LineEdit range RangeEdit slice SliceEdit list ListEdit tuple TupleEdit pathlib.Path FileEdit os.PathLike FileEdit Sequence[pathlib.Path] FileEdit {'mode': 'rm'} datetime.time TimeEdit datetime.timedelta TimeEdit datetime.date DateEdit datetime.datetime DateTimeEdit Literal['a', 'b'] ComboBox {'choices': ['a', 'b']} Set[Literal['a', 'b']] Select {'choices': ('a', 'b')} enum.Enum ComboBox {'choices': <enum 'Enum'>} magicgui.widgets.ProgressBar ProgressBar {'bind': <function match_type.<locals>.<lambda> at 0x13fedd8a0>, 'visible': True} types.FunctionType FunctionGui {'function': ...} pint.Quantity QuantityEdit"},{"location":"type_map/#example","title":"Example","text":"

from magicgui import widgets\nimport pathlib\nimport os\nimport datetime\nfrom typing import Literal, Set, Sequence\nimport types\nimport pint\nimport enum\n\ntypes = [\n    bool, int, float, str, range, slice, list,\n    pathlib.Path, os.PathLike, Sequence[pathlib.Path],\n    datetime.time, datetime.timedelta, datetime.date, datetime.datetime,\n    Literal['a', 'b'], Set[Literal['a', 'b']], enum.Enum,\n    widgets.ProgressBar, pint.Quantity,\n]\n\nwdg = widgets.Container(\n    widgets=[\n        widgets.create_widget(annotation=t, label=str(t)) for t in types\n    ]\n)\nwdg.show()\n

"},{"location":"type_map/#customizing-widget-options-with-typingannotated","title":"Customizing Widget Options with typing.Annotated","text":"

Widget options and types may be embedded in the type hint itself using typing.Annotated.

Note

This is not the only way to customize the widget type or options in magicgui. Some functions (like magicgui.magicgui) also accept **param_options keyword arguments that map parameter names to dictionaries of widget options.

"},{"location":"type_map/#overriding-the-default-type","title":"Overriding the Default Type","text":"

To override the widget class used for a given object type, use the widget_type key in the Annotated kwargs. It can be either the string name of one of the built-in widgets, or any Widget subclass object.

Type Hint Widget __init__ kwargs Annotated[int, {'widget_type': 'Slider'}] Slider Annotated[float, {'widget_type': 'FloatSlider'}] FloatSlider"},{"location":"type_map/#overriding-the-default-options","title":"Overriding the Default Options","text":"

Any additional kwargs will be passed to the widget constructor (and must be valid for the corresponding widget type).

Type Hint Widget __init__ kwargs Annotated[int, {'step': 10, 'max': 50}] Slider {'step': 10, 'max': 50} Annotated[int, {'choices': [1, 2, 3]}] Slider {'choices': [1, 2, 3]}"},{"location":"type_map/#examples","title":"Examples","text":"

Create a widget using standard type map:

create_widgetmagicgui decoratorguiclass decorator
my_widget = widgets.create_widget(value=42, annotation=int)\n
from magicgui import magicgui\n\n@magicgui\ndef my_widget(x: int = 42):\n    return x\n
from magicgui.experimental import guiclass\n\n@guiclass\nclass MyObject:\n    x: int = 42\n\nobj = MyObject()\nmy_widget = obj.gui\n

Customize a widget using typing.Annotated:

create_widgetmagicgui decoratorguiclass decorator
from typing import Annotated\n\nInt10_50 = Annotated[int, (('widget_type', 'Slider'),('step', 10),('max', 50))]\nwdg2 = widgets.create_widget(value=42, annotation=Int10_50)\n
from magicgui import magicgui\nfrom typing import Annotated\n\nInt10_50 = Annotated[int, (('widget_type', 'Slider'),('step', 10),('max', 50))]\n\n@magicgui\ndef my_widget(x: Int10_50 = 42):\n    ...\n
from magicgui.experimental import guiclass\nfrom typing import Annotated\n\nInt10_50 = Annotated[int, (('widget_type', 'Slider'),('step', 10),('max', 50))]\n\n@guiclass\nclass MyObject:\n    x: Int10_50 = 42\n\nobj = MyObject()\nmy_widget = obj.gui\n

Note that you may also customize widget creation with kwargs to create_widget

from typing import Annotated\nfrom magicgui.widgets import Slider\n\noptions = {'step': 10, 'max': 50}\nwdg3 = widgets.create_widget(value=42, widget_type=Slider, options=options)\nwdg3.show()\n

... or to the magicgui decorator:

@magicgui(x={'widget_type': 'Slider', 'step': 10, 'max': 50})\ndef my_widget(x: int = 42):\n    ...\n\nmy_widget.show()\n

"},{"location":"type_map/#return-type-mapping","title":"Return Type Mapping","text":"

In some cases, magicgui may be able to create a widget for the return annotation of a function.

... more to come ...

"},{"location":"type_map/#postponed-annotations","title":"Postponed annotations","text":"

Using forward references and __future__.annotations with magicgui is possible, but requires some extra care. Read on for more details.

"},{"location":"type_map/#forward-references","title":"Forward References","text":"

When a type hint contains names that have not been defined yet, that definition may be expressed as a string literal, to be resolved later. This is called a Forward Reference (see PEP 484). This is useful when you want to use a type hint that refers to a type that has not yet been defined, or when you want to avoid importing a type that is only used in a type hint.

from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from mymodule import MyType\n\ndef my_function(x: 'MyType') -> None:\n    ...\n
"},{"location":"type_map/#__future__annotations","title":"__future__.annotations","text":"

In Python 3.7, the __future__.annotations feature was introduced (PEP 563), which postpones the evaluation of type annotations. The effect of this is that no type annotations will be evaluated at definition time, and all type annotations will be treated as strings (regardless of whether they are enclosed in quotes or not).

from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from mymodule import MyType\n\n# no longer necessary to use quotes around 'MyType'\ndef my_function(x: MyType) -> None:\n    ...\n

While this is a useful feature for developers, it does make it significantly more difficult to use those type annotations at runtime.

Magicgui does attempt to resolve forward references it encounters (see Resolving type hints at runtime for gory details), but this is an imperfect process, and may not always work.

"},{"location":"type_map/#if-you-must-use-postponed-annotations","title":"If You Must Use Postponed Annotations","text":"

As a general rule, if you must use forward references or __future__.annotations in a module that uses magicgui, you should:

  • don't use typing syntax that is not valid for ALL python versions you wish to support (e.g. str | int instead of Union[str, int] in python < 3.10), as these will raise an exception when magicgui attempts to evaluate them at runtime.
  • use fully qualified names for all type hints, as these will be easier for magicgui to resolve without user-supplied namespaces.

    from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    import mymodule\n\n# this is easier for magicgui to resolve\ndef my_function(x: mymodule.MyType) -> None:\n    ...\n
"},{"location":"type_map/#registering-support-for-custom-types","title":"Registering Support for Custom Types","text":"

Any third-party library may use the magicgui.register_type function to register its types with magicgui. When a registered type is used as an annotation, the registered widget will be used.

"},{"location":"type_map/#known-third-party-support-for-magicgui","title":"Known Third-Party Support for magicgui","text":"

Hi developer!

Have a library that registers types with magicgui? Let us know and we'll add it to this list!

"},{"location":"type_map/#napari","title":"napari","text":"

napari has registered a number of its types to provide access to napari-specific objects using type annotations in magicgui. Details may be found in napari's documentation on using magicgui in napari.

"},{"location":"widgets/","title":"Widgets","text":"

Tip

If you're looking for an index of all available widgets, see the Widget Index.

All individual graphical elements in magicgui are \"widgets\", and all widgets are instances of magicgui.widgets.Widget. Widgets may be created directly:

from magicgui.widgets import LineEdit\n\nline_edit = LineEdit(value='hello!')\nline_edit.show()\n

Some widgets (such as magicgui.widgets.Container) are composite widgets that comprise other widgets:

from magicgui.widgets import LineEdit, SpinBox, Container\n\nline_edit = LineEdit(value='hello!')\nspin_box = SpinBox(value=400)\ncontainer = Container(widgets=[line_edit, spin_box])\ncontainer.show()\n

magicgui provides a way to automatically select a widget given a python value or type annotation using magicgui.widgets.create_widget. Here is an example that yields the same result as the one above:

from magicgui.widgets import create_widget\n\nx = 'hello!'\ny = 400\ncontainer = Container(widgets=[create_widget(i) for i in (x, y)])\ncontainer.show()\n

Tip

Because there are often multiple valid widget types for a given python object, you may sometimes wish to create widgets directly, or use the widget_type argument in create_widget()

"},{"location":"widgets/#the-widget-hierarchy","title":"The widget hierarchy","text":"
graph TB\n    A([Widget])-->B([ValueWidget])\n    A-->C([ContainerWidget])\n    B-->D([RangedWidget])\n    B-->E([ButtonWidget])\n    B-->F([CategoricalWidget])\n    C-->H([MainWindowWidget])\n    C-->G([FunctionGui])\n    D-->I([SliderWidget])\n    click A \"#widget\"\n    click B \"#valuewidget\"\n    click C \"#containerwidget\"\n    click D \"#rangedwidget\"\n    click E \"#buttonwidget\"\n    click F \"#categoricalwidget\"\n    click H \"#mainwindowwidget\"\n    click G \"#functiongui\"\n    click I \"#sliderwidget\"

Many widgets present similar types of information in different ways. magicgui tries to maintain a consistent API among all types of widgets that are designed to represent similar objects. The general class of widget you are working with will determine the properties and attributes it has.

Note

The categories shown below are sorted by their base class (such as ValueWidget and RangedWidget). The bases are not intended to be instantiated directly. Instead, you would create the widget type you wanted, such as LineEdit or SpinBox, respectively.

"},{"location":"widgets/#widget","title":"Widget","text":"

As mentioned above, all magicgui widgets derive from magicgui.widgets.Widget and have the following attributes (this list is not comprehensive, see the magicgui.widgets.Widget API):

Attribute Type Description name str The name or \"ID\" of this widget (such as a function parameter name to which this widget corresponds). annotation Any A type annotation for the value represented by the widget. label str A string to use for an associated Label widget (if this widget is being shown in a magicgui.widgets.Container widget, and container.labels is True). By default, name will be used. Note: name refers the name of the parameter, as might be used in a signature, whereas label is just the label for that widget in the GUI. tooltip str A tooltip to display when hovering over the widget. visible bool Whether the widget is visible."},{"location":"widgets/#valuewidget","title":"ValueWidget","text":"

In addition to the base Widget properties mentioned above, the following ValueWidgets track some value:

Widget Description Label A non-editable text display. LineEdit A one-line text editor. LiteralEvalLineEdit A one-line text editor that evaluates strings as python literals. Password A one-line text editor that obscures input. TextEdit A widget to edit and display both plain and rich text. FileEdit A LineEdit widget with a button that opens a FileDialog. RangeEdit A widget to represent a python range object, with start/stop/step. SliceEdit A widget to represent slice objects, with start/stop/step. DateTimeEdit A widget for editing dates and times. DateEdit A widget for editing dates. TimeEdit A widget for editing times. Table A widget to represent columnar or 2D data with headers. QuantityEdit A combined LineEdit and ComboBox to edit a pint.Quantity. Attribute Type Description value Any The current value of the widget. changed psygnal.SignalInstance A psygnal.SignalInstance that will emit an event when the value has changed. Connect callbacks to the change event using widget.changed.connect(callback) bind Any, optional A value or callback to bind this widget. If bound, whenever widget.value is accessed, the value provided here will be returned. The bound value can be a callable, in which case bound_value(self) will be returned (i.e. your callback must accept a single parameter, which is this widget instance.). see ValueWidget.bind for details.

Here is a demonstration of all these:

from magicgui import widgets\nimport datetime\n\nwdg_list = [\n    widgets.Label(value=\"label value\", label=\"Label:\"),\n    widgets.LineEdit(value=\"line edit value\", label=\"LineEdit:\"),\n    widgets.Password(value=\"super-secret!\", label=\"Password:\"),\n    widgets.TextEdit(value=\"text edit value...\", label=\"TextEdit:\"),\n    widgets.FileEdit(value=\"/home\", label=\"FileEdit:\"),\n    widgets.RangeEdit(value=range(0, 10, 2), label=\"RangeEdit:\"),\n    widgets.SliceEdit(value=slice(0, 10, 2), label=\"SliceEdit:\"),\n    widgets.DateTimeEdit(\n      value=datetime.datetime(1999, 12, 31, 11, 30), label=\"DateTimeEdit:\"\n    ),\n    widgets.DateEdit(value=datetime.date(81, 2, 18), label=\"DateEdit:\"),\n    widgets.TimeEdit(value=datetime.time(12, 20), label=\"TimeEdit:\"),\n    widgets.QuantityEdit(value='12 seconds', label=\"Quantity:\")\n]\ncontainer = widgets.Container(widgets=wdg_list)\ncontainer.max_height = 300\ncontainer.show()\n

"},{"location":"widgets/#rangedwidget","title":"RangedWidget","text":"

RangedWidgets are numerical ValueWidgets that have a restricted range of valid values, and a step size. RangedWidgets include:

Widget Description SpinBox A widget to edit an integer with clickable up/down arrows. FloatSpinBox A widget to edit a float with clickable up/down arrows.

In addition to all of the ValueWidget attributes, RangedWidget attributes include:

Attribute Type Description min float The minimum allowable value, by default 0 max float The maximum allowable value, by default 1000 step float The step size for incrementing the value, by default 1 range tuple of float A convenience attribute for getting/setting the (min, max) simultaneously

w1 = widgets.SpinBox(value=10, max=20, label='SpinBox:')\nw2 = widgets.FloatSpinBox(value=380, step=0.5, label='FloatSpinBox:')\ncontainer = widgets.Container(widgets=[w1, w2])\ncontainer.show()\n

"},{"location":"widgets/#sliderwidget","title":"SliderWidget","text":"

SliderWidgets are special RangedWidgets that additionally have an orientation, and a readout.

Widget Description Slider A slider widget to adjust an integer value within a range. FloatSlider A slider widget to adjust an integer value within a range. LogSlider A slider widget to adjust a numerical value logarithmically within a range. ProgressBar A progress bar widget.

In addition to all of the RangedWidget attributes, SliderWidget attributes include:

Attribute Type Description orientation str The orientation for the slider. Must be either 'horizontal' or 'vertical'. by default 'horizontal' readout bool Whether to show the value of the slider. By default, True.

w1 = widgets.Slider(value=10, max=25, label='Slider:')\nw2 = widgets.FloatSlider(value=10.5, max=18.5, label='FloatSlider:')\nw3 = widgets.ProgressBar(value=80, max=100, label='ProgressBar:')\ncontainer = widgets.Container(widgets=[w1, w2, w3])\ncontainer.show()\n

"},{"location":"widgets/#buttonwidget","title":"ButtonWidget","text":"

ButtonWidgets are boolean ValueWidgets that also have some text associated with them.

Widget Description PushButton A clickable command button. CheckBox A checkbox with a text label.

In addition to all of the ValueWidget attributes, ButtonWidget attributes include:

Attribute Type Description text str The text to display on the button. If not provided, will use name.

w1 = widgets.PushButton(value=True, text='PushButton Text')\nw2 = widgets.CheckBox(value=False, text='CheckBox Text')\ncontainer = widgets.Container(widgets=[w1, w2])\ncontainer.show()\n

"},{"location":"widgets/#categoricalwidget","title":"CategoricalWidget","text":"

CategoricalWidget are ValueWidgets that provide a set of valid choices. They can be created from:

  • an enum.Enum
  • an iterable of objects (or an iterable of 2-tuples (name, object))
  • a callable that returns an enum.Enum or an iterable
  • a typing.Literal annotation.
Widget Description ComboBox A dropdown menu, allowing selection between multiple choices. RadioButtons An exclusive group of radio buttons, providing a choice from multiple choices. Select A list of options, allowing selection between multiple choices.

In addition to all of the ValueWidget attributes, CategoricalWidget attributes include:

Attribute Type Description choices Enum, Iterable, or Callable Available choices displayed in the widget. value Any In the case of a CategoricalWidget the value is the data of the currently selected choice (see also: current_choice below). current_choice str The name associated with the current choice. For instance, if choices was provided as choices=[('one', 1), ('two', 2)], then an example value would be 1, and an example current_choice would be 'one'.

choices = ['one', 'two', 'three']\nw1 = widgets.ComboBox(choices=choices, value='two', label='ComboBox:')\nw2 = widgets.RadioButtons(choices=choices, label='RadioButtons:')\nw3 = widgets.Select(choices=choices, label='Select:')\ncontainer = widgets.Container(widgets=[w1, w2, w3])\ncontainer.max_height = 220\ncontainer.show()\n

"},{"location":"widgets/#containerwidget","title":"ContainerWidget","text":"

A ContainerWidget is a list-like Widget that can contain other widgets. Containers allow you to build more complex widgets from sub-widgets. A notable example of a Container is magicgui.widgets.FunctionGui) (the product of the @magicgui decorator).

Widget Description Container A Widget to contain other widgets. MainWindow A Widget to contain other widgets, includes a menu bar. FunctionGui Wrapper for a container of widgets representing a callable object. Attribute Type Description layout str The layout for the container. Must be either 'horizontal' or 'vertical'. widgets Sequence[Widget] The widgets that the container contains. labels bool Whether each widget should be shown with a corresponding Label widget to the left. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

Container implements the full collections.abc.MutableSequence interface. You can add and remove widgets from it just as you would add or remove items from a list.

from magicgui.widgets import Container, Slider, FloatSlider, ProgressBar\n\ncontainer = widgets.Container()\ncontainer.append(widgets.LineEdit(value='Mookie', label='Your Name:'))\ncontainer.append(widgets.FloatSlider(value=10.5, label='FloatSlider:'))\ncontainer.show()\n

"},{"location":"widgets/#mainwindowwidget","title":"MainWindowWidget","text":"

A MainWindowWidget is a special type of ContainerWidget that also includes a menu bar.

"},{"location":"widgets/#functiongui","title":"FunctionGui","text":"

A FunctionGui is a special type of ContainerWidget that is created from a function. It is the product of the @magicgui decorator. It is a container that contains a widget for each of the parameters in the function. See magicgui.widgets.FunctionGui for details.

"},{"location":"widgets/#magicgui","title":"@magicgui","text":"

It's worth noting that @magicgui and @magic_factory decorators are just conveniences that build a special type of Container widget (a FunctionGui), with a widget representing each of the parameters in a decorated function.

from magicgui import magicgui\n\n@magicgui\ndef my_function(x='hello', y=400): ...\n\nmy_function.show()\n

In terms of simply building widgets, the following code performs a similar task to @magicgui.

from inspect import signature\n\ndef my_function(x='hello', y=400):\n  ...\n\nparams = signature(my_function).parameters.values()\ncontainer = Container(\n    widgets=[create_widget(p.default, name=p.name) for p in params]\n)\ncontainer.show()\n

Tip

Note that the FunctionGui widget produced by @magicgui is actually a callable object that behaves very much like the original function, except that it will use current values from the GUI as default parameters when calling the function.

"},{"location":"api/app/","title":"Application","text":""},{"location":"api/app/#magicgui.application.Application","title":"magicgui.application.Application","text":"

Magicgui Application, wrapping a native BaseApplicationBackend implementation.

"},{"location":"api/app/#magicgui.application.Application.backend_module","title":"backend_module: ModuleType property","text":"

Return module object that defines the backend.

"},{"location":"api/app/#magicgui.application.Application.backend_name","title":"backend_name: str property","text":"

Return name of the GUI backend that this app wraps.

"},{"location":"api/app/#magicgui.application.Application.native","title":"native: Any property","text":"

Return the native GUI application instance.

"},{"location":"api/app/#magicgui.application.Application.__enter__","title":"__enter__() -> Application","text":"

Context manager to start this application.

"},{"location":"api/app/#magicgui.application.Application.__exit__","title":"__exit__(*exc_details: Any) -> None","text":"

Exit context manager for this application.

"},{"location":"api/app/#magicgui.application.Application.__repr__","title":"__repr__() -> str","text":"

Return repr for this instance.

"},{"location":"api/app/#magicgui.application.Application.create","title":"create() -> None","text":"

Create the native application.

"},{"location":"api/app/#magicgui.application.Application.get_obj","title":"get_obj(name: str) -> Any","text":"

Get the backend object for the given name (such as a widget).

"},{"location":"api/app/#magicgui.application.Application.process_events","title":"process_events() -> None","text":"

Process all pending GUI events.

"},{"location":"api/app/#magicgui.application.Application.quit","title":"quit() -> None","text":"

Quit the native GUI event loop.

"},{"location":"api/app/#magicgui.application.Application.run","title":"run() -> None","text":"

Enter the native GUI event loop.

"},{"location":"api/app/#magicgui.application.Application.start_timer","title":"start_timer(interval: int = 1000, on_timeout: Callable[[], None] | None = None, single_shot: bool = False) -> None","text":"

Start a timer with a given interval, optional callback, and single_shot.

"},{"location":"api/app/#magicgui.application.use_app","title":"magicgui.application.use_app(app: AppRef | None = None) -> Application","text":"

Get/create the default Application object. See _use_app docstring.

"},{"location":"api/experimental/","title":"magicgui.experimental","text":"

Experimental

This module contains experimental features that are not yet ready for prime time. All of the features in this module are subject to change without warning or deprecation.

"},{"location":"api/experimental/#magicgui.experimental.guiclass","title":"magicgui.experimental.guiclass(cls: T | None = None, *, gui_name: str = 'gui', events_namespace: str = 'events', follow_changes: bool = True, **dataclass_kwargs: Any) -> T | Callable[[T], T]","text":"

Turn class into a dataclass with a property (gui_name) that returns a gui.

This decorator is similar to dataclasses.dataclass, but it will also add an events attribute to the class that is an instance of psygnal.SignalGroup (with a signal for each field in the dataclass; see https://psygnal.readthedocs.io/en/latest/dataclasses/ for details), and a gui property that returns a magicgui widget, bound to the values of the dataclass instance.

Note

This decorator is compatible with dataclasses using slots=True, however, there is a potential for a memory leak that the user should be aware of. If you create a guiclass instance, and then store a reference to its gui, and then delete the instance, the gui will still be bound to the instance, preventing it from being garbage collected. To avoid this, you can call unbind_gui_from_instance(gui, instance) before deleting the instance.

Parameters:

  • cls (type, default: None ) \u2013

    The class to turn into a dataclass.

  • gui_name (str, default: 'gui' ) \u2013

    The name of the property that will return a magicgui widget, by default \"gui\"

  • events_namespace (str, default: 'events' ) \u2013

    The name of the attribute that will be added to the class, by default \"events\". This attribute will be an instance of psygnal.SignalGroup that will be used to connect events to the class.

  • follow_changes (bool, default: True ) \u2013

    If True (default), changes to the dataclass instance will be reflected in the gui, and changes to the gui will be reflected in the dataclass instance.

  • dataclass_kwargs (dict, default: {} ) \u2013

    Additional keyword arguments to pass to dataclasses.dataclass.

Returns:

  • type \u2013

    The dataclass.

Examples:

>>> @guiclass\n... class MyData:\n...     x: int = 0\n...     y: str = 'hi'\n...\n...     @button\n...     def reset(self):\n...         self.x = 0\n...         self.y = 'hi'\n...\n>>> data = MyData()\n>>> data.gui.show()\n
"},{"location":"api/experimental/#magicgui.experimental.button","title":"magicgui.experimental.button(func: F | None = None, **button_kwargs: Any) -> F | Callable[[F], F]","text":"

Add a method as a button to a guiclass, which calls the decorated method.

Parameters:

  • func (callable, default: None ) \u2013

    The method to decorate. If None, returns a decorator that can be applied to a method.

  • button_kwargs (dict, default: {} ) \u2013

    Additional keyword arguments to pass to magicgui.widgets.PushButton.

"},{"location":"api/experimental/#magicgui.experimental.is_guiclass","title":"magicgui.experimental.is_guiclass(obj: object) -> TypeGuard[GuiClassProtocol]","text":"

Return True if obj is a guiclass or an instance of a guiclass.

"},{"location":"api/magic_factory/","title":"magicgui.magic_factory","text":""},{"location":"api/magic_factory/#magicgui.magic_factory","title":"magicgui.magic_factory(function=None, *, layout='vertical', scrollable=False, labels=True, tooltips=True, call_button=None, auto_call=False, result_widget=False, main_window=False, app=None, persist=False, widget_init=None, raise_on_unknown=False, **param_options)","text":"

Return a MagicFactory for function.

magic_factory is nearly identical to the magicgui decorator with the following differences:

  1. Whereas magicgui returns a FunctionGui instance, magic_factory returns a callable that returns a FunctionGui instance. (Technically, it returns an instance of MagicFactory which you behaves exactly like a functools.partial for a FunctionGui instance.)
  2. magic_factory adds a widget_init method: a callable that will be called immediately after the FunctionGui instance is created. This can be used to add additional widgets to the layout, or to connect signals to the widgets.

Important

Whereas decorating a function with magicgui will immediately create a widget instance, magic_factory will not create a widget instance until the decorated object is called. This is often what you want in a library, whereas magicgui is useful for rapid, interactive development.

Parameters:

  • function (Callable, default: None ) \u2013

    The function to decorate. Optional to allow bare decorator with optional arguments. by default None

  • layout (str, default: 'vertical' ) \u2013

    The type of layout to use. Must be horizontal or vertical by default \"vertical\".

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether labels are shown in the widget. by default True

  • tooltips (bool, default: True ) \u2013

    Whether tooltips are shown when hovering over widgets. by default True

  • call_button (bool or str, default: None ) \u2013

    If True, create an additional button that calls the original function when clicked. If a str, set the button text. If None (the default), it defaults to True when auto_call is False, and False otherwise.

  • auto_call (bool, default: False ) \u2013

    If True, changing any parameter in either the GUI or the widget attributes will call the original function with the current settings. by default False

  • result_widget (bool, default: False ) \u2013

    Whether to display a LineEdit widget the output of the function when called, by default False

  • main_window (bool, default: False ) \u2013

    Whether this widget should be treated as the main app window, with menu bar, by default False.

  • app (Application or str, default: None ) \u2013

    A backend to use, by default None (use the default backend.)

  • persist (bool, default: False ) \u2013

    If True, when parameter values change in the widget, they will be stored to disk and restored when the widget is loaded again with persist = True. Call magicgui._util.user_cache_dir() to get the default cache location. By default False.

  • widget_init (callable, default: None ) \u2013

    A function that will be called with the newly created widget instance as its only argument. This can be used to customize the widget after it is created. by default None.

  • raise_on_unknown (bool, default: False ) \u2013

    If True, raise an error if magicgui cannot determine widget for function argument or return type. If False, ignore unknown types. By default False.

  • param_options (dict of dict, default: {} ) \u2013

    Any additional keyword arguments will be used as parameter-specific widget options. Keywords must match the name of one of the arguments in the function signature, and the value must be a dict of keyword arguments to pass to the widget constructor.

Returns:

  • result ( MagicFactory or Callable[[F], MagicFactory] ) \u2013

    If function is not None (such as when this is used as a bare decorator), returns a MagicFactory instance. If function is None such as when arguments are provided like magic_factory(auto_call=True), then returns a function that can be used as a decorator.

Examples:

>>> @magic_factory\n... def my_function(a: int = 1, b: str = 'hello'):\n...     pass\n...\n>>> my_widget = my_function()\n>>> my_widget.show()\n>>> my_widget.a.value == 1  # True\n>>> my_widget.b.value = 'world'\n
"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory","title":"magicgui.type_map._magicgui.MagicFactory","text":"

Bases: partial, Generic[_FGuiVar]

Factory function that returns a FunctionGui instance.

While this can be used directly, (see example below) the preferred usage is via the magicgui.magic_factory decorator.

Examples:

>>> def func(x: int, y: str):\n...     pass\n...\n>>> factory = MagicFactory(function=func, labels=False)\n>>> # factory accepts all the same arguments as magicgui()\n>>> widget1 = factory(call_button=True)\n>>> # can also override magic_kwargs that were provided when creating the factory\n>>> widget2 = factory(auto_call=True, labels=True)\n
"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__name__","title":"__name__: str property","text":"

Pass function name.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__call__","title":"__call__(*args, **kwargs)","text":"

Call the wrapped _magicgui and return a FunctionGui.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__getattr__","title":"__getattr__(name)","text":"

Allow accessing FunctionGui attributes without mypy error.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__new__","title":"__new__(function, *args, magic_class=FunctionGui, widget_init=None, **keywords)","text":"

Create new MagicFactory.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__repr__","title":"__repr__()","text":"

Return string repr.

"},{"location":"api/magicgui/","title":"magicgui.magicgui","text":""},{"location":"api/magicgui/#magicgui.magicgui","title":"magicgui.magicgui(function=None, *, layout='vertical', scrollable=False, labels=True, tooltips=True, call_button=None, auto_call=False, result_widget=False, main_window=False, app=None, persist=False, raise_on_unknown=False, **param_options)","text":"

Return a FunctionGui for function.

Parameters:

  • function (Callable, default: None ) \u2013

    The function to decorate. Optional to allow bare decorator with optional arguments. by default None

  • layout (str, default: 'vertical' ) \u2013

    The type of layout to use. Must be horizontal or vertical by default \"vertical\".

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether labels are shown in the widget. by default True

  • tooltips (bool, default: True ) \u2013

    Whether tooltips are shown when hovering over widgets. by default True

  • call_button (bool or str, default: None ) \u2013

    If True, create an additional button that calls the original function when clicked. If a str, set the button text. If None (the default), it defaults to True when auto_call is False, and False otherwise.

  • auto_call (bool, default: False ) \u2013

    If True, changing any parameter in either the GUI or the widget attributes will call the original function with the current settings. by default False

  • result_widget (bool, default: False ) \u2013

    Whether to display a LineEdit widget the output of the function when called, by default False

  • main_window (bool, default: False ) \u2013

    Whether this widget should be treated as the main app window, with menu bar, by default False.

  • app (Application or str, default: None ) \u2013

    A backend to use, by default None (use the default backend.)

  • persist (bool, default: False ) \u2013

    If True, when parameter values change in the widget, they will be stored to disk and restored when the widget is loaded again with persist = True. Call magicgui._util.user_cache_dir() to get the default cache location. By default False.

  • raise_on_unknown (bool, default: False ) \u2013

    If True, raise an error if magicgui cannot determine widget for function argument or return type. If False, ignore unknown types. By default False.

  • param_options (dict[str, dict], default: {} ) \u2013

    Any additional keyword arguments will be used as parameter-specific options. Keywords must match the name of one of the arguments in the function signature, and the value must be a dict of keyword arguments to pass to the widget constructor.

Returns:

  • result ( FunctionGui or Callable[[F], FunctionGui] ) \u2013

    If function is not None (such as when this is used as a bare decorator), returns a FunctionGui instance, which is a list-like container of autogenerated widgets corresponding to each parameter in the function. If function is None such as when arguments are provided like magicgui(auto_call=True), then returns a function that can be used as a decorator.

Examples:

>>> @magicgui\n... def my_function(a: int = 1, b: str = 'hello'):\n...     pass\n...\n>>> my_function.show()\n>>> my_function.a.value == 1  # True\n>>> my_function.b.value = 'world'\n
"},{"location":"api/migration/","title":"migration guide","text":""},{"location":"api/migration/#v030-migration-guide","title":"v0.3.0 migration guide","text":"

October, 2021

Version 0.3.0 of magicgui introduced some changes to the events and callbacks API. See https://github.com/pyapp-kit/magicgui/pull/253 for details

"},{"location":"api/migration/#callbacks-now-receive-the-value-directly-instead-of-an-event-object","title":"Callbacks now receive the value directly, instead of an Event object","text":"

magicgui 0.3.0 is now using psygnal as its event/callback handler.

Callbacks connected to widget.changed (and other event emitters) may now receive the value(s) directly, instead of an event object:

\ud83d\udc4e Old Method (< v0.3.0)
@widget.changed.connect\ndef my_callback(event):\n    # event was an `Event` object with a `value` attribute\n    new_value = event.value\n

Existing code using callbacks with a single positional argument will continue to receive a single Event object (and a warning will be shown, until v0.4.0 where it will become an error).

To silence the warning and opt in to the new pattern of receiving value directly, you can do one of two things:

  1. type hint your single positional argument as anything other than magicgui.events.Event
  2. provide a callback that takes no arguments
\ud83d\udc4d New Method (>= v0.3.0)
@widget.changed.connect\ndef my_callback(new_value: int):\n    ...  # use new_value directly\n\n# or, if you don't need to use new_value\n@widget.changed.connect\ndef my_callback():\n    # something that didn't need the value\n    ...\n
"},{"location":"api/migration/#event-emitters-take-no-keyword-arguments","title":"Event emitters take no keyword arguments","text":"

For the few packages who were manually emitting change events, you should no longer provide the value= keyword when emitting.

\ud83d\udc4e Old Method (< v0.3.0)
widget.changed(value='whatever')\n
\ud83d\udc4d New Method (>= v0.3.0)
widget.changed.emit('whatever')\n# OR (if you prefer the direct __call__ syntax)\nwidget.changed('whatever')\n
"},{"location":"api/migration/#v020-migration-guide","title":"v0.2.0 migration guide","text":"

December, 2020

Version 0.2.0 of magicgui was a complete rewrite that introduced a couple breaking API changes

"},{"location":"api/migration/#gui-attribute-removed","title":".Gui() attribute removed","text":"

Before v0.2.0, the magicgui.magicgui decorator added a Gui attribute to the decorated function that was to be called to instantiate a widget. In v0.2.0 the object returned from the magicgui.magicgui decorator is already an instantiated magicgui.widgets.Widget.

\ud83d\udc4e Old Method (< v0.2.0)
from magicgui import magicgui, event_loop\n\n@magicgui\ndef function(x, y):\n    ...\n\nwith event_loop():\n    gui = function.Gui(show=True)\n
\ud83d\udc4d New Method (>= v0.2.0)
from magicgui import magicgui\n\n@magicgui\ndef function(x, y):\n    ...\n\nfunction.show(run=True)\n
"},{"location":"api/migration/#new-base-widget-type","title":"New base widget type","text":"

Before v0.2.0, the Gui() object returned by the magicgui.magicgui decorator was a MagicGuiBase widget class, which in turn was a direct subclass of a backend widget, such as a QtWidgets.QWidget. In v0.2.0, all widgets derive from [magicgui.widgets.Widget``][magicgui.widgets.Widget], and the *backend* is available atwidget.native. If you are incorporating magicgui widgets into a larger Qt-based GUI, please note that you will want to usewidget.nativeinstead ofwidget`

from magicgui import magicgui, use_app\n\nuse_app('qt')\n\n@magicgui\ndef function(x, y):\n    ...\n
>>> print(type(function))\n<class 'magicgui.widgets.FunctionGui'>\n>>> print(type(function.native))\n<class 'PyQt5.QtWidgets.QWidget'>\n
"},{"location":"api/migration/#starting-the-application","title":"Starting the application","text":"

It is now easier to show a widget and start an application by calling widget.show(run=True). Calling show(run=True) will immediately block execution of your script and show the widget. If you wanted to (for instance) show multiple widgets next to each other, then you would still want to use the event_loop context manager:

from magicgui import magicgui, event_loop\n\n@magicgui\ndef function_a(x=1, y=3):\n    ...\n\n@magicgui\ndef function_b(z='asdf'):\n    ...\n\nwith event_loop():\n    function_a.show()\n    function_b.show()\n# both widgets will show (though b may be on top of a)\n
"},{"location":"api/migration/#getting-and-setting-values","title":"Getting and setting values","text":"

To get or set the value of a widget programmatically, you no longer set the corresponding widget attribute directly, but rather use the widget.value attribute:

Old Method \ud83d\udc4e

gui.x used to be a descriptor object to get/set the value, but the actual underlying widget was at gui.x_widget

gui = function.Gui()\ngui.x = 10\n

New Method \ud83d\udc4d

now function.x IS the widget, and you set its value with function.x.value

function.x.value = 10\n
"},{"location":"api/migration/#connecting-callbacks-to-events","title":"Connecting callbacks to events","text":"

When binding callbacks to change events, you no longer connect to gui.<name>_changed, you now connect to function.<name>.changed:

\ud83d\udc4e Old Method (< v0.2.0)
gui = function.Gui()\ngui.x_changed.connect(my_callback)\n
\ud83d\udc4d New Method (>= v0.2.0)
function.x.changed.connect(my_callback)\n
"},{"location":"api/migration/#renamed","title":"Renamed","text":"
  • Widget.refresh_choices has been renamed to Widget.reset_choices.

  • @magicgui(result=True) has been renamed to @magicgui(result_widget=True)

"},{"location":"api/protocols/","title":"Backend Protocols","text":"

Advanced Topic

Most users of magicgui will not need to worry about this section.

These Protocol classes declare the interface that backend adapters must implement in order to be used by magicgui. All magicgui Widget objects compose a backend widget implementing one of these protocols, and control it using the methods defined herein.

magicgui developers may be interested in this page, but end-users needn't worry about it.

"},{"location":"api/protocols/#summary","title":"Summary","text":"Widget Description WidgetProtocol Base Widget Protocol: specifies methods that all widgets must provide. ValueWidgetProtocol Widget that has a current value, with getter/setter and on_change callback. ButtonWidgetProtocol The \"value\" in a ButtonWidget is the current (checked) state. TableWidgetProtocol ValueWidget subclass intended for 2D tabular data, with row & column headers. RangedWidgetProtocol Value widget that supports numbers within a provided min/max range. CategoricalWidgetProtocol Categorical widget, that has a set of valid choices, and a current value. SliderWidgetProtocol Protocol for implementing a slider widget. ContainerProtocol Widget that can contain other widgets. BaseApplicationBackend Backend Application object. DialogProtocol Protocol for modal (blocking) containers. SupportsChoices Widget that has a set of valid choices. SupportsOrientation Widget that can be reoriented. SupportsText Widget that have text (in addition to value)... like buttons. SupportsReadOnly Widget that can be read_only."},{"location":"api/protocols/#protocol-inheritance","title":"Protocol Inheritance","text":"

The visual hierarchy of protocols looks like this:

graph LR\n    A([WidgetProtocol])-->B([ValueWidgetProtocol])\n    A-->C([ContainerProtocol])\n    M([SupportsText])-->E\n    B-->E([ButtonWidgetProtocol])\n    B-->D([RangedWidgetProtocol])\n    B-->F([CategoricalWidgetProtocol])\n    D-->I([SliderWidgetProtocol])\n    B-->J([TableWidgetProtocol])\n    K([SupportsReadOnly])-->J([TableWidgetProtocol])\n    L([SupportsChoices])-->F\n    N([SupportsOrientation])-->C\n    N-->I\n    C-->O([DialogProtocol])\n    C-->P([MainWindowProtocol])\n\n    click A \"#magicgui.widgets.protocols.WidgetProtocol\"\n    click B \"#magicgui.widgets.protocols.ValueWidgetProtocol\"\n    click C \"#magicgui.widgets.protocols.ContainerProtocol\"\n    click D \"#magicgui.widgets.protocols.RangedWidgetProtocol\"\n    click E \"#magicgui.widgets.protocols.ButtonWidgetProtocol\"\n    click F \"#magicgui.widgets.protocols.CategoricalWidgetProtocol\"\n    click I \"#magicgui.widgets.protocols.SliderWidgetProtocol\"\n    click J \"#magicgui.widgets.protocols.TableWidgetProtocol\"\n    click K \"#magicgui.widgets.protocols.SupportsReadOnly\"\n    click L \"#magicgui.widgets.protocols.SupportsChoices\"\n    click M \"#magicgui.widgets.protocols.SupportsText\"\n    click N \"#magicgui.widgets.protocols.SupportsOrientation\"\n    click O \"#magicgui.widgets.protocols.DialogProtocol\"\n    click P \"#magicgui.widgets.protocols.MainWindowProtocol\"
"},{"location":"api/protocols/#widget-protocols","title":"Widget Protocols","text":""},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol","title":"magicgui.widgets.protocols.WidgetProtocol","text":"

Bases: Protocol

Base Widget Protocol: specifies methods that all widgets must provide.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_bind_parent_change_callback","title":"_mgui_bind_parent_change_callback(callback: Callable[[Any], None]) -> None abstractmethod","text":"

Bind callback to parent change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_close_widget","title":"_mgui_close_widget() -> None abstractmethod","text":"

Close widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_enabled","title":"_mgui_get_enabled() -> bool abstractmethod","text":"

Get the enabled state of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_height","title":"_mgui_get_height() -> int abstractmethod","text":"

Get the height of the widget.

The intention is to get the height of the widget after it is shown, for the purpose of unifying widget height in a layout. Backends may do what they need to accomplish this. For example, Qt can use sizeHint().height(), since height() may return something large if the widget has not yet been painted on screen.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_max_height","title":"_mgui_get_max_height() -> int abstractmethod","text":"

Get the maximum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_max_width","title":"_mgui_get_max_width() -> int abstractmethod","text":"

Get the maximum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_min_height","title":"_mgui_get_min_height() -> int abstractmethod","text":"

Get the minimum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_min_width","title":"_mgui_get_min_width() -> int abstractmethod","text":"

Get the minimum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_native_widget","title":"_mgui_get_native_widget() -> Any abstractmethod","text":"

Return the native backend widget instance.

This is generally the widget that has the layout.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_parent","title":"_mgui_get_parent() -> Widget abstractmethod","text":"

Return the parent widget of this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_root_native_widget","title":"_mgui_get_root_native_widget() -> Any abstractmethod","text":"

Return the root native backend widget.

In most cases, this is the same as _mgui_get_native_widget. However, in cases where the native widget is in a scroll layout, this might be different.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_tooltip","title":"_mgui_get_tooltip() -> str abstractmethod","text":"

Get the tooltip for this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_visible","title":"_mgui_get_visible() -> bool abstractmethod","text":"

Get widget visibility.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_width","title":"_mgui_get_width() -> int abstractmethod","text":"

Get the width of the widget.

The intention is to get the width of the widget after it is shown, for the purpose of unifying widget width in a layout. Backends may do what they need to accomplish this. For example, Qt can use sizeHint().width(), since width() may return something large if the widget has not yet been painted on screen.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_render","title":"_mgui_render() -> np.ndarray abstractmethod","text":"

Return an RGBA (MxNx4) numpy array bitmap of the rendered widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_enabled","title":"_mgui_set_enabled(enabled: bool) -> None abstractmethod","text":"

Set the enabled state of the widget to enabled.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_height","title":"_mgui_set_height(value: int) -> None abstractmethod","text":"

Set the height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_max_height","title":"_mgui_set_max_height(value: int) -> None abstractmethod","text":"

Set the maximum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_max_width","title":"_mgui_set_max_width(value: int) -> None abstractmethod","text":"

Set the maximum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_min_height","title":"_mgui_set_min_height(value: int) -> None abstractmethod","text":"

Set the minimum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_min_width","title":"_mgui_set_min_width(value: int) -> None abstractmethod","text":"

Set the minimum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_parent","title":"_mgui_set_parent(widget: Widget) -> None abstractmethod","text":"

Set the parent widget of this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_tooltip","title":"_mgui_set_tooltip(value: str | None) -> None abstractmethod","text":"

Set a tooltip for this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_visible","title":"_mgui_set_visible(value: bool) -> None abstractmethod","text":"

Set widget visibility.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_width","title":"_mgui_set_width(value: int) -> None abstractmethod","text":"

Set the width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol","title":"magicgui.widgets.protocols.ValueWidgetProtocol","text":"

Bases: WidgetProtocol, Protocol

Widget that has a current value, with getter/setter and on_change callback.

It is worth noting that the widget is the thing that has a value. Magicgui does not maintain & synchronize an independent model.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol._mgui_bind_change_callback","title":"_mgui_bind_change_callback(callback: Callable[[Any], Any]) -> None abstractmethod","text":"

Bind callback to value change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol._mgui_get_value","title":"_mgui_get_value() -> Any abstractmethod","text":"

Get current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol._mgui_set_value","title":"_mgui_set_value(value: Any) -> None abstractmethod","text":"

Set current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ButtonWidgetProtocol","title":"magicgui.widgets.protocols.ButtonWidgetProtocol","text":"

Bases: ValueWidgetProtocol, SupportsText, SupportsIcon, Protocol

The \"value\" in a ButtonWidget is the current (checked) state.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol","title":"magicgui.widgets.protocols.TableWidgetProtocol","text":"

Bases: ValueWidgetProtocol, SupportsReadOnly, Protocol

ValueWidget subclass intended for 2D tabular data, with row & column headers.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_bind_change_callback","title":"_mgui_bind_change_callback(callback: Callable[[Any], Any]) -> None abstractmethod","text":"

Bind callback to value change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_bind_column_headers_change_callback","title":"_mgui_bind_column_headers_change_callback(callback: Callable[[Any], None]) -> None abstractmethod","text":"

Bind callback to column headers change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_bind_row_headers_change_callback","title":"_mgui_bind_row_headers_change_callback(callback: Callable[[Any], None]) -> None abstractmethod","text":"

Bind callback to row headers change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_cell","title":"_mgui_get_cell(row: int, col: int) -> Any abstractmethod","text":"

Get current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_column_count","title":"_mgui_get_column_count() -> int abstractmethod","text":"

Get the number of columns in the table.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_column_headers","title":"_mgui_get_column_headers() -> tuple abstractmethod","text":"

Get current column headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_row_count","title":"_mgui_get_row_count() -> int abstractmethod","text":"

Get the number of rows in the table.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_row_headers","title":"_mgui_get_row_headers() -> tuple abstractmethod","text":"

Get current row headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_remove_column","title":"_mgui_remove_column(column: int) -> None abstractmethod","text":"

Remove column at index column.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_remove_row","title":"_mgui_remove_row(row: int) -> None abstractmethod","text":"

Remove row at index row.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_cell","title":"_mgui_set_cell(row: int, col: int, value: Any) -> None abstractmethod","text":"

Set current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_column_count","title":"_mgui_set_column_count(ncols: int) -> None abstractmethod","text":"

Set the number of columns in the table. (Create/delete as needed).

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_column_headers","title":"_mgui_set_column_headers(headers: Sequence) -> None abstractmethod","text":"

Set current column headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_row_count","title":"_mgui_set_row_count(nrows: int) -> None abstractmethod","text":"

Set the number of rows in the table. (Create/delete as needed).

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_row_headers","title":"_mgui_set_row_headers(headers: Sequence) -> None abstractmethod","text":"

Set current row headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol","title":"magicgui.widgets.protocols.RangedWidgetProtocol","text":"

Bases: ValueWidgetProtocol, Protocol

Value widget that supports numbers within a provided min/max range.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_adaptive_step","title":"_mgui_get_adaptive_step() -> bool abstractmethod","text":"

Get adaptive step status.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_max","title":"_mgui_get_max() -> float abstractmethod","text":"

Get the maximum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_min","title":"_mgui_get_min() -> float abstractmethod","text":"

Get the minimum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_step","title":"_mgui_get_step() -> float abstractmethod","text":"

Get the step size.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_adaptive_step","title":"_mgui_set_adaptive_step(value: bool) -> None abstractmethod","text":"

Set adaptive step status.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_max","title":"_mgui_set_max(value: float) -> None abstractmethod","text":"

Set the maximum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_min","title":"_mgui_set_min(value: float) -> None abstractmethod","text":"

Set the minimum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_step","title":"_mgui_set_step(value: float) -> None abstractmethod","text":"

Set the step size.

"},{"location":"api/protocols/#magicgui.widgets.protocols.CategoricalWidgetProtocol","title":"magicgui.widgets.protocols.CategoricalWidgetProtocol","text":"

Bases: ValueWidgetProtocol, SupportsChoices, Protocol

Categorical widget, that has a set of valid choices, and a current value.

It adds no additional methods.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol","title":"magicgui.widgets.protocols.SliderWidgetProtocol","text":"

Bases: RangedWidgetProtocol, SupportsOrientation, Protocol

Protocol for implementing a slider widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol._mgui_get_tracking","title":"_mgui_get_tracking() -> bool","text":"

If tracking is False, changed is only emitted when released.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol._mgui_set_readout_visibility","title":"_mgui_set_readout_visibility(visible: bool) -> None","text":"

Set visibility of readout widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol._mgui_set_tracking","title":"_mgui_set_tracking(tracking: bool) -> None","text":"

If tracking is False, changed is only emitted when released.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol","title":"magicgui.widgets.protocols.ContainerProtocol","text":"

Bases: WidgetProtocol, SupportsOrientation, Protocol

Widget that can contain other widgets.

This generally manages a backend Layout.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_get_margins","title":"_mgui_get_margins() -> tuple[int, int, int, int] abstractmethod","text":"

Get the margins of the container.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_insert_widget","title":"_mgui_insert_widget(position: int, widget: Widget) -> None abstractmethod","text":"

Insert widget at the given position in the layout.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_remove_widget","title":"_mgui_remove_widget(widget: Widget) -> None abstractmethod","text":"

Remove the specified widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_set_margins","title":"_mgui_set_margins(margins: tuple[int, int, int, int]) -> None abstractmethod","text":"

Set the margins of the container.

"},{"location":"api/protocols/#magicgui.widgets.protocols.DialogProtocol","title":"magicgui.widgets.protocols.DialogProtocol","text":"

Bases: ContainerProtocol, Protocol

Protocol for modal (blocking) containers.

"},{"location":"api/protocols/#magicgui.widgets.protocols.DialogProtocol._mgui_exec","title":"_mgui_exec() -> None abstractmethod","text":"

Show the dialog and block.

"},{"location":"api/protocols/#magicgui.widgets.protocols.MainWindowProtocol","title":"magicgui.widgets.protocols.MainWindowProtocol","text":"

Bases: ContainerProtocol, Protocol

Application main widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.MainWindowProtocol._mgui_create_menu_item","title":"_mgui_create_menu_item(menu_name: str, action_name: str, callback: Callable | None = None, shortcut: str | None = None) -> None abstractmethod","text":"

Create a new menu item.

Parameters:

  • menu_name (str) \u2013

    The name of the menu to add the item to.

  • action_name (str) \u2013

    The name of the action to add.

  • callback (Callable | None, default: None ) \u2013

    A callback to be called when the action is triggered, by default None.

  • shortcut (str | None, default: None ) \u2013

    A keyboard shortcut for the action, by default None.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices","title":"magicgui.widgets.protocols.SupportsChoices","text":"

Bases: Protocol

Widget that has a set of valid choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_del_choice","title":"_mgui_del_choice(choice_name: str) -> None abstractmethod","text":"

Delete the provided choice_name and associated data.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_choice","title":"_mgui_get_choice(choice_name: str) -> Any abstractmethod","text":"

Get data for a single choice.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_choices","title":"_mgui_get_choices() -> tuple[tuple[str, Any], ...] abstractmethod","text":"

Get available choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_count","title":"_mgui_get_count() -> int abstractmethod","text":"

Return number of choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_current_choice","title":"_mgui_get_current_choice() -> str abstractmethod","text":"

Return the text of the currently selected choice.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_set_choice","title":"_mgui_set_choice(choice_name: str, data: Any) -> None abstractmethod","text":"

Set data for choice_name, or add a new item if choice_name doesn't exist.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_set_choices","title":"_mgui_set_choices(choices: Iterable[tuple[str, Any]]) -> None abstractmethod","text":"

Set available choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsOrientation","title":"magicgui.widgets.protocols.SupportsOrientation","text":"

Bases: Protocol

Widget that can be reoriented.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsOrientation._mgui_get_orientation","title":"_mgui_get_orientation() -> str abstractmethod","text":"

Get orientation, return either 'horizontal' or 'vertical'.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsOrientation._mgui_set_orientation","title":"_mgui_set_orientation(value: str) -> None abstractmethod","text":"

Set orientation, value will be 'horizontal' or 'vertical'.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsText","title":"magicgui.widgets.protocols.SupportsText","text":"

Bases: Protocol

Widget that have text (in addition to value)... like buttons.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsText._mgui_get_text","title":"_mgui_get_text() -> str abstractmethod","text":"

Get text.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsText._mgui_set_text","title":"_mgui_set_text(value: str) -> None abstractmethod","text":"

Set text.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsReadOnly","title":"magicgui.widgets.protocols.SupportsReadOnly","text":"

Bases: Protocol

Widget that can be read_only.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsReadOnly._mgui_get_read_only","title":"_mgui_get_read_only() -> bool abstractmethod","text":"

Get read_only status.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsReadOnly._mgui_set_read_only","title":"_mgui_set_read_only(value: bool) -> None abstractmethod","text":"

Set read_only.

"},{"location":"api/protocols/#application-protocol","title":"Application Protocol","text":""},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend","title":"magicgui.widgets.protocols.BaseApplicationBackend","text":"

Bases: ABC

Backend Application object.

Abstract class that provides an interface between backends and Application. Each backend must implement a subclass of BaseApplicationBackend, and implement all of its _mgui_xxx methods.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_get_backend_name","title":"_mgui_get_backend_name() -> str abstractmethod","text":"

Return the name of the backend.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_get_native_app","title":"_mgui_get_native_app() -> Any abstractmethod","text":"

Return the native GUI application instance.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_process_events","title":"_mgui_process_events() -> None abstractmethod","text":"

Process all pending GUI events.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_quit","title":"_mgui_quit() -> None abstractmethod","text":"

Quit the native GUI event loop.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_run","title":"_mgui_run() -> None abstractmethod","text":"

Start the application.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_start_timer","title":"_mgui_start_timer(interval: int = 0, on_timeout: Callable[[], None] | None = None, single: bool = False) -> None abstractmethod","text":"

Create and start a timer.

Parameters:

  • interval (int, default: 0 ) \u2013

    Interval between timeouts, by default 0

  • on_timeout (Optional[Callable[[], None]], default: None ) \u2013

    Function to call when timer finishes, by default None

  • single (bool, default: False ) \u2013

    Whether the timer should only fire once, by default False

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_stop_timer","title":"_mgui_stop_timer() -> None abstractmethod","text":"

Stop timer. Should check for the existence of the timer.

"},{"location":"api/type_map/","title":"magicgui.type_map","text":"Widget Description get_widget_class Return a Widget subclass for the value/annotation. register_type Register a widget_type to be used for all parameters with type type_. type_registered Context manager that temporarily registers a widget type for a given type_. type2callback Return any callbacks that have been registered for type_."},{"location":"api/type_map/#magicgui.type_map.get_widget_class","title":"magicgui.type_map.get_widget_class(value: Any = Undefined, annotation: Any = Undefined, options: dict | None = None, is_result: bool = False, raise_on_unknown: bool = True) -> tuple[WidgetClass, dict]","text":"

Return a Widget subclass for the value/annotation.

Parameters:

  • value (Any, default: Undefined ) \u2013

    A python value. Will be used to determine the widget type if an annotation is not explicitly provided by default None

  • annotation (Optional[Type], default: Undefined ) \u2013

    A type annotation, by default None

  • options (dict, default: None ) \u2013

    Options to pass when constructing the widget, by default {}

  • is_result (bool, default: False ) \u2013

    Identifies whether the returned widget should be tailored to an input or to an output.

  • raise_on_unknown (bool, default: True ) \u2013

    Raise exception if no widget is found for the given type, by default True

Returns:

  • Tuple[WidgetClass, dict] \u2013

    The WidgetClass, and dict that can be used for params. dict may be different than the options passed in.

"},{"location":"api/type_map/#magicgui.type_map.register_type","title":"magicgui.type_map.register_type(type_: _T | None = None, *, widget_type: WidgetRef | None = None, return_callback: ReturnCallback | None = None, **options: Any) -> _T | Callable[[_T], _T]","text":"

Register a widget_type to be used for all parameters with type type_.

Note: registering a Union (or Optional) type effectively registers all types in the union with the arguments.

Parameters:

  • type_ (type, default: None ) \u2013

    The type for which a widget class or return callback will be provided.

  • widget_type (WidgetRef, default: None ) \u2013

    A widget class from the current backend that should be used whenever type_ is used as the type annotation for an argument in a decorated function, by default None

  • return_callback (ReturnCallback | None, default: None ) \u2013

    If provided, whenever type_ is declared as the return type of a decorated function, return_callback(widget, value, return_type) will be called whenever the decorated function is called... where widget is the Widget instance, and value is the return value of the decorated function.

  • options (Any, default: {} ) \u2013

    key value pairs where the keys are valid dict

Raises:

  • ValueError \u2013

    If none of widget_type, return_callback, bind or choices are provided.

"},{"location":"api/type_map/#magicgui.type_map.type_registered","title":"magicgui.type_map.type_registered(type_: _T, *, widget_type: WidgetRef | None = None, return_callback: ReturnCallback | None = None, **options: Any) -> Iterator[None]","text":"

Context manager that temporarily registers a widget type for a given type_.

When the context is exited, the previous widget type associations for type_ is restored.

Parameters:

  • type_ (_T) \u2013

    The type for which a widget class or return callback will be provided.

  • widget_type (Optional[WidgetRef], default: None ) \u2013

    A widget class from the current backend that should be used whenever type_ is used as the type annotation for an argument in a decorated function, by default None

  • return_callback (ReturnCallback | None, default: None ) \u2013

    If provided, whenever type_ is declared as the return type of a decorated function, return_callback(widget, value, return_type) will be called whenever the decorated function is called... where widget is the Widget instance, and value is the return value of the decorated function.

  • options (Any, default: {} ) \u2013

    key value pairs where the keys are valid dict

"},{"location":"api/type_map/#magicgui.type_map.type2callback","title":"magicgui.type_map.type2callback(type_: type) -> list[ReturnCallback]","text":"

Return any callbacks that have been registered for type_.

Parameters:

  • type_ (type) \u2013

    The type_ to look up.

Returns:

  • list of callable \u2013

    Where a return callback accepts two arguments (gui, value) and does something.

"},{"location":"api/widgets/","title":"Widget Index","text":"

Here you will find a list of all the widgets that are available in magicgui. Each widget has a link to its own documentation page, where you can find more information about the widget, including its parameters and events.

Widget Description CheckBox A checkbox with a text label. ComboBox A dropdown menu, allowing selection between multiple choices. Container A Widget to contain other widgets. DateEdit A widget for editing dates. DateTimeEdit A widget for editing dates and times. Dialog A modal container. EmptyWidget A base widget with no value. FileEdit A LineEdit widget with a button that opens a FileDialog. FloatRangeSlider A slider widget to adjust a range defined by two float values within a range. FloatSlider A slider widget to adjust an integer value within a range. FloatSpinBox A widget to edit a float with clickable up/down arrows. FunctionGui Wrapper for a container of widgets representing a callable object. Image A non-editable image display. Label A non-editable text display. LineEdit A one-line text editor. ListEdit A widget to represent a list of values. LiteralEvalLineEdit A one-line text editor that evaluates strings as python literals. LogSlider A slider widget to adjust a numerical value logarithmically within a range. MainFunctionGui Container of widgets as a Main Application Window. MainWindow A Widget to contain other widgets, includes a menu bar. Password A one-line text editor that obscures input. ProgressBar A progress bar widget. PushButton A clickable command button. QuantityEdit A combined LineEdit and ComboBox to edit a pint.Quantity. RadioButton A radio button with a text label. RadioButtons An exclusive group of radio buttons, providing a choice from multiple choices. RangeEdit A widget to represent a python range object, with start/stop/step. RangeSlider A slider widget to adjust a range between two integer values within a range. Select A list of options, allowing selection between multiple choices. SliceEdit A widget to represent slice objects, with start/stop/step. Slider A slider widget to adjust an integer value within a range. SpinBox A widget to edit an integer with clickable up/down arrows. Table A widget to represent columnar or 2D data with headers. TextEdit A widget to edit and display both plain and rich text. TimeEdit A widget for editing times. ToolBar Toolbar that contains a set of controls. TupleEdit A widget to represent a tuple of values."},{"location":"api/widgets/CheckBox/","title":"CheckBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/CheckBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the button is clicked (may also be connected at the alias clicked).
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/CheckBox/#magicgui.widgets.CheckBox","title":"CheckBox","text":"

Bases: ButtonWidget

A checkbox with a text label.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ComboBox/","title":"ComboBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/ComboBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ComboBox/#magicgui.widgets.ComboBox","title":"ComboBox","text":"

Bases: CategoricalWidget

A dropdown menu, allowing selection between multiple choices.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Container/","title":"Container","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Container/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Container/#magicgui.widgets.Container","title":"Container","text":"

Bases: ContainerWidget[WidgetVar]

A Widget to contain other widgets.

Note that `Container` implements the\n[`typing.MutableSequence`][typing.MutableSequence]\ninterface, so you can use it like a list to add and remove widgets.\n

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/DateEdit/","title":"DateEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/DateEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/DateEdit/#magicgui.widgets.DateEdit","title":"DateEdit","text":"

Bases: ValueWidget[date]

A widget for editing dates.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/DateTimeEdit/","title":"DateTimeEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/DateTimeEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/DateTimeEdit/#magicgui.widgets.DateTimeEdit","title":"DateTimeEdit","text":"

Bases: ValueWidget[datetime]

A widget for editing dates and times.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Dialog/","title":"Dialog","text":"

Available in backends: qt

"},{"location":"api/widgets/Dialog/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Dialog/#magicgui.widgets.Dialog","title":"Dialog","text":"

Bases: DialogWidget

A modal container.

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/EmptyWidget/","title":"EmptyWidget","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/EmptyWidget/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget","title":"EmptyWidget","text":"

Bases: ValueWidget

A base widget with no value.

This widget is primarily here to serve as a \"hidden widget\" to which a value or\ncallback can be bound.\n

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget.value","title":"value: Any property writable","text":"

Look for a bound value, otherwise fallback to get_value.

"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget.__repr__","title":"__repr__() -> str","text":"

Return string repr (avoid looking for value).

"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget.get_value","title":"get_value() -> Any","text":"

Return value if one has been manually set... otherwise return Param.empty.

"},{"location":"api/widgets/FileEdit/","title":"FileEdit","text":"

Available in backends:

"},{"location":"api/widgets/FileEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit","title":"FileEdit","text":"

Bases: Container

A LineEdit widget with a button that opens a FileDialog.

Parameters:

  • mode (FileDialogMode or str, default: EXISTING_FILE ) \u2013
    • 'r' returns one existing file.
    • 'rm' return one or more existing files.
    • 'w' return one file name that does not have to exist.
    • 'd' returns one existing directory.
  • filter (str, default: None ) \u2013

    The filter is used to specify the kind of files that should be shown. It should be a glob-style string, like '*.png' (this may be backend-specific)

"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit.mode","title":"mode: FileDialogMode property writable","text":"

Mode for the FileDialog.

"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit.value","title":"value: tuple[Path, ...] | Path | None property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit.__repr__","title":"__repr__() -> str","text":"

Return string representation.

"},{"location":"api/widgets/FloatRangeSlider/","title":"FloatRangeSlider","text":"

Available in backends: qt

"},{"location":"api/widgets/FloatRangeSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FloatRangeSlider/#magicgui.widgets.FloatRangeSlider","title":"FloatRangeSlider","text":"

Bases: MultiValuedSliderWidget

A slider widget to adjust a range defined by two float values within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/FloatSlider/","title":"FloatSlider","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/FloatSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FloatSlider/#magicgui.widgets.FloatSlider","title":"FloatSlider","text":"

Bases: SliderWidget[float]

A slider widget to adjust an integer value within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/FloatSpinBox/","title":"FloatSpinBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/FloatSpinBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FloatSpinBox/#magicgui.widgets.FloatSpinBox","title":"FloatSpinBox","text":"

Bases: RangedWidget[float]

A widget to edit a float with clickable up/down arrows.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/FunctionGui/","title":"FunctionGui","text":"

Available in backends:

"},{"location":"api/widgets/FunctionGui/#signals","title":"Signals","text":"
  • called(object) - Emitted with the result after the function is called.
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui","title":"FunctionGui","text":"

Bases: Container, Generic[_P, _R]

Wrapper for a container of widgets representing a callable object.

Parameters:

  • function (Callable) \u2013

    A callable to turn into a GUI

  • call_button (bool | str | None, default: None ) \u2013

    If True, create an additional button that calls the original function when clicked. If a str, set the button text. by default False when auto_call is True, and True otherwise. The button can be accessed from the .call_button property.

  • layout (str, default: 'vertical' ) \u2013

    The type of layout to use. Must be horizontal or vertical by default \"horizontal\".

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether labels are shown in the widget. by default True

  • tooltips (bool, default: True ) \u2013

    Whether tooltips are shown when hovering over widgets. by default True

  • app (Application | str | None, default: None ) \u2013

    A backend to use, by default None (use the default backend.)

  • visible (bool, default: None ) \u2013

    Whether to immediately show the widget. If False, widget is explicitly hidden. If None, widget is not shown, but will be shown if a parent container is shown, by default None.

  • auto_call (bool, default: False ) \u2013

    If True, changing any parameter in either the GUI or the widget attributes will call the original function with the current settings. by default False

  • result_widget (bool, default: False ) \u2013

    Whether to display a LineEdit widget the output of the function when called, by default False

  • param_options (dict, default: None ) \u2013

    A dict of name: widget_options dict for each parameter in the function. Will be passed to magic_signature by default None

  • name (str, default: None ) \u2013

    A name to assign to the Container widget, by default function.__name__

  • persist (bool, default: False ) \u2013

    If True, when parameter values change in the widget, they will be stored to disk (in ~/.config/magicgui/cache) and restored when the widget is loaded again with persist = True. By default, False.

  • raise_on_unknown (bool, default: False ) \u2013

    If True, raise an error if a parameter annotation is not recognized.

Raises:

  • TypeError \u2013

    If unexpected keyword arguments are provided

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__signature__","title":"__signature__: MagicSignature property","text":"

Return a MagicSignature object representing the current state of the gui.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.call_button","title":"call_button: PushButton | None property","text":"

Return the call button.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.call_count","title":"call_count: int property","text":"

Return the number of times the function has been called.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.result_name","title":"result_name: str property writable","text":"

Return a name that can be used for the result of this magicfunction.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.return_annotation","title":"return_annotation: Any property","text":"

Return annotation for inspect.Signature conversion.

ForwardRefs will be resolve when setting the annotation.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__call__","title":"__call__(*args: _P.args, **kwargs: _P.kwargs) -> _R","text":"

Call the original function with the current parameter values from the Gui.

You may pass a update_widget=True keyword argument to update the widget values to match the current parameter values before calling the function.

It is also possible to override the current parameter values from the GUI by providing args/kwargs to the function call. Only those provided will override the ones from the gui. A called signal will also be emitted with the results.

Returns:

  • result ( Any ) \u2013

    whatever the return value of the original function would have been.

Examples:

gui = FunctionGui(func, show=True)\n\n# then change parameters in the gui, or by setting:  gui.param.value = something\n\ngui()  # calls the original function with the current parameters\n
"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__get__","title":"__get__(obj: object, objtype: type | None = None) -> FunctionGui","text":"

Provide descriptor protocol.

This allows the @magicgui decorator to work on a function as well as a method. If a method on a class is decorated with @magicgui, then accessing the attribute on an instance of that class will return a version of the FunctionGui in which the first argument of the function is bound to the instance. (Just like what you'd expect with the @property decorator.)

Returns:

  • bound ( FunctionGui ) \u2013

    A new FunctionGui instance.

Examples:

>>> class MyClass:\n...     @magicgui\n...     def my_method(self, x=1):\n...         print(locals())\n...\n>>> c = MyClass()\n>>> c.my_method  # the FunctionGui that can be used as a widget\n\n# calling it works as usual, with `c` provided as `self`\n>>> c.my_method(x=34)\n{'self': <__main__.MyClass object at 0x7fb610e455e0>, 'x': 34}\n
"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__init__","title":"__init__(function: Callable[_P, _R], call_button: bool | str | None = None, layout: str = 'vertical', scrollable: bool = False, labels: bool = True, tooltips: bool = True, app: AppRef | None = None, visible: bool | None = None, auto_call: bool = False, result_widget: bool = False, param_options: dict[str, dict] | None = None, name: str | None = None, persist: bool = False, raise_on_unknown: bool = False, **kwargs: Any)","text":""},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__repr__","title":"__repr__() -> str","text":"

Return string representation of instance.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__set__","title":"__set__(obj: Any, value: Any) -> NoReturn","text":"

Prevent setting a magicgui attribute.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.copy","title":"copy() -> FunctionGui","text":"

Return a copy of this FunctionGui.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.reset_call_count","title":"reset_call_count() -> None","text":"

Reset the call count to 0.

"},{"location":"api/widgets/Image/","title":"Image","text":"

Available in backends: qt

"},{"location":"api/widgets/Image/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Image/#magicgui.widgets.Image","title":"Image","text":"

Bases: ValueWidget

A non-editable image display.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.image_data","title":"image_data: np.ndarray | None property","text":"

Return image data.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.image_rgba","title":"image_rgba: np.ndarray | None property","text":"

Return rendered numpy array.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.value","title":"value property writable","text":"

Return current image array.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.__repr__","title":"__repr__() -> str","text":"

Return representation of widget of instance.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.get_clim","title":"get_clim() -> tuple[float | None, float | None]","text":"

Get contrast limits (for monochromatic images).

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.scale_widget_to_image_size","title":"scale_widget_to_image_size()","text":"

Set the size of the widget to the size of the image.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_clim","title":"set_clim(vmin: float | None = None, vmax: float | None = None)","text":"

Set contrast limits (for monochromatic images).

Parameters:

  • vmin (float, default: None ) \u2013

    The min contrast limit to use when scaling monochromatic images

  • vmax (float, default: None ) \u2013

    The max contrast limit to use when scaling monochromatic images

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_cmap","title":"set_cmap(cmap: str | Colormap | matplotlib.colors.Colormap)","text":"

Set colormap (for monochromatic images).

Parameters:

  • cmap (str, magicgui.types.Colormap, or matplotlib.colors.Colormap) \u2013

    A colormap to use for monochromatic images. If a string, matplotlib must be installed and the colormap will be selected with cm.get_cmap(cmap).

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_data","title":"set_data(val: str | Path | np.ndarray | PIL.Image.Image, cmap: str | Colormap | matplotlib.colors.Colormap | None = None, norm: _mpl_image.Normalize | matplotlib.colors.Normalize | None = None, vmin: float | None = None, vmax: float | None = None, width: int | Literal['auto'] | None = None, height: int | Literal['auto'] | None = None, format: str | None = None)","text":"

Set image data with various optional display parameters.

Parameters:

  • val ((str, Path, ndarray or Image)) \u2013

    The image data or file to load. Data must be 2D (monochromatic), or 3D: MxNx3 (RGB) or MxNx4 (RGBA).

  • cmap (str, magicgui.types.Colormap, or matplotlib.colors.Colormap, default: None ) \u2013

    A colormap to use for monochromatic images. If a string, matplotlib must be installed and the colormap will be selected with cm.get_cmap(cmap).

  • norm (magicgui.types.Normalize, or matplotlib.colors.Normalize, default: None ) \u2013

    A normalization object to use for rendering images. Accepts matplotlib Normalize objects.

  • vmin (float, default: None ) \u2013

    The min contrast limit to use when scaling monochromatic images

  • vmax (float, default: None ) \u2013

    The max contrast limit to use when scaling monochromatic images

  • width (int or 'auto', default: None ) \u2013

    Set the width of the widget. If \"auto\", sets the widget size to the image size (1:1). If width is provided, height is auto-set based on aspect ratio.

  • height (int or 'auto', default: None ) \u2013

    Set the height of the widget. If \"auto\", sets the widget size to the image size (1:1). If width is provided, height is auto-set based on aspect ratio.

  • format (str, default: None ) \u2013

    Force image format type for imread when val is provided as a string, by default None

Raises:

  • TypeError \u2013

    If the provided data shape or type is invalid.

  • ImportError \u2013

    If a string is provided for val and PIL is not installed.

  • RuntimeError \u2013

    If a PIL.Image.Image instance is provided as data, with an unrecognized image mode.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_norm","title":"set_norm(norm: Normalize | matplotlib.colors.Normalize)","text":"

Set normalization method.

Parameters:

  • norm (magicgui.types.Normalize, or matplotlib.colors.Normalize) \u2013

    A normalization object to use for rendering images. Accepts matplotlib Normalize objects.

"},{"location":"api/widgets/Label/","title":"Label","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Label/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Label/#magicgui.widgets.Label","title":"Label","text":"

Bases: ValueWidget[str]

A non-editable text display.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/LineEdit/","title":"LineEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/LineEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/LineEdit/#magicgui.widgets.LineEdit","title":"LineEdit","text":"

Bases: ValueWidget[str]

A one-line text editor.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ListEdit/","title":"ListEdit","text":"

Available in backends:

"},{"location":"api/widgets/ListEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit","title":"ListEdit","text":"

Bases: Container[ValueWidget[_V]]

A widget to represent a list of values.

A ListEdit container can create a list with multiple objects of same type. It\nwill contain many child widgets and their value is represented as a Python list\nobject. If a list is given as the initial value, types of child widgets are\ndetermined from the contents. Number of contents can be adjusted with +/-\nbuttons.\n

Parameters:

  • value (Iterable, default: Undefined ) \u2013

    The starting value for the widget.

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • options (dict, default: None ) \u2013

    Widget options of child widgets.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation. For ListEdit, annotation will be like 'list[str]'.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.data","title":"data: ListDataView[_V] property writable","text":"

Return a data view of current value.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.value","title":"value: list[_V] property writable","text":"

Return current value as a list object.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.__delitem__","title":"__delitem__(key: int | slice) -> None","text":"

Delete child widget(s).

"},{"location":"api/widgets/LiteralEvalLineEdit/","title":"LiteralEvalLineEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/LiteralEvalLineEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/LiteralEvalLineEdit/#magicgui.widgets.LiteralEvalLineEdit","title":"LiteralEvalLineEdit","text":"

Bases: ValueWidget[str]

A one-line text editor that evaluates strings as python literals.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/LogSlider/","title":"LogSlider","text":"

Available in backends:

"},{"location":"api/widgets/LogSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/LogSlider/#magicgui.widgets.LogSlider","title":"LogSlider","text":"

Bases: TransformedRangedWidget

A slider widget to adjust a numerical value logarithmically within a range.

Parameters:

  • base (Enum, Iterable, or Callable, default: e ) \u2013

    The base to use for the log, by default math.e.

"},{"location":"api/widgets/LogSlider/#magicgui.widgets.LogSlider.base","title":"base: float property writable","text":"

Return base used for the log.

"},{"location":"api/widgets/LogSlider/#magicgui.widgets.LogSlider.tracking","title":"tracking: bool property writable","text":"

Return whether slider tracking is enabled.

If tracking is enabled (the default), the slider emits the changed() signal while the slider is being dragged. If tracking is disabled, the slider emits the changed() signal only when the user releases the slider.

"},{"location":"api/widgets/MainFunctionGui/","title":"MainFunctionGui","text":"

Available in backends:

"},{"location":"api/widgets/MainFunctionGui/#signals","title":"Signals","text":"
  • called(object) - Emitted with the result after the function is called.
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/MainFunctionGui/#magicgui.widgets.MainFunctionGui","title":"MainFunctionGui","text":"

Bases: FunctionGui[_P, _R], MainWindow

Container of widgets as a Main Application Window.

"},{"location":"api/widgets/MainWindow/","title":"MainWindow","text":"

Available in backends: qt

"},{"location":"api/widgets/MainWindow/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/MainWindow/#magicgui.widgets.MainWindow","title":"MainWindow","text":"

Bases: MainWindowWidget

A Widget to contain other widgets, includes a menu bar.

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Password/","title":"Password","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Password/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Password/#magicgui.widgets.Password","title":"Password","text":"

Bases: ValueWidget[str]

A one-line text editor that obscures input.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ProgressBar/","title":"ProgressBar","text":"

Available in backends: qt

"},{"location":"api/widgets/ProgressBar/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar","title":"ProgressBar","text":"

Bases: SliderWidget[float]

A progress bar widget.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar.step","title":"step: float property writable","text":"

Step size for widget values.

"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar.decrement","title":"decrement(val: float | None = None) -> None","text":"

Decrease current value by step size, or provided value.

"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar.increment","title":"increment(val: float | None = None) -> None","text":"

Increase current value by step size, or provided value.

"},{"location":"api/widgets/PushButton/","title":"PushButton","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/PushButton/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the button is clicked (may also be connected at the alias clicked).
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/PushButton/#magicgui.widgets.PushButton","title":"PushButton","text":"

Bases: ButtonWidget

A clickable command button.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/QuantityEdit/","title":"QuantityEdit","text":"

Available in backends: qt

"},{"location":"api/widgets/QuantityEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/QuantityEdit/#magicgui.widgets.QuantityEdit","title":"QuantityEdit","text":"

Bases: ValueWidget

A combined LineEdit and ComboBox to edit a pint.Quantity.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/RadioButton/","title":"RadioButton","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/RadioButton/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the button is clicked (may also be connected at the alias clicked).
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RadioButton/#magicgui.widgets.RadioButton","title":"RadioButton","text":"

Bases: ButtonWidget

A radio button with a text label.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/RadioButtons/","title":"RadioButtons","text":"

Available in backends: qt

"},{"location":"api/widgets/RadioButtons/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RadioButtons/#magicgui.widgets.RadioButtons","title":"RadioButtons","text":"

Bases: CategoricalWidget, _OrientationMixin

An exclusive group of radio buttons, providing a choice from multiple choices.

Parameters:

  • value (Any) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/RangeEdit/","title":"RangeEdit","text":"

Available in backends:

"},{"location":"api/widgets/RangeEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RangeEdit/#magicgui.widgets.RangeEdit","title":"RangeEdit","text":"

Bases: Container[SpinBox]

A widget to represent a python range object, with start/stop/step.

A range object produces a sequence of integers from start (inclusive)\nto stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.\nstart defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.\nThese are exactly the valid indices for a list of 4 elements.\nWhen step is given, it specifies the increment (or decrement).\n

Parameters:

  • start (int, default: 0 ) \u2013

    The range start value, by default 0

  • stop (int, default: 10 ) \u2013

    The range stop value, by default 10

  • step (int, default: 1 ) \u2013

    The range step value, by default 1

"},{"location":"api/widgets/RangeEdit/#magicgui.widgets.RangeEdit.value","title":"value: range property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/RangeEdit/#magicgui.widgets.RangeEdit.__repr__","title":"__repr__() -> str","text":"

Return string representation.

"},{"location":"api/widgets/RangeSlider/","title":"RangeSlider","text":"

Available in backends: qt

"},{"location":"api/widgets/RangeSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RangeSlider/#magicgui.widgets.RangeSlider","title":"RangeSlider","text":"

Bases: MultiValuedSliderWidget

A slider widget to adjust a range between two integer values within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Select/","title":"Select","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Select/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Select/#magicgui.widgets.Select","title":"Select","text":"

Bases: CategoricalWidget

A list of options, allowing selection between multiple choices.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/SliceEdit/","title":"SliceEdit","text":"

Available in backends:

"},{"location":"api/widgets/SliceEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/SliceEdit/#magicgui.widgets.SliceEdit","title":"SliceEdit","text":"

Bases: RangeEdit

A widget to represent slice objects, with start/stop/step.

slice(stop) slice(start, stop[, step])

Slice objects may be used for extended slicing (e.g. a[0:10:2])

"},{"location":"api/widgets/SliceEdit/#magicgui.widgets.SliceEdit.value","title":"value: slice property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/Slider/","title":"Slider","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Slider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Slider/#magicgui.widgets.Slider","title":"Slider","text":"

Bases: SliderWidget[int]

A slider widget to adjust an integer value within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/SpinBox/","title":"SpinBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/SpinBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/SpinBox/#magicgui.widgets.SpinBox","title":"SpinBox","text":"

Bases: RangedWidget[int]

A widget to edit an integer with clickable up/down arrows.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Table/","title":"Table","text":"

Available in backends: qt

"},{"location":"api/widgets/Table/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Table/#magicgui.widgets.Table","title":"Table","text":"

Bases: ValueWidget, _ReadOnlyMixin, MutableMapping[TblKey, list]

A widget to represent columnar or 2D data with headers.

Tables behave like plain dicts, where the keys are column headers and the (list-like) values are column data.

Parameters:

  • value ((dict, dataframe, list, array, tuple), default: None ) \u2013

    Table data (and/or header data), in one of the accepted formats:

    • list or list-of-lists : [column_values] or [[row_vals], ..., [row_vals]]
    • dict-of-dicts : {column_header -> {row_header -> value}}
    • dict-of-lists : {column_header -> [column_values]}
    • list-of-row-records : [{column_headers -> value}, ... , {column_headers -> value}]
    • split-dict-of-lists :
    • tuple-of-values : ([values], [row_headers], [column_headers])
    • dict-of-pandas-series : {column_header -> Series(values)}

index : Collection, optional A sized iterable container of row headers. By default, row headers will be tuple(range(len(data))). Values provided here override any implied in value. columns : Collection, optional A sized iterable container of column headers. By default, column headers will be tuple(range(len(data[0]))). Values provided here override any implied in value. **kwargs Additional kwargs will be passed to the magicgui.widgets.Widget constructor.

Attributes:

  • value (dict) \u2013

    Returns a dict with the keys data, index, and columns ... representing the 2D (list of lists) tabular data, row headers, and column headers, respectively. If set, will clear and update the table using the new data.

  • data (DataView) \u2013

    A DataView instance that provides numpy-like indexing (with get/set/delete) onto the 2D data array, For example table.data[0,2] gets the data in the cell of the first row, 3rd column. Works with numpy slice syntax.

  • column_headers (tuple) \u2013

    The current column headers. Can be set with a new sequence to change

  • row_headers (tuple) \u2013

    The current row headers. Can be set with a new sequence to change

  • shape (tuple of int) \u2013

    The shape of the table in (rows, columns).

  • size (int) \u2013

    The number of cells in the table.

Methods:

  • keys \u2013

    Return a TableHeadersView, providing a view on this table's headers. Use axis='row' for row headers.

  • items \u2013

    Return a TableItemsView, providing a view on this table's items, as 2-tuples of (header, data). Use axis='row' for (row_header, row_data)

  • clear \u2013

    Clear all table data and headers.

  • to_dataframe \u2013

    Returns a pandas dataframe representation of this table. (requires pandas)

  • to_dict \u2013

    Return one of many different dict-like representations of table and header data. See docstring of :meth:to_dict for details.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table--events","title":"Events","text":"

changed Emitted whenever a cell in the table changes. The value will have a dict of information regarding the cell that changed: {'data': x, 'row': int, 'column': int, 'column_header': str, 'row_header': str} CURRENTLY: only emitted on changes in the GUI. not programmatic changes.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.column_headers","title":"column_headers: tuple property writable","text":"

Return column headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.data","title":"data: DataView property writable","text":"

Return DataView object for this table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.row_headers","title":"row_headers: tuple property writable","text":"

Return row headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.shape","title":"shape: tuple[int, int] property","text":"

Return shape of table widget (rows, cols).

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.size","title":"size: int property","text":"

Return shape of table widget (rows, cols).

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.value","title":"value: dict[TblKey, Collection] property writable","text":"

Return dict with current data, index, and columns of the widget.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__delitem__","title":"__delitem__(key: TblKey) -> None","text":"

Delete a column from the table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__getitem__","title":"__getitem__(key: TblKey) -> list","text":"

Get a column from the table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__hash__","title":"__hash__() -> int","text":"

Make table hashable.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__iter__","title":"__iter__() -> Iterator","text":"

Yield column headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__len__","title":"__len__() -> int","text":"

Return number of columns.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__new__","title":"__new__(value: TableData | None = None, *, index: Collection | None = None, columns: Collection | None = None, **kwargs: Any) -> Table","text":"

Just for the signature.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__repr__","title":"__repr__() -> str","text":"

Return string repr.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__setitem__","title":"__setitem__(key: TblKey, v: Collection) -> None","text":"

Set a column in the table. If k doesn't exist, make a new column.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.clear","title":"clear() -> None","text":"

Clear the table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.delete_row","title":"delete_row(*, index: int | Sequence[int] | None = None, header: Any | Sequence[Any] | None = None) -> None","text":"

Delete row(s) by index or header.

Parameters:

  • index (int or Sequence[int], default: None ) \u2013

    Index or indices of row(s) to delete.

  • header (Any or Sequence[Any], default: None ) \u2013

    Header or headers of row(s) to delete.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.items","title":"items(axis: str = 'column') -> TableItemsView[TblKey, list]","text":"

Return a set-like object providing a view on this table's items.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.keys","title":"keys(axis: str = 'column') -> HeadersView[TblKey]","text":"

Return a set-like object providing a view on this table's headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.to_dataframe","title":"to_dataframe() -> pandas.DataFrame","text":"

Convert TableData to dataframe.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.to_dict","title":"to_dict(orient: str = 'dict') -> list | dict","text":"

Convert the Table to a dictionary.

The type of the key-value pairs can be customized with the parameters (see below).

Parameters:

  • orient (str {'dict', 'list', 'series', 'split', 'records', 'index'}, default: 'dict' ) \u2013

    Determines the type of the values of the dictionary.

    • 'dict' (default) : dict like {column -> {index -> value}}
    • 'list' : dict like {column -> [values]}
    • 'split' : dict like
    • 'records' : list like [{column -> value}, ... , {column -> value}]
    • 'index' : dict like {index -> {column -> value}}
    • 'series' : dict like {column -> Series(values)}
"},{"location":"api/widgets/TextEdit/","title":"TextEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/TextEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/TextEdit/#magicgui.widgets.TextEdit","title":"TextEdit","text":"

Bases: ValueWidget[str], _ReadOnlyMixin

A widget to edit and display both plain and rich text.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/TimeEdit/","title":"TimeEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/TimeEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/TimeEdit/#magicgui.widgets.TimeEdit","title":"TimeEdit","text":"

Bases: ValueWidget[TV]

A widget for editing times.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ToolBar/","title":"ToolBar","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/ToolBar/#signals","title":"Signals","text":"
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ToolBar/#magicgui.widgets.ToolBar","title":"ToolBar","text":"

Bases: ToolBarWidget

Toolbar that contains a set of controls.

Parameters:

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/TupleEdit/","title":"TupleEdit","text":"

Available in backends:

"},{"location":"api/widgets/TupleEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/TupleEdit/#magicgui.widgets.TupleEdit","title":"TupleEdit","text":"

Bases: Container[ValueWidget]

A widget to represent a tuple of values.

A TupleEdit container has several child widgets of different type. Their value is\nrepresented as a Python tuple object. If a tuple is given as the initial value,\ntypes of child widgets are determined one by one. Unlike ListEdit, number of\ncontents is not editable.\n

Parameters:

  • value (Iterable, default: Undefined ) \u2013

    The starting value for the widget.

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • options (dict, default: None ) \u2013

    Widget options of child widgets.

"},{"location":"api/widgets/TupleEdit/#magicgui.widgets.TupleEdit.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation. For TupleEdit, annotation will be like 'tuple[str, int]'.

"},{"location":"api/widgets/TupleEdit/#magicgui.widgets.TupleEdit.value","title":"value: tuple property writable","text":"

Return current value as a tuple.

"},{"location":"api/widgets/bases/","title":"magicgui.widgets.bases","text":"

The magicgui.widgets.bases module contains the base classes for all widgets.

While most users will never instantiate these classes directly, the methods and properties of these classes are inherited by all widgets, and define the common API for all widgets. Therefore, it is worth being aware of the type of widget you are working with.

"},{"location":"api/widgets/bases/#summary","title":"Summary","text":"Widget Description Widget Basic Widget, wrapping a class that implements WidgetProtocol. ButtonWidget Widget with a value, Wraps a widget implementing the ButtonWidgetProtocol. CategoricalWidget Widget with a value and choices. Wraps CategoricalWidgetProtocol. ContainerWidget Widget that can contain other widgets. DialogWidget Modal Container. MainWindowWidget Top level Application widget that can contain other widgets. RangedWidget Widget with a constrained value. Wraps RangedWidgetProtocol. SliderWidget Widget with a constrained value and orientation. Wraps SliderWidgetProtocol. ValueWidget Widget with a value, Wraps ValueWidgetProtocol."},{"location":"api/widgets/bases/#class-hierarchy","title":"Class Hierarchy","text":"

In visual form, the widget class hierarchy looks like this:

classDiagram\n    Widget <|-- ValueWidget\n    Widget <|-- ContainerWidget\n    BackendWidget ..|> WidgetProtocol : implements a\n    ValueWidget <|-- RangedWidget\n    ValueWidget <|-- ButtonWidget\n    ValueWidget <|-- CategoricalWidget\n    RangedWidget <|-- SliderWidget\n    Widget --* WidgetProtocol : controls a\n    <<Interface>> WidgetProtocol\n    class WidgetProtocol {\n        _mgui_get_X()\n        _mgui_set_X()\n    }\n    class Widget{\n        name: str\n        annotation: Any\n        label: str\n        tooltip: str\n        visible: bool\n        enabled: bool\n        native: Any\n        height: int\n        width: int\n        hide()\n        show()\n        close()\n        render()\n    }\n    class ValueWidget{\n        value: Any\n        changed: SignalInstance\n        bind(value, call) Any\n        unbind()\n    }\n    class RangedWidget{\n        value: float | tuple\n        min: float\n        max: float\n        step: float\n        adaptive_step: bool\n        range: tuple[float, float]\n    }\n    class SliderWidget{\n        orientation: str\n    }\n    class ButtonWidget{\n        value: bool\n        clicked: SignalInstance\n        text: str\n    }\n    class CategoricalWidget{\n        choices: List[Any]\n    }\n    class ContainerWidget{\n        widgets: List[Widget]\n        labels: bool\n        layout: str\n        margins: tuple[int, int, int, int]\n        reset_choices()\n        asdict() Dict[str, Any]\n        update(mapping)\n    }\n\n    click Widget href \"#magicgui.widgets.bases.Widget\"\n    click ValueWidget href \"#magicgui.widgets.bases.ValueWidget\"\n    click RangedWidget href \"#magicgui.widgets.bases.RangedWidget\"\n    click SliderWidget href \"#magicgui.widgets.bases.SliderWidget\"\n    click ButtonWidget href \"#magicgui.widgets.bases.ButtonWidget\"\n    click CategoricalWidget href \"#magicgui.widgets.bases.CategoricalWidget\"\n    click ContainerWidget href \"#magicgui.widgets.bases.ContainerWidget\"\n
"},{"location":"api/widgets/bases/#base-widget-classes","title":"Base Widget Classes","text":""},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget","title":"magicgui.widgets.bases.Widget","text":"

Basic Widget, wrapping a class that implements WidgetProtocol.

Parameters:

  • widget_type (type[WidgetProtocol]) \u2013

    A class implementing a widget protocol. Will be instantiated during init.

  • name (str, default: '' ) \u2013

    The name of the parameter represented by this widget. by default \"\"

  • annotation (Any, default: None ) \u2013

    The type annotation for the parameter represented by the widget, by default None

  • label (str, default: None ) \u2013

    A string to use for an associated Label widget (if this widget is being shown in a Container widget, and labels are on). By default, name will be used. Note: name refers the name of the parameter, as might be used in a signature, whereas label is just the label for that widget in the GUI.

  • tooltip (str, default: None ) \u2013

    A tooltip to display when hovering over the widget.

  • visible (bool, default: None ) \u2013

    Whether the widget is visible, by default True.

  • enabled (bool, default: True ) \u2013

    Whether the widget is enabled, by default True.

  • gui_only (bool, default: False ) \u2013

    If True, widget is excluded from any function signature representation. by default False. (This will likely be deprecated.)

  • parent (Any, default: None ) \u2013

    Optional parent widget of this widget. CAREFUL: if a parent is set, and subsequently deleted, this widget will likely be deleted as well (depending on the backend), and will no longer be usable.

  • backend_kwargs (dict, default: None ) \u2013

    keyword argument to pass to the backend widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.enabled","title":"enabled: bool property writable","text":"

Whether widget is enabled (editable).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.height","title":"height: int property writable","text":"

Return the current height of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.label","title":"label: str property writable","text":"

Return a label to use for this widget when present in Containers.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.max_height","title":"max_height: int property writable","text":"

Get the maximum height of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.max_width","title":"max_width: int property writable","text":"

Get the maximum width of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.min_height","title":"min_height: int property writable","text":"

Get the minimum height of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.min_width","title":"min_width: int property writable","text":"

Get the minimum width of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.native","title":"native: Any property","text":"

Return native backend widget.

Note this is the widget that contains the layout, and not any parent widgets of this (e.g. a parent widget that is used to enable scroll bars)

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.param_kind","title":"param_kind: inspect._ParameterKind property writable","text":"

Return :attr:inspect.Parameter.kind represented by this widget.

Used in building signatures from multiple widgets, by default :attr:~inspect.Parameter.POSITIONAL_OR_KEYWORD

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.parent","title":"parent: Widget property writable","text":"

Return the parent widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.root_native_widget","title":"root_native_widget: Any property","text":"

Return the root native backend widget.

This can be different from the .native widget if the layout is a child of some other widget, e.g. a widget used to enable scroll bars.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.tooltip","title":"tooltip: str | None property writable","text":"

Get the tooltip for this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.visible","title":"visible: bool property writable","text":"

Return whether widget is visible.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.widget_type","title":"widget_type: str property","text":"

Return type of widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.width","title":"width: int property writable","text":"

Return the current width of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.__repr__","title":"__repr__() -> str","text":"

Return representation of widget of instance.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.close","title":"close() -> None","text":"

Close widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.hide","title":"hide() -> None","text":"

Hide widget.

alias for widget.visible = False

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.render","title":"render() -> np.ndarray","text":"

Return an RGBA (MxNx4) numpy array bitmap of the rendered widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.show","title":"show(run: bool = False) -> Widget","text":"

Show widget.

alias for widget.visible = True

Parameters:

  • run (bool, default: False ) \u2013

    Whether to start the application event loop, by default False

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.shown","title":"shown() -> Iterator[Application]","text":"

Context manager to show the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget","title":"magicgui.widgets.bases.ButtonWidget","text":"

Bases: ValueWidget[bool]

Widget with a value, Wraps a widget implementing the ButtonWidgetProtocol.

see ButtonWidgetProtocol.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget.clicked","title":"clicked: SignalInstance property","text":"

Alias for changed event.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget.text","title":"text: str property writable","text":"

Text of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget","title":"magicgui.widgets.bases.CategoricalWidget","text":"

Bases: ValueWidget[T]

Widget with a value and choices. Wraps CategoricalWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.choices","title":"choices: tuple[T | None, ...] property writable","text":"

Available value choices for this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.current_choice","title":"current_choice: str property","text":"

Return the text of the currently selected choice.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.value","title":"value: T property writable","text":"

Return current value of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.__len__","title":"__len__() -> int","text":"

Return the number of choices.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.del_choice","title":"del_choice(choice_name: str) -> None","text":"

Delete the provided choice_name and associated data.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.get_choice","title":"get_choice(choice_name: str) -> T","text":"

Get data for the provided choice_name.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.reset_choices","title":"reset_choices(*_: Any) -> None","text":"

Reset choices to the default state.

If self._default_choices is a callable, this may NOT be the exact same set of choices as when the widget was instantiated, if the callable relies on external state.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.set_choice","title":"set_choice(choice_name: str, data: Any | None = None) -> None","text":"

Set data for the provided choice_name.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget","title":"magicgui.widgets.bases.ContainerWidget","text":"

Bases: Widget, _OrientationMixin, MutableSequence[WidgetVar]

Widget that can contain other widgets.

Wraps a widget that implements ContainerProtocol.

A ContainerWidget behaves like a python list of Widget objects. Subwidgets can be accessed using integer or slice-based indexing (container[0]), as well as by widget name (container.<widget_name>). Widgets can be added with append or insert, and removed with del or pop, etc...

There is a tight connection between a ContainerWidget and an inspect.Signature object, just as there is a tight connection between individual Widgetobjects an an :class:inspect.Parameter object. The signature representation of a ContainerWidget (with the current settings as default values) is accessible with the :meth:~ContainerWidget.__signature__ method (or by using :func:inspect.signature from the standard library)

For a ContainerWidget subclass that is tightly coupled to a specific function signature (as in the \"classic\" magicgui decorator), see magicgui.widgets.FunctionGui.

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__signature__","title":"__signature__: MagicSignature property","text":"

Return a MagicSignature object representing the current state of the gui.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.labels","title":"labels: bool property writable","text":"

Whether widgets are presented with labels.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.layout","title":"layout: str property writable","text":"

Return the layout of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.margins","title":"margins: tuple[int, int, int, int] property writable","text":"

Return margin between the content and edges of the container.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__delattr__","title":"__delattr__(name: str) -> None","text":"

Delete a widget by name.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__delitem__","title":"__delitem__(key: int | slice) -> None","text":"

Delete a widget by integer or slice index.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__dir__","title":"__dir__() -> list[str]","text":"

Add subwidget names to the dir() call for this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__getattr__","title":"__getattr__(name: str) -> WidgetVar","text":"

Return attribute name. Will return a widget if present.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__getitem__","title":"__getitem__(key: int | str | slice) -> WidgetVar | MutableSequence[WidgetVar]","text":"

Get item by integer, str, or slice.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__len__","title":"__len__() -> int","text":"

Return the count of widgets.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__repr__","title":"__repr__() -> str","text":"

Return a repr.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__setattr__","title":"__setattr__(name: str, value: Any) -> None","text":"

Set attribute name. Prevents changing widget if present, (use del).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__setitem__","title":"__setitem__(key: Any, value: Any) -> NoReturn","text":"

Prevent assignment by index.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.asdict","title":"asdict() -> dict[str, Any]","text":"

Return state of widget as dict.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.from_callable","title":"from_callable(obj: Callable, gui_options: dict | None = None, **kwargs: Unpack[ContainerKwargs]) -> Container classmethod","text":"

Create a Container widget from a callable object.

In most cases, it will be preferable to create a FunctionGui instead.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.from_signature","title":"from_signature(sig: inspect.Signature, **kwargs: Unpack[ContainerKwargs]) -> Container classmethod","text":"

Create a Container widget from an inspect.Signature object.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.index","title":"index(value: Any, start: int = 0, stop: int = 9223372036854775807) -> int","text":"

Return index of a specific widget instance (or widget name).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.insert","title":"insert(key: int, widget: WidgetVar) -> None","text":"

Insert widget at key.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.remove","title":"remove(value: Widget | str) -> None","text":"

Remove a widget instance (may also be string name of widget).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.reset_choices","title":"reset_choices(*_: Any) -> None","text":"

Reset choices for all Categorical subWidgets to the default state.

If widget._default_choices is a callable, this may NOT be the exact same set of choices as when the widget was instantiated, if the callable relies on external state.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.update","title":"update(mapping: Mapping | Iterable[tuple[str, Any]] | None = None, **kwargs: Any) -> None","text":"

Update the parameters in the widget from a mapping, iterable, or kwargs.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.DialogWidget","title":"magicgui.widgets.bases.DialogWidget","text":"

Bases: ContainerWidget

Modal Container.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.DialogWidget.exec","title":"exec() -> bool","text":"

Show the dialog, and block.

Return True if the dialog was accepted, False if rejected.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.MainWindowWidget","title":"magicgui.widgets.bases.MainWindowWidget","text":"

Bases: ContainerWidget

Top level Application widget that can contain other widgets.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.MainWindowWidget.create_menu_item","title":"create_menu_item(menu_name: str, item_name: str, callback: Callable | None = None, shortcut: str | None = None) -> None","text":"

Create a menu item item_name under menu menu_name.

menu_name will be created if it does not already exist.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget","title":"magicgui.widgets.bases.RangedWidget","text":"

Bases: ValueWidget[T]

Widget with a constrained value. Wraps RangedWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.adaptive_step","title":"adaptive_step: bool property writable","text":"

Whether the step size is adaptive.

Adaptive decimal step means that the step size will continuously be adjusted to one power of ten below the current value. So when the value is 1100, the step is set to 100, so stepping up once increases it to 1200. For 1200 stepping up takes it to 1300. For negative values, stepping down from -1100 goes to -1200.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.max","title":"max: float property writable","text":"

Maximum allowable value for the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.min","title":"min: float property writable","text":"

Minimum allowable value for the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.range","title":"range: tuple[float, float] property writable","text":"

Range of allowable values for the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.step","title":"step: float | None property writable","text":"

Step size for widget values (None if adaptive step is turned on).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.value","title":"value(value: T) -> None","text":"

Set widget value, will raise Value error if not within min/max.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget","title":"magicgui.widgets.bases.SliderWidget","text":"

Bases: RangedWidget[T], _OrientationMixin

Widget with a constrained value and orientation. Wraps SliderWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget.readout","title":"readout: bool property writable","text":"

Get visibility state of readout widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget.tracking","title":"tracking: bool property writable","text":"

Return whether slider tracking is enabled.

If tracking is enabled (the default), the slider emits the changed() signal while the slider is being dragged. If tracking is disabled, the slider emits the changed() signal only when the user releases the slider.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget","title":"magicgui.widgets.bases.ValueWidget","text":"

Bases: Widget, Generic[T]

Widget with a value, Wraps ValueWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation. If the widget is nullable (had a type annototation of Optional[Type]), annotation will return the first argument in the Optional clause.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.value","title":"value: T property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.__repr__","title":"__repr__() -> str","text":"

Return representation of widget of instance.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.bind","title":"bind(value: T | Callable[[ValueWidget], T], call: bool = True) -> None","text":"

Binds value to self.value.

If a value is bound to this widget, then whenever widget.value is accessed, the value provided here will be returned. value can be a callable, in which case value(self) will be returned (i.e. your callback must accept a single parameter, which is this widget instance.).

If you provide a callable and you don't want it to be called (but rather just returned as a callable object, then use call=False when binding your value.

Note: if you need to access the \"original\" widget.value within your callback, please use widget.get_value() instead of the widget.value property, in order to avoid a RuntimeError.

Parameters:

  • value (Any) \u2013

    The value (or callback) to return when accessing this widget's value.

  • call (bool, default: True ) \u2013

    If value is a callable and call is True, the callback will be called as callback(self) when accessing self.value. If False, the callback will simply be returned as a callable object, by default, True.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.get_value","title":"get_value() -> T","text":"

Callable version of self.value.

The main API is to use self.value, however, this is here in order to provide an escape hatch if trying to access the widget's value inside of a callback bound to self._bound_value.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.unbind","title":"unbind() -> None","text":"

Unbinds any bound values. (see ValueWidget.bind).

"},{"location":"api/widgets/create_widget/","title":"magicgui.widgets.create_widget","text":""},{"location":"api/widgets/create_widget/#magicgui.widgets.create_widget","title":"magicgui.widgets.create_widget(value=Undefined, annotation=None, name='', param_kind='POSITIONAL_OR_KEYWORD', label=None, gui_only=False, app=None, widget_type=None, options=None, is_result=False, raise_on_unknown=True)","text":"

Create and return appropriate widget subclass.

This factory function can be used to create a widget appropriate for the provided value and/or annotation provided. See Type Mapping Docs for details on how the widget type is determined from type annotations.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget, by default None

  • annotation (Any, default: None ) \u2013

    The type annotation for the parameter represented by the widget, by default None.

  • name (str, default: '' ) \u2013

    The name of the parameter represented by this widget. by default \"\"

  • param_kind (str, default: 'POSITIONAL_OR_KEYWORD' ) \u2013

    The :attr:inspect.Parameter.kind represented by this widget. Used in building signatures from multiple widgets, by default \"POSITIONAL_OR_KEYWORD\"

  • label (str, default: None ) \u2013

    A string to use for an associated Label widget (if this widget is being shown in a Container widget, and labels are on). By default, name will be used. Note: name refers the name of the parameter, as might be used in a signature, whereas label is just the label for that widget in the GUI.

  • gui_only (bool, default: False ) \u2013

    Whether the widget should be considered \"only for the gui\", or if it should be included in any widget container signatures, by default False

  • app (str, default: None ) \u2013

    The backend to use, by default None

  • widget_type (str or Type[WidgetProtocol] or None, default: None ) \u2013

    A class implementing a widget protocol or a string with the name of a magicgui widget type (e.g. \"Label\", \"PushButton\", etc...). If provided, this widget type will be used instead of the type autodetermined from value and/or annotation above.

  • options (dict, default: None ) \u2013

    Dict of options to pass to the Widget constructor, by default dict()

  • is_result (boolean, default: False ) \u2013

    Whether the widget belongs to an input or an output. By default, an input is assumed.

  • raise_on_unknown (bool, default: True ) \u2013

    Raise exception if no widget is found for the given type, by default True

Returns:

  • Widget \u2013

    An instantiated widget subclass

Raises:

  • TypeError \u2013

    If the provided or autodetected widget_type does not implement any known widget protocols

Examples:

from magicgui.widgets import create_widget\n\n# create a widget from a string value\nwdg = create_widget(value=\"hello world\")\nassert wdg.value == \"hello world\"\n\n# create a widget from a string annotation\nwdg = create_widget(annotation=str)\nassert wdg.value == \"\"\n
"},{"location":"generated_examples/","title":"Examples","text":""},{"location":"generated_examples/#getting-started","title":"Getting started","text":"

A gallery of examples for magicgui.

Basic example

Basic widgets demo

"},{"location":"generated_examples/#demo-applications","title":"Demo applications","text":"

Example applications built with magicgui.

Input values dialog

Quantities with pint

Callable functions demo

Snell's law demonstration using magicgui

Hotdog or not app

Chaining functions together

"},{"location":"generated_examples/#demo-widget-types","title":"Demo widget types","text":"

Example gallery demonstrating the available widget types in magicgui.

Image widget

Custom text labels for widgets

Range slider widget

Log slider widget

Optional user choice

Multiple selection widget

Password login

File dialog widget

Dropdown selection widget

Table widget

"},{"location":"generated_examples/#matplotlib-and-magicgui","title":"matplotlib and magicgui","text":"

Examples involving matplotlib graphs and magicgui.

matplotlib figure example

Waveforms example

"},{"location":"generated_examples/#napari-and-magicgui","title":"napari and magicgui","text":"

Examples integrating magicgui with napari.

napari forward reference demo

napari Qt demo

napari parameter sweeps

napari image arithmetic widget

"},{"location":"generated_examples/#jupyter-notebooks-and-magicgui","title":"Jupyter notebooks and magicgui","text":"

Examples using jupyter notebooks together with magicgui.

Jupyter notebooks and magicgui

"},{"location":"generated_examples/#progress-bar-examples","title":"Progress bar examples","text":"

Examples of progress bars in magicgui.

Manual progress bar

Simple progress bar

Indeterminate progress bar

Nested progress bars

"},{"location":"generated_examples/#under-the-hood","title":"Under the hood","text":"

Learn more advanced usage patterns for magicgui, including self referencing widgets and decorating class methods with magicgui.

Self reference magicgui widgets

Deocrate class methods with magicgui

Download all examples in Python source code: generated_examples_python.zip

Download all examples in Jupyter notebooks: generated_examples_jupyter.zip

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/basic_example/","title":"Basic example","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/basic_example/#basic-example","title":"Basic example","text":"

A basic example using magicgui.

Out:

<FunctionGui example(x: int = 0, y='hi')>\n

from magicgui import magicgui\n\n\n@magicgui\ndef example(x: int, y=\"hi\"):\n    \"\"\"Basic example function.\"\"\"\n    return x, y\n\n\nexample.changed.connect(print)\nexample.show(run=True)\n

Total running time of the script: ( 0 minutes 1.433 seconds)

Download Python source code: basic_example.py

Download Jupyter notebook: basic_example.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/basic_widgets_demo/","title":"Basic widgets demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/basic_widgets_demo/#basic-widgets-demo","title":"Basic widgets demo","text":"

Widget demonstration with magicgui.

This code demonstrates a few of the widget types that magicgui can create based on the parameter types in your function.

Out:

<MainFunctionGui widget_demo(boolean=True, integer=1, spin_float=3.14, slider_float=43.5, slider_int=550, string='Text goes here', dropdown=<Medium.Glass: 1.52>, radio_option=2, date=datetime.date(1999, 12, 31), time=datetime.time(1, 30, 20), datetime=datetime.datetime(2023, 12, 6, 16, 27, 47, 592000), filename=PosixPath('/Users/runner'))>\n

import datetime\nfrom enum import Enum\nfrom pathlib import Path\n\nfrom magicgui import magicgui\n\n\nclass Medium(Enum):\n    \"\"\"Enum for various media and their refractive indices.\"\"\"\n\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(\n    main_window=True,\n    call_button=\"Calculate\",\n    layout=\"vertical\",\n    result_widget=True,\n    slider_float={\"widget_type\": \"FloatSlider\", \"max\": 100},\n    slider_int={\"widget_type\": \"Slider\", \"readout\": False},\n    radio_option={\n        \"widget_type\": \"RadioButtons\",\n        \"orientation\": \"horizontal\",\n        \"choices\": [(\"first option\", 1), (\"second option\", 2)],\n    },\n    filename={\"label\": \"Pick a file:\"},\n)\ndef widget_demo(\n    boolean=True,\n    integer=1,\n    spin_float=3.14159,\n    slider_float=43.5,\n    slider_int=550,\n    string=\"Text goes here\",\n    dropdown=Medium.Glass,\n    radio_option=2,\n    date=datetime.date(1999, 12, 31),\n    time=datetime.time(1, 30, 20),\n    datetime=datetime.datetime.now(),\n    filename=Path.home(),\n):\n    \"\"\"We can use numpy docstrings to provide tooltips.\n\n    Parameters\n    ----------\n    boolean : bool, optional\n        A checkbox for booleans, by default True\n    integer : int, optional\n        Some integer, by default 1\n    spin_float : float, optional\n        This one is a float, by default \"pi\"\n    slider_float : float, optional\n        Hey look! I'm a slider, by default 43.5\n    slider_int : float, optional\n        I only take integers, and I've hidden my readout, by default 550\n    string : str, optional\n        We'll use this string carefully, by default \"Text goes here\"\n    dropdown : Enum, optional\n        Pick a medium, by default Medium.Glass\n    radio_option : int\n        A set of radio buttons.\n    date : datetime.date, optional\n        Your birthday, by default datetime.date(1999, 12, 31)\n    time : datetime.time, optional\n        Some time, by default datetime.time(1, 30, 20)\n    datetime : datetime.datetime, optional\n        A very specific time and date, by default ``datetime.datetime.now()``\n    filename : str, optional\n        Pick a path, by default Path.home()\n    \"\"\"\n    return locals().values()\n\n\nwidget_demo.changed.connect(print)\nwidget_demo.show(run=True)\n

Total running time of the script: ( 0 minutes 0.197 seconds)

Download Python source code: basic_widgets_demo.py

Download Jupyter notebook: basic_widgets_demo.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/mg_execution_times/","title":"Computation times","text":"

00:01.630 total execution time for generated_examples files:

+-------------------------------------------------------------------------------------+-----------+--------+ | basic_example (docs/examples/basic_example.py) | 00:01.433 | 0.0 MB | +-------------------------------------------------------------------------------------+-----------+--------+ | basic_widgets_demo (docs/examples/basic_widgets_demo.py) | 00:00.197 | 0.0 MB | +-------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/applications/callable/","title":"Callable functions demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/callable/#callable-functions-demo","title":"Callable functions demo","text":"

This example demonstrates handling callable functions with magicgui.

Out:

<FunctionGui example(func='f')>\n

from magicgui import magicgui\n\n\ndef f(x: int, y=\"a string\") -> str:\n    \"\"\"Example function F.\"\"\"\n    return f\"{y} {x}\"\n\n\ndef g(x: int = 6, y=\"another string\") -> str:\n    \"\"\"Example function G.\"\"\"\n    return f\"{y} asdfsdf {x}\"\n\n\n@magicgui(call_button=True, func={\"choices\": [\"f\", \"g\"]})\ndef example(func=\"f\"):\n    \"\"\"\u00cbxample function.\"\"\"\n    pass\n\n\ndef update(f: str):\n    \"\"\"Update function.\"\"\"\n    if len(example) > 2:\n        del example[1]\n    example.insert(1, magicgui(globals()[f]))\n\n\nexample.func.changed.connect(update)\nexample.show(run=True)\n

Total running time of the script: ( 0 minutes 0.041 seconds)

Download Python source code: callable.py

Download Jupyter notebook: callable.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/chaining/","title":"Chaining functions together","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/chaining/#chaining-functions-together","title":"Chaining functions together","text":"

This example demonstrates chaining multiple functions together.

Out:

calling func_a\ncalling func_b\ncalling func_c\n\n\n<Container (func_a: NoneType, func_b: NoneType, func_c: NoneType)>\n

from magicgui import magicgui, widgets\n\n\n@magicgui(auto_call=True)\ndef func_a(x: int = 64, y: int = 64):\n    \"\"\"Callable function A.\"\"\"\n    print(\"calling func_a\")\n    return x + y\n\n\n@magicgui(auto_call=True, input={\"visible\": False, \"label\": \" \", \"max\": 100000})\ndef func_b(input: int, mult=1.0):\n    \"\"\"Callable function B.\"\"\"\n    print(\"calling func_b\")\n    result = input * mult\n    # since these function defs live in globals(), you can update them directly\n    func_c.input.value = result\n    return result\n\n\n# alternatively, you can the `widget.called` signal to connect a callback function\n# where the result of the function being called is at `value`\n@func_a.called.connect\ndef _on_func_a(value: str):\n    func_b.input.value = value\n\n\n@magicgui(\n    auto_call=True,\n    input={\"visible\": False, \"max\": 100000},\n    result_widget=True,\n    labels=False,\n)\ndef func_c(input: int, format: str = \"({} + {}) * {} is {}\") -> str:\n    \"\"\"Callable function C.\"\"\"\n    print(\"calling func_c\\n\")\n    return format.format(func_a.x.value, func_a.y.value, func_b.mult.value, input)\n\n\ncontainer = widgets.Container(\n    widgets=[func_a, func_b, func_c], layout=\"vertical\", labels=False\n)\ncontainer.native.setMinimumWidth(500)\nfunc_a()\ncontainer.show(run=True)\n\n# notice which functions get called when you change each widget.\n

Total running time of the script: ( 0 minutes 0.059 seconds)

Download Python source code: chaining.py

Download Jupyter notebook: chaining.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/hotdog/","title":"Hotdog or not app","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/hotdog/#hotdog-or-not-app","title":"Hotdog or not app","text":"

Demo app to upload an image and classify if it's an hotdog or not.

import pathlib\nfrom enum import Enum\n\nfrom magicgui import magicgui\n\n\nclass HotdogOptions(Enum):\n    \"\"\"All hotdog possibilities.\"\"\"\n\n    Hotdog = 1\n    NotHotdog = 0\n\n\n@magicgui(main_window=True, layout=\"form\", call_button=\"Classify\", result_widget=True)\ndef is_hotdog(img: pathlib.Path) -> HotdogOptions:\n    \"\"\"Classify possible hotdog images.\n\n    Upload an image and check whether it's an hotdog. For example, this image\n    will be classified as one: <br><br>\n\n    <img src=\"resources/hotdog.jpg\">\n\n    Parameters\n    ----------\n    img : pathlib.Path\n        Path to a possible hotdog image\n\n    Returns\n    -------\n    HotdogOptions\n        True if image contains an hotdog in it\n    \"\"\"\n    if \"hotdog\" in img.stem:\n        return HotdogOptions.Hotdog\n    return HotdogOptions.NotHotdog\n\n\nif __name__ == \"__main__\":\n    is_hotdog.show(run=True)\n

Total running time of the script: ( 0 minutes 0.054 seconds)

Download Python source code: hotdog.py

Download Jupyter notebook: hotdog.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/mg_execution_times/","title":"Computation times","text":"

00:03.743 total execution time for generated_examples_applications files:

+-----------------------------------------------------------------------------------+-----------+--------+ | pint_quantity (docs/examples/applications/pint_quantity.py) | 00:03.472 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | snells_law (docs/examples/applications/snells_law.py) | 00:00.117 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | chaining (docs/examples/applications/chaining.py) | 00:00.059 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | hotdog (docs/examples/applications/hotdog.py) | 00:00.054 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | callable (docs/examples/applications/callable.py) | 00:00.041 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | values_dialog (docs/examples/applications/values_dialog.py) | 00:00.000 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/applications/pint_quantity/","title":"Quantities with pint","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/pint_quantity/#quantities-with-pint","title":"Quantities with pint","text":"

Pint is a Python package to define, operate and manipulate physical quantities: the product of a numerical value and a unit of measurement. It allows arithmetic operations between them and conversions from and to different units. https://pint.readthedocs.io/en/stable/

Out:

<FunctionGui widget(q=<Quantity(1, 'millisecond')>)>\n

from pint import Quantity\n\nfrom magicgui import magicgui\n\n\n@magicgui\ndef widget(q=Quantity(\"1 ms\")):\n    \"\"\"Widget allowing users to input quantity measurements.\"\"\"\n    print(q)\n\n\nwidget.show(run=True)\n

Total running time of the script: ( 0 minutes 3.472 seconds)

Download Python source code: pint_quantity.py

Download Jupyter notebook: pint_quantity.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/snells_law/","title":"Snell's law demonstration using magicgui","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/snells_law/#snells-law-demonstration-using-magicgui","title":"Snell's law demonstration using magicgui","text":"

Demo app for calculating angles of refraction according to Snell's law.

Out:

<FunctionGui snells_law(aoi=1.0, n1=<Medium.Glass: 1.52>, n2=<Medium.Water: 1.333>, degrees=True)>\n

import math\nfrom enum import Enum\n\nfrom magicgui import magicgui\n\n\nclass Medium(Enum):\n    \"\"\"Enum for various media and their refractive indices.\"\"\"\n\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(call_button=\"calculate\", result_widget=True)\ndef snells_law(aoi=1.0, n1=Medium.Glass, n2=Medium.Water, degrees=True):\n    \"\"\"Calculate the angle of refraction given two media and an AOI.\"\"\"\n    if degrees:\n        aoi = math.radians(aoi)\n    try:\n        n1 = n1.value\n        n2 = n2.value\n        result = math.asin(n1 * math.sin(aoi) / n2)\n        return round(math.degrees(result) if degrees else result, 2)\n    except ValueError:  # math domain error\n        return \"TIR!\"\n\n\nsnells_law.show(run=True)\n

Total running time of the script: ( 0 minutes 0.117 seconds)

Download Python source code: snells_law.py

Download Jupyter notebook: snells_law.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/values_dialog/","title":"Input values dialog","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/values_dialog/#input-values-dialog","title":"Input values dialog","text":"

A basic example of a user input dialog.

This will pause code execution until the user responds.

"},{"location":"generated_examples/applications/values_dialog/#_1","title":"Input values dialog","text":"
from magicgui.widgets import request_values\n\nvals = request_values(\n    age=int,\n    name={\"annotation\": str, \"label\": \"Enter your name:\"},\n    title=\"Hi, who are you?\",\n)\nprint(repr(vals))\n

Total running time of the script: ( 0 minutes 0.000 seconds)

Download Python source code: values_dialog.py

Download Jupyter notebook: values_dialog.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/change_label/","title":"Custom text labels for widgets","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/change_label/#custom-text-labels-for-widgets","title":"Custom text labels for widgets","text":"

An example showing how to create custom text labels for your widgets.

Out:

<FunctionGui example(x=1, y='hi')>\n

from magicgui import magicgui\n\n\n# use a different label than the default (the parameter name) in the UI\n@magicgui(x={\"label\": \"widget to set x\"})\ndef example(x=1, y=\"hi\"):\n    \"\"\"Example function.\"\"\"\n    return x, y\n\n\nexample.changed.connect(print)\nexample.show(run=True)\n

Total running time of the script: ( 0 minutes 0.060 seconds)

Download Python source code: change_label.py

Download Jupyter notebook: change_label.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/choices/","title":"Dropdown selection widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/choices/#dropdown-selection-widget","title":"Dropdown selection widget","text":"

Choices for dropdowns can be provided in a few different ways.

Out:

<Container (as_list: NoneType, as_enum: NoneType, as_2tuple: NoneType, as_function: NoneType)>\n

from enum import Enum\n\nfrom magicgui import magicgui, widgets\n\n\nclass Medium(Enum):\n    \"\"\"Enum for various media and their refractive indices.\"\"\"\n\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(ri={\"choices\": [\"Oil\", \"Water\", \"Air\"]}, auto_call=True)\ndef as_list(ri=\"Water\"):\n    \"\"\"Function decorated with magicgui list of choices.\"\"\"\n    print(\"refractive index is\", Medium[ri].value)\n\n\n@magicgui(auto_call=True)\ndef as_enum(ri: Medium = Medium.Water):\n    \"\"\"Function decorated with magicgui and enumeration.\"\"\"\n    print(\"refractive index is\", ri.value)\n\n\n@magicgui(\n    ri={\"choices\": [(\"Oil\", 1.515), (\"Water\", 1.33), (\"Air\", 1.0)]}, auto_call=True\n)\ndef as_2tuple(ri=1.33):\n    \"\"\"Function decorated with magicgui tuple of choices.\"\"\"\n    print(\"refractive index is\", ri)\n\n\ndef get_choices(gui):\n    \"\"\"Function returning tuple of material and refractive index value.\"\"\"\n    return [(\"Oil\", 1.515), (\"Water\", 1.33), (\"Air\", 1.0)]\n\n\n@magicgui(ri={\"choices\": get_choices}, auto_call=True)\ndef as_function(ri: float):\n    \"\"\"Function to calculate refractive index.\"\"\"\n    print(\"refractive index is\", ri)\n\n\ncontainer = widgets.Container(\n    widgets=[as_list, as_enum, as_2tuple, as_function], layout=\"vertical\"\n)\ncontainer.show(run=True)\n

Total running time of the script: ( 0 minutes 0.053 seconds)

Download Python source code: choices.py

Download Jupyter notebook: choices.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/file_dialog/","title":"File dialog widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/file_dialog/#file-dialog-widget","title":"File dialog widget","text":"

A file dialog widget example.

    %s
* ![file dialog](../images/mkd_glr_file_dialog_001.png){: .mkd-glr-multi-img srcset=\"../images/mkd_glr_file_dialog_001.png\"}\n\n* ![file dialog](../images/mkd_glr_file_dialog_002.png){: .mkd-glr-multi-img srcset=\"../images/mkd_glr_file_dialog_002.png\"}\n\n* ![file dialog](../images/mkd_glr_file_dialog_003.png){: .mkd-glr-multi-img srcset=\"../images/mkd_glr_file_dialog_003.png\"}\n
from pathlib import Path\nfrom typing import Sequence\n\nfrom magicgui import magicgui, use_app\n\n\n@magicgui(filename={\"mode\": \"r\"})\ndef filepicker(filename=Path(\"~\")):\n    \"\"\"Take a filename and do something with it.\"\"\"\n    print(\"The filename is:\", filename)\n    return filename\n\n\n# Sequence of paths\n# We change the label using \"label\" for added clarity\n# the filter argument restricts file types\n@magicgui(filenames={\"label\": \"Choose Tiff files:\", \"filter\": \"*.tif\"})\ndef filespicker(filenames: Sequence[Path]):\n    \"\"\"Take a filename and do something with it.\"\"\"\n    print(\"The filenames are:\", filenames)\n    return filenames\n\n\n# Select a directory, instead of file(s)\n@magicgui(directory={\"mode\": \"d\", \"label\": \"Choose a directory\"})\ndef directorypicker(directory=Path(\"~\")):\n    \"\"\"Take a directory name and do something with it.\"\"\"\n    print(\"The directory name is:\", directory)\n    return directory\n\n\nfilepicker.show()\nfilespicker.show()\ndirectorypicker.show()\nfilepicker.filename.changed.connect(print)\nfilespicker.filenames.changed.connect(print)\ndirectorypicker.directory.changed.connect(print)\n\nuse_app().run()\n

Total running time of the script: ( 0 minutes 0.126 seconds)

Download Python source code: file_dialog.py

Download Jupyter notebook: file_dialog.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/image/","title":"Image widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/image/#image-widget","title":"Image widget","text":"

Example of creating an Image Widget from a file.

(This requires pillow, or that magicgui was installed as magicgui[image])

Out:

Image(200x232x3, name='')\n

from magicgui.widgets import Image\n\nimage = Image(value=\"../../images/_test.jpg\")\nimage.scale_widget_to_image_size()\nimage.show(run=True)\n

Total running time of the script: ( 0 minutes 0.047 seconds)

Download Python source code: image.py

Download Jupyter notebook: image.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/log_slider/","title":"Log slider widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/log_slider/#log-slider-widget","title":"Log slider widget","text":"

A logarithmic scale range slider widget.

Out:

<FunctionGui slider(input=1.0)>\n

from magicgui import magicgui\n\n\n@magicgui(\n    auto_call=True,\n    result_widget=True,\n    input={\"widget_type\": \"LogSlider\", \"max\": 10000, \"min\": 1, \"tracking\": False},\n)\ndef slider(input=1):\n    \"\"\"Logarithmic scale slider.\"\"\"\n    return round(input, 4)\n\n\nslider.show(run=True)\n

Total running time of the script: ( 0 minutes 0.070 seconds)

Download Python source code: log_slider.py

Download Jupyter notebook: log_slider.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/login/","title":"Password login","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/login/#password-login","title":"Password login","text":"

A password login field widget.

Out:

<FunctionGui login(username: str = '', password: str = '', password2: str = '')>\n

from magicgui import magicgui\n\n\n# note that \"password\" is a special keyword argument\n# it will create a password field in the gui by default\n# (unless you override \"widget_type\")\n# whereas \"password2\" will be a normal text field\n# (unless you override \"widget_type\")\n@magicgui(password2={\"widget_type\": \"Password\"})\ndef login(username: str, password: str, password2: str):\n    \"\"\"User login credentials.\"\"\"\n    ...\n\n\nlogin.show(run=True)\n

Total running time of the script: ( 0 minutes 0.045 seconds)

Download Python source code: login.py

Download Jupyter notebook: login.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/mg_execution_times/","title":"Computation times","text":"

00:00.612 total execution time for generated_examples_demo_widgets files:

+--------------------------------------------------------------------------------+-----------+--------+ | file_dialog (docs/examples/demo_widgets/file_dialog.py) | 00:00.126 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | range_slider (docs/examples/demo_widgets/range_slider.py) | 00:00.077 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | log_slider (docs/examples/demo_widgets/log_slider.py) | 00:00.070 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | change_label (docs/examples/demo_widgets/change_label.py) | 00:00.060 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | optional (docs/examples/demo_widgets/optional.py) | 00:00.053 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | choices (docs/examples/demo_widgets/choices.py) | 00:00.053 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | image (docs/examples/demo_widgets/image.py) | 00:00.047 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | login (docs/examples/demo_widgets/login.py) | 00:00.045 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | table (docs/examples/demo_widgets/table.py) | 00:00.042 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | selection (docs/examples/demo_widgets/selection.py) | 00:00.039 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/demo_widgets/optional/","title":"Optional user choice","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/optional/#optional-user-choice","title":"Optional user choice","text":"

Optional user input using a dropdown selection widget.

Out:

<FunctionGui f(path: str = None)>\n

from typing import Optional\n\nfrom magicgui import magicgui\n\n\n# Using optional will add a '----' to the combobox, which returns \"None\"\n@magicgui(path={\"choices\": [\"a\", \"b\"]})\ndef f(path: Optional[str] = None):\n    \"\"\"\u00d6ptional user input function.\"\"\"\n    print(path, type(path))\n\n\nf.show(run=True)\n

Total running time of the script: ( 0 minutes 0.053 seconds)

Download Python source code: optional.py

Download Jupyter notebook: optional.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/range_slider/","title":"Range slider widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/range_slider/#range-slider-widget","title":"Range slider widget","text":"

A double ended range slider widget.

Out:

<FunctionGui func(range_value: Tuple[int, int] = (20, 380))>\n

from typing import Tuple\n\nfrom magicgui import magicgui\n\n\n@magicgui(auto_call=True, range_value={\"widget_type\": \"RangeSlider\", \"max\": 500})\ndef func(range_value: Tuple[int, int] = (20, 380)):\n    \"\"\"Double ended range slider.\"\"\"\n    print(range_value)\n\n\nfunc.show(run=True)\n

Total running time of the script: ( 0 minutes 0.077 seconds)

Download Python source code: range_slider.py

Download Jupyter notebook: range_slider.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/selection/","title":"Multiple selection widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/selection/#multiple-selection-widget","title":"Multiple selection widget","text":"

A selection widget allowing multiple selections by the user.

Out:

<FunctionGui my_widget(pick_some=['first'])>\n

from magicgui import magicgui\n\n\n@magicgui(\n    pick_some={\n        \"choices\": (\"first\", \"second\", \"third\", \"fourth\"),\n        \"allow_multiple\": True,\n    }\n)\ndef my_widget(pick_some=(\"first\")):\n    \"\"\"Dropdown selection function.\"\"\"\n    print(\"you selected\", pick_some)\n\n\nmy_widget.show(run=True)\n

Total running time of the script: ( 0 minutes 0.039 seconds)

Download Python source code: selection.py

Download Jupyter notebook: selection.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/table/","title":"Table widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/table/#table-widget","title":"Table widget","text":"

Demonstrating a few ways to input tables.

Out:

Table(shape=(6, 3) at 0x139598bf0)\n

import numpy as np\n\nfrom magicgui.widgets import Table\n\n# all of these are valid data types\ndict_of_lists = {\"col_1\": [1, 4], \"col_2\": [2, 5], \"col_3\": [3, 6]}\n# column-dict-of-row-dicts\ndict_of_dict = {\n    \"col_1\": {\"r1\": 1, \"r2\": 4},\n    \"col_2\": {\"r1\": 2, \"r2\": 5},\n    \"col_3\": {\"r1\": 3, \"r2\": 6},\n}\n# list-of-lists\nlist_of_list = [[1, 2, 3], [4, 5, 6]]\n# Records: List-of-column-dict\nlist_of_records = [\n    {\"col_1\": 1, \"col_2\": 2, \"col_3\": 3},\n    {\"col_1\": 4, \"col_2\": 5, \"col_3\": 6},\n]\n\n# 3-tuple of data, index, column\ndata_index_column_tuple = (([[1, 2, 3], [4, 5, 6]], (\"r1\", \"r2\"), (\"c1\", \"c2\", \"c3\")),)\n# split-dict\nsplit_dict = {\n    \"data\": [[1, 2, 3], [4, 5, 6]],\n    \"index\": (\"r1\", \"r2\"),\n    \"columns\": (\"c1\", \"c2\", \"c3\"),\n}\n\ntable = Table(value=dict_of_lists)\n\n# it behaves like a dict:\ntable[\"new_col\"] = [5, 5]\nassert table.pop(\"new_col\") == [5, 5]\n# keys and items have both regular (column) and \"row\" modes\ncol_item_view = table.items()  # iterate col_header/column\nrow_item_view = table.items(\"row\")  # iterate row_header/row\n\n# we can just call dict() to get back our dict of lists\nassert dict(table) == dict_of_lists\n# or use one of many other exports in `to_dict`\nassert table.to_dict(\"records\") == list_of_records\n\n# change headers\ntable.row_headers = (\"row1\", \"row2\")\ntable.column_headers = (\"a\", \"b\", \"c\")\n\n# setting value clears and resets the table:\ntable.value = np.arange(18).reshape(6, 3)\n# we can get/set/delete the 2D data table using numpy-style indexing:\n# get every other row\nassert table.data[::2] == [[0, 1, 2], [6, 7, 8], [12, 13, 14]]\n# set every other column in the 3rd row\ntable.data[2, ::2] = [99, 99]\n\n# export to numpy or pandas\n# table.data.to_numpy()\n# table.to_dataframe()\n\n# the table.changed event emits a dict of information on any cell change\n# e.g. {'data': 'sdfg', 'row': 1, 'column': 0, 'column_header': '1', 'row_header': '1'}\ntable.changed.connect(print)\ntable.show(run=True)\n

Total running time of the script: ( 0 minutes 0.042 seconds)

Download Python source code: table.py

Download Jupyter notebook: table.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/matplotlib/mg_execution_times/","title":"Computation times","text":"

00:00.619 total execution time for generated_examples_matplotlib files:

+------------------------------------------------------------------------+-----------+--------+ | waveform (docs/examples/matplotlib/waveform.py) | 00:00.408 | 0.0 MB | +------------------------------------------------------------------------+-----------+--------+ | mpl_figure (docs/examples/matplotlib/mpl_figure.py) | 00:00.211 | 0.0 MB | +------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/matplotlib/mpl_figure/","title":"matplotlib figure example","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/matplotlib/mpl_figure/#matplotlib-figure-example","title":"matplotlib figure example","text":"

Basic example of adding a generic QWidget to a container.

Main lesson: add your QWidget to container.native.layout() as shown on line 30

Out:

<FunctionGui f(position: int = 0)>\n

import matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.backends.backend_qt5agg import FigureCanvas\n\nfrom magicgui import magicgui\n\nx = np.linspace(0, 5, 256)\ny = np.linspace(0, 5, 256)[:, np.newaxis]\ndata = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)\n\nmpl_fig = plt.figure()\nax = mpl_fig.add_subplot(111)\n(line,) = ax.plot(data[123])  # linescan through the middle of the image\n\n\n@magicgui(position={\"widget_type\": \"Slider\", \"max\": 255}, auto_call=True)\ndef f(position: int):\n    \"\"\"Function demonstrating magicgui combined with matplotlib.\"\"\"\n    line.set_ydata(data[position])\n    line.figure.canvas.draw()\n\n\n# rather than using the Container.append (`f.append`) ...\n# grab the native layout and add the QWidget to it\nf.native.layout().addWidget(FigureCanvas(mpl_fig))\n\nf.show(run=True)\n

Total running time of the script: ( 0 minutes 0.211 seconds)

Download Python source code: mpl_figure.py

Download Jupyter notebook: mpl_figure.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/matplotlib/waveform/","title":"Waveforms example","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/matplotlib/waveform/#waveforms-example","title":"Waveforms example","text":"

Simple waveform generator widget, with plotting.

Out:

<Container (signal_widget: NoneType, sine: NoneType)>\n

from dataclasses import dataclass, field\nfrom enum import Enum\nfrom functools import partial\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.backends.backend_qt5agg import FigureCanvas\nfrom scipy import signal\nfrom typing_extensions import Annotated\n\nfrom magicgui import magicgui, register_type, widgets\n\nregister_type(float, widget_type=\"FloatSlider\")\nregister_type(int, widget_type=\"Slider\")\n\nFreq = Annotated[float, {\"min\": 0.001, \"max\": 30.0}]\nPhase = Annotated[float, {\"min\": 0.0, \"max\": 360.0}]\nDuty = Annotated[float, {\"min\": 0.0, \"max\": 1.0}]\nTime = Annotated[float, {\"min\": 0.01, \"max\": 100.0}]\n\n\n@dataclass\nclass Signal:\n    \"\"\"Constructs a 1D signal.\n\n    As is, this class is not very useful, but one could add callbacks\n    or more functionality here\n\n    Parameters\n    ----------\n    func : callable\n        func must take a 'time' array as sole argument and return a 1D array with the\n        same size as the input\n    duration : float\n        the maximum of the input time array\n    size : int\n        the number of samples in the time array\n\n    \"\"\"\n\n    func: callable\n    duration: Time = 1.0\n    size: int = 500\n    time: np.ndarray = field(init=False)\n    data: np.ndarray = field(init=False)\n\n    def __post_init__(self):\n        \"\"\"Evaluate the function at instantiation time.\"\"\"\n        self.time = np.linspace(0, self.duration, self.size)\n        self.data = self.func(self.time)\n\n    def plot(self, ax=None, **kwargs):\n        \"\"\"Plots the data.\n\n        Parameters\n        ----------\n        ax: matplotlib.axes.Axes instance, default None\n           if provided the plot is done on this axes instance.\n           If None a new ax is created\n        **kwargs: Keyword arguments that are passed on to\n            the matplotib ax.plot method\n\n        Returns\n        -------\n        fig: a matplotlib.figure.Figure instance\n        ax: matplotlib.axes.Axes instance\n        \"\"\"\n        if ax is None:\n            fig, ax = plt.subplots()\n        else:\n            fig = ax.get_figure()\n        ax.plot(self.time, self.data, **kwargs)\n        return fig, ax\n\n\ndef sine(\n    duration: Time = 10.0, size: int = 500, freq: Freq = 0.5, phase: Phase = 0.0\n) -> Signal:\n    \"\"\"Returns a 1D sine wave.\n\n    Parameters\n    ----------\n    duration: float\n       the duration of the signal in seconds\n    size: int\n        the number of samples in the signal time array\n    freq: float\n       the frequency of the signal in Hz\n    phase: Phase\n       the phase of the signal (in degrees)\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=lambda t: np.sin(t * (2 * np.pi * freq) + phase * np.pi / 180),\n    )\n    return sig\n\n\ndef chirp(\n    duration: Time = 10.0,\n    size: int = 500,\n    f0: float = 1.0,\n    t1: Time = 5.0,\n    f1: float = 2.0,\n    phase: Phase = 0.0,\n) -> Signal:\n    \"\"\"Frequency-swept cosine generator.\n\n    See scipy.signal.chirp\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=partial(signal.chirp, f0=f0, t1=t1, f1=f1, phi=phase),\n    )\n    return sig\n\n\ndef sawtooth(\n    duration: Time = 10.0,\n    size: int = 500,\n    freq: Freq = 1.0,\n    width: Duty = 1.0,\n    phase: Phase = 0.0,\n) -> Signal:\n    \"\"\"Return a periodic sawtooth or triangle waveform.\n\n    See scipy.signal.sawtooth\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=lambda t: signal.sawtooth(\n            2 * np.pi * freq * t + phase * np.pi / 180, width=width\n        ),\n    )\n    return sig\n\n\ndef square(\n    duration: Time = 10.0, size: int = 500, freq: Freq = 1.0, duty: Duty = 0.5\n) -> Signal:\n    \"\"\"Return a periodic sawtooth or triangle waveform.\n\n    See scipy.signal.square\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=lambda t: signal.square(2 * np.pi * freq * t, duty=duty),\n    )\n    return sig\n\n\ndef on_off(\n    duration: Time = 10.0, size: int = 500, t_on: Time = 0.01, t_off: Time = 0.01\n) -> Signal:\n    \"\"\"On/Off signal function.\"\"\"\n    data = np.ones(size)\n    data[: int(size * t_on / duration)] = -1\n    if t_off > 0:\n        data[int(size * t_off / duration) :] = -1\n    sig = Signal(duration=duration, size=size, func=lambda t: data)\n    return sig\n\n\nWAVEFORMS = {\n    \"sine\": sine,\n    \"chirp\": chirp,\n    \"sawtooth\": sawtooth,\n    \"square\": square,\n    \"on_off\": on_off,\n}\n\n\nclass Select(Enum):\n    \"\"\"Enumeration to select signal type.\"\"\"\n\n    OnOff = \"on_off\"\n    Sine = \"sine\"\n    Chirp = \"chirp\"\n    Sawtooth = \"sawtooth\"\n    Square = \"square\"\n\n\nclass WaveForm(widgets.Container):\n    \"\"\"Simple waveform generator widget, with plotting.\"\"\"\n\n    def __init__(self):\n        \"\"\"Creates the widget.\"\"\"\n        super().__init__()\n        self.fig, self.ax = plt.subplots()\n        self.native.layout().addWidget(FigureCanvas(self.fig))\n        self.waveform = sine\n        self.controls = None\n        self.append(self.signal_widget)\n        self.update_controls()\n        self.update_graph(sine())\n\n    @magicgui(auto_call=True)\n    def signal_widget(self, select: Select = Select.Sine) -> widgets.Container:\n        \"\"\"Waveform selection, from the WAVEFORMS dict.\"\"\"\n        self.waveform = WAVEFORMS[select.value]\n        self.update_controls()\n        self.update_graph(self.waveform())\n\n    def update_controls(self):\n        \"\"\"Reset controls according to the new function.\"\"\"\n        if self.controls is not None:\n            self.remove(self.controls)\n        self.controls = magicgui(auto_call=True)(self.waveform)\n        self.append(self.controls)\n        self.controls.called.connect(self.update_graph)\n\n    def update_graph(self, sig: Signal):\n        \"\"\"Re-plot when a parameter changes.\n\n        Note\n        ----\n        For big data, this could be slow, maybe `auto_call` should\n        not be true in the method above...\n        \"\"\"\n        self.ax.cla()\n        sig.plot(ax=self.ax)\n        self.fig.canvas.draw()\n\n\nwaveform = WaveForm()\nwaveform.show(run=True)\n

Total running time of the script: ( 0 minutes 0.408 seconds)

Download Python source code: waveform.py

Download Jupyter notebook: waveform.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/mg_execution_times/","title":"Computation times","text":"

00:31.441 total execution time for generated_examples_napari files:

+--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_combine_qt (docs/examples/napari/napari_combine_qt.py) | 00:19.889 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_parameter_sweep (docs/examples/napari/napari_parameter_sweep.py) | 00:06.221 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_img_math (docs/examples/napari/napari_img_math.py) | 00:05.255 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_forward_refs (docs/examples/napari/napari_forward_refs.py) | 00:00.076 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/napari/napari_combine_qt/","title":"napari Qt demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_combine_qt/#napari-qt-demo","title":"napari Qt demo","text":"

Napari provides a few conveniences with magicgui, and one of the most commonly used is the layer combo box that gets created when a parameter is annotated as napari.layers.Layer.

The layer box will stay in sync with the viewer model, adding and removing layers as needed.

This example shows how to use just that widget in the context of a larger custom QWidget.

import napari\nfrom qtpy.QtWidgets import QVBoxLayout, QWidget\n\nfrom magicgui.widgets import create_widget\n\n\nclass CustomWidget(QWidget):\n    \"\"\"A custom widget class.\"\"\"\n\n    def __init__(self) -> None:\n        super().__init__()\n        self.setLayout(QVBoxLayout())\n        # change annotation to napari.layers.Image (e.g) to restrict to just Images\n        self._layer_combo = create_widget(annotation=napari.layers.Layer)\n        # magicgui widgets hold the Qt widget at `widget.native`\n        self.layout().addWidget(self._layer_combo.native)\n\n\nviewer = napari.Viewer()\nviewer.add_points()\nviewer.add_points()\n\nmy_widget = CustomWidget()\nviewer.window.add_dock_widget(my_widget)\n\n# when my_widget is a magicgui.Widget, it will detect that it has been added\n# to a viewer, and automatically update the choices.  Otherwise, you need to\n# trigger this yourself:\nmy_widget._layer_combo.reset_choices()\nviewer.layers.events.inserted.connect(my_widget._layer_combo.reset_choices)\nviewer.layers.events.removed.connect(my_widget._layer_combo.reset_choices)\n\nnapari.run()\n

Total running time of the script: ( 0 minutes 19.889 seconds)

Download Python source code: napari_combine_qt.py

Download Jupyter notebook: napari_combine_qt.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/napari_forward_refs/","title":"napari forward reference demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_forward_refs/#napari-forward-reference-demo","title":"napari forward reference demo","text":"

Example of using a ForwardRef to avoid importing a module that provides a widget.

In this example, one might want to create a widget that takes as an argument a napari Image layer, and returns an Image. In order to avoid needing to import napari (and therefore depending directly on napari), it's possible to annotate those parameters with a string representation of the type (rather than the type itself). This is called a \"forward reference\": https://www.python.org/dev/peps/pep-0484/#forward-references

Out:

<FunctionGui subtract_background(data: napari.types.ImageData = None, background: int = 50) -> napari.types.ImageData>\n

# Note: if you'd like to avoid circular imports, or just want to avoid having your\n# linter yell at you for an undefined type annotation, you can place the import\n# inside of an `if typing.TYPE_CHECKING` conditional.  This is not evaluated at runtime,\n# only when something like mypy is doing type checking.\nfrom typing import TYPE_CHECKING\n\nfrom magicgui import magicgui\n\nif TYPE_CHECKING:\n    import napari\n\n\n@magicgui(call_button=\"execute\", background={\"max\": 200})\ndef subtract_background(\n    data: \"napari.types.ImageData\", background: int = 50\n) -> \"napari.types.ImageData\":\n    \"\"\"Subtract a constant from the data.\"\"\"\n    if data:\n        return data - background\n\n\nsubtract_background.show(run=True)\n# now, this example isn't all that interesting on its own (since there will be no Image\n# layer in the dropdown) ... but in another package, where you DO import napari,\n# you could add this widget to a napari viewer with\n# viewer.window.add_dock_widget(subtract_background)\n

Total running time of the script: ( 0 minutes 0.076 seconds)

Download Python source code: napari_forward_refs.py

Download Jupyter notebook: napari_forward_refs.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/napari_img_math/","title":"napari image arithmetic widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_img_math/#napari-image-arithmetic-widget","title":"napari image arithmetic widget","text":"

napari is a fast, interactive, multi-dimensional image viewer for python. It uses Qt for the GUI, so it's easy to extend napari with small, composable widgets created with magicgui. Here we're going to build this simple image arithmetic widget with a few additional lines of code.

For napari-specific magicgui documentation, see the napari docs

"},{"location":"generated_examples/napari/napari_img_math/#outline","title":"outline","text":"

This example demonstrates how to:

  1. Create a magicgui widget that can be used in another program (napari)

  2. Use an Enum to create a dropdown menu

  3. Connect some event listeners to create interactivity.

"},{"location":"generated_examples/napari/napari_img_math/#code","title":"code","text":"

Code follows, with explanation below... You can also get this example at github.

from enum import Enum\n\nimport napari\nimport numpy\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\nclass Operation(Enum):\n    # A set of valid arithmetic operations for image_arithmetic.\n    #\n    # To create nice dropdown menus with magicgui, it's best\n    # (but not required) to use Enums.  Here we make an Enum\n    # class for all of the image math operations we want to\n    # allow.\n    add = numpy.add\n    subtract = numpy.subtract\n    multiply = numpy.multiply\n    divide = numpy.divide\n\n\n# here's the magicgui!  We also use the additional\n# `call_button` option\n@magicgui(call_button=\"execute\")\ndef image_arithmetic(\n    layerA: ImageData, operation: Operation, layerB: ImageData\n) -> ImageData:\n    # Add, subtracts, multiplies, or divides to image layers.\n    return operation.value(layerA, layerB)\n\n# create a viewer and add a couple image layers\nviewer = napari.Viewer()\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 1\")\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 2\")\n\n# add our new magicgui widget to the viewer\nviewer.window.add_dock_widget(image_arithmetic)\n\n# keep the dropdown menus in the gui in sync with the layer model\nviewer.layers.events.inserted.connect(image_arithmetic.reset_choices)\nviewer.layers.events.removed.connect(image_arithmetic.reset_choices)\n\nnapari.run()\n
"},{"location":"generated_examples/napari/napari_img_math/#walkthrough","title":"walkthrough","text":"

We're going to go a little out of order so that the other code makes more sense. Let's start with the actual function we'd like to write to do some image arithmetic.

"},{"location":"generated_examples/napari/napari_img_math/#the-function","title":"the function","text":"

Our function takes two numpy arrays (in this case, from Image layers), and some mathematical operation (we'll restrict the options using an enum.Enum). When called, ourfunction calls the selected operation on the data.

def image_arithmetic(array1, operation, array2):\n    return operation.value(array1, array2)\n
"},{"location":"generated_examples/napari/napari_img_math/#type-annotations","title":"type annotations","text":"

magicgui works particularly well with type annotations, and allows third-party libraries to register widgets and behavior for handling their custom types (using magicgui.type_map.register_type). napari provides support for magicgui by registering a dropdown menu whenever a function parameter is annotated as one of the basic napari Layer types, or, in this case, ImageData indicates we just the data attribute of the layer. Furthermore, it recognizes when a function has a napari.layers.Layer or LayerData return type annotation, and will add the result to the viewer. So we gain a lot by annotating the above function with the appropriate napari types.

from napari.types import ImageData\n\ndef image_arithmetic(\n    layerA: ImageData, operation: Operation, layerB: ImageData\n) -> ImageData:\n    return operation.value(layerA, layerB)\n
"},{"location":"generated_examples/napari/napari_img_math/#the-magic-part","title":"the magic part","text":"

Finally, we decorate the function with @magicgui and tell it we'd like to have a call_button that we can click to execute the function.

@magicgui(call_button=\"execute\")\ndef image_arithmetic(layerA: ImageData, operation: Operation, layerB: ImageData):\n    return operation.value(layerA, layerB)\n

That's it! The image_arithmetic function is now a FunctionGui that can be shown, or incorporated into other GUIs (such as the napari GUI shown in this example)

!!! note While type hints aren't always required in magicgui, they are recommended ... and they are required for certain things, like the Operation(Enum) used here for the dropdown and the napari.types.ImageData annotations that napari has registered with magicgui.

"},{"location":"generated_examples/napari/napari_img_math/#create-dropdowns-with-enums","title":"create dropdowns with Enums","text":"

We'd like the user to be able to select the operation (add, subtract, multiply, divide) using a dropdown menu. enum.Enum offers a convenient way to restrict values to a strict set of options, while providing name: value pairs for each of the options. Here, the value for each choice is the actual function we would like to have called when that option is selected.

class Operation(enum.Enum):\n    add = numpy.add\n    subtract = numpy.subtract\n    multiply = numpy.multiply\n    divide = numpy.divide\n
"},{"location":"generated_examples/napari/napari_img_math/#add-it-to-napari","title":"add it to napari","text":"

When we decorated the image_arithmetic function above, it became a FunctionGui. Napari recognizes this type, so we can simply add it to the napari viewer as follows:

viewer.window.add_dock_widget(image_arithmetic)\n
"},{"location":"generated_examples/napari/napari_img_math/#connect-event-listeners-for-interactivity","title":"connect event listeners for interactivity","text":"

What fun is a GUI without some interactivity? Let's make stuff happen.

We connect the image_arithmetic.reset_choices function to the viewer.layers.events.inserted/removed event from napari, to make sure that the dropdown menus stay in sync if a layer gets added or removed from the napari window:

viewer.layers.events.inserted.connect(image_arithmetic.reset_choices)\nviewer.layers.events.removed.connect(image_arithmetic.reset_choices)\n

Tip

An additional offering from magicgui here is that the decorated function also acquires a new attribute \"called\" that can be connected to callback functions of your choice. Then, whenever the gui widget or the original function are called, the result will be passed to your callback function:

@image_arithmetic.called.connect\ndef print_mean(value):\n    # Callback function that accepts an event\n    # the value attribute has the result of calling the function\n    print(np.mean(value))\n
>>> image_arithmetic()\n1.0060037881040373\n
"},{"location":"generated_examples/napari/napari_img_math/#code_1","title":"Code","text":"

Here's the full code example again.

from enum import Enum\n\nimport napari\nimport numpy\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\nclass Operation(Enum):\n    # A set of valid arithmetic operations for image_arithmetic.\n    #\n    # To create nice dropdown menus with magicgui, it's best\n    # (but not required) to use Enums.  Here we make an Enum\n    # class for all of the image math operations we want to\n    # allow.\n    add = numpy.add\n    subtract = numpy.subtract\n    multiply = numpy.multiply\n    divide = numpy.divide\n\n\n# here's the magicgui!  We also use the additional\n# `call_button` option\n@magicgui(call_button=\"execute\")\ndef image_arithmetic(\n    layerA: ImageData, operation: Operation, layerB: ImageData\n) -> ImageData:\n    # Add, subtracts, multiplies, or divides to image layers.\n    return operation.value(layerA, layerB)\n\n\n# create a viewer and add a couple image layers\nviewer = napari.Viewer()\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 1\")\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 2\")\n\n# add our new magicgui widget to the viewer\nviewer.window.add_dock_widget(image_arithmetic)\n\n# keep the dropdown menus in the gui in sync with the layer model\nviewer.layers.events.inserted.connect(image_arithmetic.reset_choices)\nviewer.layers.events.removed.connect(image_arithmetic.reset_choices)\n\nnapari.run()\n

Total running time of the script: ( 0 minutes 5.255 seconds)

Download Python source code: napari_img_math.py

Download Jupyter notebook: napari_img_math.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/napari_parameter_sweep/","title":"napari parameter sweeps","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_parameter_sweep/#napari-parameter-sweeps","title":"napari parameter sweeps","text":"

napari is a fast, interactive, multi-dimensional image viewer for python. It uses Qt for the GUI, so it's easy to extend napari with small, composable widgets created with magicgui. Here, we demonstrate how to build a interactive widget that lets you immediately see the effect of changing one of the parameters of your function.

For napari-specific magicgui documentation, see the napari docs

See also: Some of this tutorial overlaps with topics covered in the napari image arithmetic example.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#outline","title":"outline","text":"

This example demonstrates how to:

  1. Create a magicgui widget that can be used in another program (napari)

  2. Automatically call our function when a parameter changes

  3. Provide magicgui with a custom widget for a specific argument

  4. Use the choices option to create a dropdown

  5. Connect some event listeners to create interactivity.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#code","title":"code","text":"

Code follows, with explanation below... You can also get this example at github.

import napari\nimport skimage.data\nimport skimage.filters\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\n# turn the gaussian blur function into a magicgui\n# - 'auto_call' tells magicgui to call the function when a parameter changes\n# - we use 'widget_type' to override the default \"float\" widget on sigma,\n#   and provide a maximum valid value.\n# - we contstrain the possible choices for 'mode'\n@magicgui(\n    auto_call=True,\n    sigma={\"widget_type\": \"FloatSlider\", \"max\": 6},\n    mode={\"choices\": [\"reflect\", \"constant\", \"nearest\", \"mirror\", \"wrap\"]},\n    layout=\"horizontal\",\n)\ndef gaussian_blur(layer: ImageData, sigma: float = 1.0, mode=\"nearest\") -> ImageData:\n    # Apply a gaussian blur to 'layer'.\n    if layer is not None:\n        return skimage.filters.gaussian(layer, sigma=sigma, mode=mode)\n\n# create a viewer and add some images\nviewer = napari.Viewer()\nviewer.add_image(skimage.data.astronaut().mean(-1), name=\"astronaut\")\nviewer.add_image(skimage.data.grass().astype(\"float\"), name=\"grass\")\n\n# Add it to the napari viewer\nviewer.window.add_dock_widget(gaussian_blur)\n# update the layer dropdown menu when the layer list changes\nviewer.layers.events.changed.connect(gaussian_blur.reset_choices)\n\nnapari.run()\n
"},{"location":"generated_examples/napari/napari_parameter_sweep/#walkthrough","title":"walkthrough","text":"

We're going to go a little out of order so that the other code makes more sense. Let's start with the actual function we'd like to write to apply a gaussian filter to an image.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#the-function","title":"the function","text":"

Our function is a very thin wrapper around skimage.filters.gaussian. It takes a napari Image layer, a sigma to control the blur radius, and a mode that determines how edges are handled.

def gaussian_blur(\n    layer: Image, sigma: float = 1, mode=\"nearest\"\n) -> Image:\n    return filters.gaussian(layer.data, sigma=sigma, mode=mode)\n

The reasons we are wrapping it here are:

  1. filters.gaussian accepts a numpy array, but we want to work with napari layers that store the data in a layer.data attribute. So we need an adapter.
  2. We'd like to add some type annotations to the signature that were not provided by filters.gaussian
"},{"location":"generated_examples/napari/napari_parameter_sweep/#type-annotations","title":"type annotations","text":"

As described in the image arithmetic example, we take advantage of napari's built in support for magicgui by annotating our function parameters and return value as napari Layer types. napari will then tell magicgui what to do with them, creating a dropdown with a list of current layers for our layer parameter, and automatically adding the result of our function to the viewer when called.

For documentation on napari types with magicgui, see the napari docs

"},{"location":"generated_examples/napari/napari_parameter_sweep/#the-magic-part","title":"the magic part","text":"

Finally, we decorate the function with @magicgui and provide some options.

@magicgui(\n    auto_call=True,\n    sigma={\"widget_type\": \"FloatSlider\", \"max\": 6},\n    mode={\"choices\": [\"reflect\", \"constant\", \"nearest\", \"mirror\", \"wrap\"]},\n)\ndef gaussian_blur(\n  layer: ImageData, sigma: float = 1.0, mode=\"nearest\"\n) -> ImageData:\n    # Apply a gaussian blur to ``layer``.\n    if layer is not None:\n        return skimage.filters.gaussian(layer, sigma=sigma, mode=mode)\n
  • auto_call=True makes it so that the gaussian_blur function will be called whenever one of the parameters changes (with the current parameters set in the GUI).
  • We then provide keyword arguments to modify the look & behavior of sigma and mode:

    • \"widget_type\": \"FloatSlider\" tells magicgui not to use the standard (float) widget for the sigma widget, but rather to use a slider widget.
    • we then set an upper limit on the slider values for sigma.
  • finally, we specify valid choices for the mode argument. This turns that parameter into a categorical/dropdown type widget, and sets the options.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#connecting-events","title":"connecting events","text":"

As described in the Events documentation, we can also connect any callback to the gaussian_blur.called signal that will receive the result of our decorated function anytime it is called.

def do_something_with_result(result):\n    ...\n\ngaussian_blur.called.connect(do_something_with_result)\n
"},{"location":"generated_examples/napari/napari_parameter_sweep/#code_1","title":"Code","text":"

Here's the full code example again.

import napari\nimport skimage.data\nimport skimage.filters\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\n# turn the gaussian blur function into a magicgui\n# - 'auto_call' tells magicgui to call the function when a parameter changes\n# - we use 'widget_type' to override the default \"float\" widget on sigma,\n#   and provide a maximum valid value.\n# - we contstrain the possible choices for 'mode'\n@magicgui(\n    auto_call=True,\n    sigma={\"widget_type\": \"FloatSlider\", \"max\": 6},\n    mode={\"choices\": [\"reflect\", \"constant\", \"nearest\", \"mirror\", \"wrap\"]},\n    layout=\"horizontal\",\n)\ndef gaussian_blur(layer: ImageData, sigma: float = 1.0, mode=\"nearest\") -> ImageData:\n    # Apply a gaussian blur to 'layer'.\n    if layer is not None:\n        return skimage.filters.gaussian(layer, sigma=sigma, mode=mode)\n\n\n# create a viewer and add some images\nviewer = napari.Viewer()\nviewer.add_image(skimage.data.astronaut().mean(-1), name=\"astronaut\")\nviewer.add_image(skimage.data.grass().astype(\"float\"), name=\"grass\")\n\n# Add it to the napari viewer\nviewer.window.add_dock_widget(gaussian_blur)\n# update the layer dropdown menu when the layer list changes\nviewer.layers.events.changed.connect(gaussian_blur.reset_choices)\n\nnapari.run()\n

Total running time of the script: ( 0 minutes 6.221 seconds)

Download Python source code: napari_parameter_sweep.py

Download Jupyter notebook: napari_parameter_sweep.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/notebooks/magicgui_jupyter/","title":"Jupyter notebooks and magicgui","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/notebooks/magicgui_jupyter/#jupyter-notebooks-and-magicgui","title":"Jupyter notebooks and magicgui","text":"

This example shows magicgui widgets embedded in a jupyter notebook.

The key function here is use_app(\"ipynb\").

You can also get this example at github.

import math\nfrom enum import Enum\n\nfrom magicgui import magicgui, use_app\nuse_app(\"ipynb\")\n\nclass Medium(Enum):\n    # Various media and their refractive indices.\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(\n    call_button=\"calculate\", result_widget=True, layout='vertical', auto_call=True\n)\ndef snells_law(aoi=1.0, n1=Medium.Glass, n2=Medium.Water, degrees=True):\n    # Calculate the angle of refraction given two media and an angle of incidence.\n    if degrees:\n        aoi = math.radians(aoi)\n    try:\n        n1 = n1.value\n        n2 = n2.value\n        result = math.asin(n1 * math.sin(aoi) / n2)\n        return round(math.degrees(result) if degrees else result, 2)\n    except ValueError:  # math domain error\n        return \"TIR!\"\n\n\nsnells_law\n

Total running time of the script: ( 0 minutes 0.000 seconds)

Download Python source code: magicgui_jupyter.py

Download Jupyter notebook: magicgui_jupyter.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/notebooks/mg_execution_times/","title":"Computation times","text":"

00:00.000 total execution time for generated_examples_notebooks files:

+-----------------------------------------------------------------------------------------+-----------+--------+ | magicgui_jupyter (docs/examples/notebooks/magicgui_jupyter.py) | 00:00.000 | 0.0 MB | +-----------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/progress_bars/mg_execution_times/","title":"Computation times","text":"

00:00.319 total execution time for generated_examples_progress_bars files:

+---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_nested (docs/examples/progress_bars/progress_nested.py) | 00:00.106 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress (docs/examples/progress_bars/progress.py) | 00:00.084 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_manual (docs/examples/progress_bars/progress_manual.py) | 00:00.082 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_indeterminate (docs/examples/progress_bars/progress_indeterminate.py) | 00:00.047 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/progress_bars/progress/","title":"Simple progress bar","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress/#simple-progress-bar","title":"Simple progress bar","text":"

A simple progress bar demo with magicgui.

Out:

<FunctionGui long_running(steps=10, delay=0.1)>\n

from time import sleep\n\nfrom magicgui import magicgui\nfrom magicgui.tqdm import trange\n\n# if magicui.tqdm.tqdm or trange are used outside of a @magicgui function, (such as in\n# interactive use in IPython), then they fall back to the standard terminal output\n\n\n# If use inside of a magicgui-decorated function\n# a progress bar widget will be added to the magicgui container\n@magicgui(call_button=True, layout=\"horizontal\")\ndef long_running(steps=10, delay=0.1):\n    \"\"\"Long running computation with range iterator.\"\"\"\n    # trange(steps) is a shortcut for `tqdm(range(steps))`\n    for _i in trange(steps):\n        sleep(delay)\n\n\nlong_running.show(run=True)\n

Total running time of the script: ( 0 minutes 0.084 seconds)

Download Python source code: progress.py

Download Jupyter notebook: progress.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/progress_bars/progress_indeterminate/","title":"Indeterminate progress bar","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress_indeterminate/#indeterminate-progress-bar","title":"Indeterminate progress bar","text":"

Example of an indeterminate progress bar for a long running computation of unknown time.

Out:

<FunctionGui long_running(sleep_time=5)>\n

import time\n\nfrom superqt.utils import thread_worker\n\nfrom magicgui import magicgui\nfrom magicgui.tqdm import tqdm\n\n\n@magicgui(call_button=True, layout=\"horizontal\")\ndef long_running(sleep_time=5):\n    \"\"\"Long running computation with an indeterminate progress bar.\"\"\"\n    # Here tqdm is not provided an iterable argument, or the 'total' kwarg\n    # so it cannot calculate the expected number of iterations\n    # which means it will create an indeterminate progress bar\n    with tqdm() as pbar:\n        # It is best practice to use a separate thread for long running computations\n        # This makes the function non-blocking, you can still interact with the widget\n        @thread_worker(connect={\"finished\": lambda: pbar.progressbar.hide()})\n        def sleep(secs):\n            time.sleep(secs)\n\n        sleep(sleep_time)\n\n\nlong_running.show(run=True)\n

Total running time of the script: ( 0 minutes 0.047 seconds)

Download Python source code: progress_indeterminate.py

Download Jupyter notebook: progress_indeterminate.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/progress_bars/progress_manual/","title":"Manual progress bar","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress_manual/#manual-progress-bar","title":"Manual progress bar","text":"

Example of a progress bar being updated manually.

Out:

<FunctionGui manual(pbar: magicgui.widgets.ProgressBar = ProgressBar(value=<function match_type.<locals>.<lambda> at 0x13fe3bce0>, annotation=<class 'magicgui.widgets.ProgressBar'>, name='pbar'), increment: bool = 1)>\n

from magicgui import magicgui\nfrom magicgui.widgets import ProgressBar\n\n\n@magicgui(call_button=\"tick\", pbar={\"min\": 0, \"step\": 2, \"max\": 20, \"value\": 0})\ndef manual(pbar: ProgressBar, increment: bool = True):\n    \"\"\"Example of manual progress bar control.\"\"\"\n    if increment:\n        pbar.increment()\n    else:\n        pbar.decrement()\n\n\nmanual.show(run=True)\n

Total running time of the script: ( 0 minutes 0.082 seconds)

Download Python source code: progress_manual.py

Download Jupyter notebook: progress_manual.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/progress_bars/progress_nested/","title":"Nested progress bars","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress_nested/#nested-progress-bars","title":"Nested progress bars","text":"

Example using nested progress bars in magicgui.

Out:

<FunctionGui long_function(steps=10, repeats=4, choices='ABCDEFGHIJKLMNOP12345679', char='', delay=0.05)>\n

import random\nfrom time import sleep\n\nfrom magicgui import magicgui\nfrom magicgui.tqdm import tqdm, trange\n\n# if magicui.tqdm.tqdm or trange are used outside of a @magicgui function, (such as in\n# interactive use in IPython), then they fall back to the standard terminal output\n\n\n# If use inside of a magicgui-decorated function\n# a progress bar widget will be added to the magicgui container\n@magicgui(call_button=True, layout=\"vertical\")\ndef long_function(\n    steps=10, repeats=4, choices=\"ABCDEFGHIJKLMNOP12345679\", char=\"\", delay=0.05\n):\n    \"\"\"Long running computation with nested iterators.\"\"\"\n    # trange and tqdm accept all the kwargs from tqdm itself, as well as any\n    # valid kwargs for magicgui.widgets.ProgressBar, (such as \"label\")\n    for _r in trange(repeats, label=\"repeats\"):\n        letters = [random.choice(choices) for _ in range(steps)]\n        # `tqdm`, like `tqdm`, accepts any iterable\n        # this progress bar is nested and will be run & reset multiple times\n        for letter in tqdm(letters, label=\"steps\"):\n            long_function.char.value = letter\n            sleep(delay)\n\n\nlong_function.show(run=True)\n

Total running time of the script: ( 0 minutes 0.106 seconds)

Download Python source code: progress_nested.py

Download Jupyter notebook: progress_nested.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/under_the_hood/class_method/","title":"Deocrate class methods with magicgui","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/under_the_hood/class_method/#deocrate-class-methods-with-magicgui","title":"Deocrate class methods with magicgui","text":"

Demonstrates decorating a class method with magicgui.

Once the class is instantiated, instance.method_name will return a FunctionGui in which the instance will always be provided as the first argument (i.e. \"self\") when the FunctionGui or method is called.

Out:

instance: a, counter: 0.0, sigma: 0.0\ninstance: b, counter: 0.0, sigma: 0.0\n

from magicgui import event_loop, magicgui\nfrom magicgui.widgets import Container\n\n\nclass MyObject:\n    \"\"\"Example object class.\"\"\"\n\n    def __init__(self, name):\n        self.name = name\n        self.counter = 0.0\n\n    @magicgui(auto_call=True)\n    def method(self, sigma: float = 0):\n        \"\"\"Example class method.\"\"\"\n        print(f\"instance: {self.name}, counter: {self.counter}, sigma: {sigma}\")\n        self.counter = self.counter + sigma\n        return self.name\n\n\nwith event_loop():\n    a = MyObject(\"a\")\n    b = MyObject(\"b\")\n    container = Container(widgets=[a.method, b.method])\n    container.show()\n    assert a.method() == \"a\"\n    assert b.method() == \"b\"\n

Total running time of the script: ( 0 minutes 0.048 seconds)

Download Python source code: class_method.py

Download Jupyter notebook: class_method.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/under_the_hood/mg_execution_times/","title":"Computation times","text":"

00:00.108 total execution time for generated_examples_under_the_hood files:

+----------------------------------------------------------------------------------------+-----------+--------+ | self_reference (docs/examples/under_the_hood/self_reference.py) | 00:00.060 | 0.0 MB | +----------------------------------------------------------------------------------------+-----------+--------+ | class_method (docs/examples/under_the_hood/class_method.py) | 00:00.048 | 0.0 MB | +----------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/under_the_hood/self_reference/","title":"Self reference magicgui widgets","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/under_the_hood/self_reference/#self-reference-magicgui-widgets","title":"Self reference magicgui widgets","text":"

Widgets created with magicgui can reference themselves, and use the widget API.

Out:

<FunctionGui function(width=400, x: int = 50)>\n

from magicgui import magicgui\n\n\n@magicgui(auto_call=True, width={\"max\": 800, \"min\": 100}, x={\"widget_type\": \"Slider\"})\ndef function(width=400, x: int = 50):\n    \"\"\"Example function.\"\"\"\n    # the widget can reference itself, and use the widget API\n    function.x.width = width\n\n\nfunction.show(run=True)\n

Total running time of the script: ( 0 minutes 0.060 seconds)

Download Python source code: self_reference.py

Download Jupyter notebook: self_reference.ipynb

Gallery generated by mkdocs-gallery

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"magicgui \ud83e\uddd9","text":"

magicgui is a python library for building graphical user interfaces (GUIs).

It aims to speed up data workflows by providing a simple, consistent API for creating GUIs to control various data types, that work across various environments.

GUIs may be built manually using a variety of widgets, or generated automatically from python type hints.

"},{"location":"#magicgui-organization","title":"magicgui organization","text":"

magicgui can be thought of as performing two distinct tasks:

  1. Providing an simplified abstraction layer for GUI frameworks, allowing you to use the same API to create UIs that can move between environments and frameworks (such as a desktop app, or a Jupyter notebook).
  2. Providing a mapping of python types to widgets, allowing you to autogenerate graphical user interfaces for functions and dataclasses by annotating with standard python type hints.

While there is some degree of customizeability, the emphasis is on rapid development of relatively simple GUIs, with minimal boilerplate. For highly customized GUIs with complex layouts, it may be more appropriate to use a lower-level GUI framework.

The API is organized into 2 main levels:

magicgui API layers"},{"location":"#python-type-mapping","title":"Python Type Mapping","text":"

At its highest level, magicgui provides a mapping of Python types to widgets. This API allows you to create graphical user interfaces for your functions and dataclasses simply by annotating them with standard python type hints.

Type hints??

Type hints are a way to annotate your code with information about the types of variables and function arguments. They are completely optional, but static type checkers and other libraries (like magicgui!) can use them to check your code and/or provide additional functionality.

Typically, they are provided after a colon following a variable name or function argument.

In the example below, param_a has been annotated as an int, param_b as a str, and the return value as a list.

def my_function(param_a: int, param_b: str) -> list:\n    ...\n

If you are new to type annotations in Python, here are a few resources to get you started:

  • PEP 484 - the Python Enhancement Proposal that introduced type hints to the language. (See also: PEP 483)
  • Python docs - the official Python documentation on type hints and the typing module.
  • The mypy documentation also has a lot of useful information, including this cheat sheet
"},{"location":"#create_widget","title":"create_widget","text":"

magicgui.widgets.create_widget is a general function, used throughout the library, that allows you to create a widget for a specific Python type or value:

from magicgui.widgets import create_widget\n\n# passing a type to create_widget\nwidget = create_widget(annotation=int)\nwidget.show()\n

# passing a value to create_widget\nwidget2 = create_widget(value=\"Hello World\")\nwidget2.show()\n

For more details on how magicgui maps types to widgets, see Type Mapping.

"},{"location":"#magicgui_1","title":"magicgui","text":"

The magicgui.magicgui function is one way to autogenerate a compound Widget based on the parameters of a function:

from typing import Annotated, Literal\n# for Python <= 3.8\n# from typing_extensions import Annotated\n# for Python <= 3.7\n# from typing_extensions import Annotated, Literal\n\nfrom magicgui import magicgui\n\n\n@magicgui\ndef my_function(\n    param_a: int,\n    param_b: Annotated[int, {'widget_type': \"Slider\", 'max': 100}] = 42,\n    param_c: Literal[\"First\", \"Second\", \"Third\"] = \"Second\"\n):\n    print(\"param_a:\", param_a)\n    print(\"param_b:\", param_b)\n    print(\"param_c:\", param_c)\n\n# my_function now IS a widget, in addition to being a callable function\nmy_function.show()\n

For more details on using magicgui and magic_factory, see the magicgui decorators page.

"},{"location":"#guiclass","title":"guiclass","text":"

magicgui.experimental.guiclass is a newer experimental feature that provides an object-oriented alternative to magicgui. It wraps dataclasses.dataclass and adds a gui attribute to the resulting class, which is a magicgui-generated widget that can be used to control the dataclass instance. (The widget is only created when the gui attribute is accessed for the first time.)

from magicgui.experimental import guiclass, button\n\n@guiclass\nclass MyDataclass:\n    a: int = 0\n    b: str = 'hello'\n    c: bool = True\n\n    @button\n    def compute(self):\n        print(self.a, self.b, self.c)\n\nobj = MyDataclass(a=10, b='foo')\nobj.gui.show()\n

For more details on using the guiclass decorator, see Dataclasses & guiclass.

"},{"location":"#widgets","title":"Widgets","text":"

At the lower level, magicgui is a library of widgets (the individual elements that make up a graphical user interface). Each widget is customized to display and interact with a specific type of data. In some cases, it makes more sense to create and arrange these widgets manually, rather than using the type-based autogeneration features described above.

Magicgui acts as an abstraction layer for a variety of different GUI toolkits, allowing you to use the same API to create UIs that can move between environments (such as a desktop app, or a Jupyter notebook).

Currently, magicgui supports the following backends:

  • Qt (via PySide2/PySide6 or PyQt5/PyQt6)
  • Jupyter Widgets (a.k.a. \"IPyWidgets\")

You can use magicgui.widgets to quickly build graphical user interfaces.

from magicgui import widgets\n\na = widgets.SpinBox(value=10, label=\"a\")\nb = widgets.Slider(value=20, min=0, max=100, label=\"b\")\nresult = widgets.LineEdit(value=a.value * b.value, label=\"result\")\nbutton = widgets.PushButton(text=\"multiply\")\n\n@button.clicked.connect\ndef on_button_click():\n    result.value = a.value * b.value\n\ncontainer = widgets.Container(widgets=[a, b, result, button])\ncontainer.show()\n

To learn more about the available widgets and how to use them, see the Widgets Overview.

...details

Behind the scenes, magicgui declares a set of WidgetProtocols that each backend must implement, and every magicgui Widget is a wrapper around a backend-specific widget. Most users will never need to worry about this, but it's good to know that it's there if you ever need to dig deeper.

"},{"location":"#events","title":"Events","text":"

All widgets (whether created directly or autogenerated based on type hints) emit events when their value changes or in response to interaction.

To learn about connecting custom functionality to these events, see Events.

"},{"location":"#installation","title":"Installation","text":"

See installing magicgui.

"},{"location":"CONTRIBUTING/","title":"Contributing","text":"

Contributions are welcome!

"},{"location":"CONTRIBUTING/#development","title":"Development","text":"

To install magicgui for development, first clone the repository:

git clone https://github.com/pyapp-kit/magicgui\ncd magicgui\n

Then install the package in editable mode with the dev extra:

pip install -e .[dev]\n

To run the tests:

pytest\n
"},{"location":"CONTRIBUTING/#code-quality","title":"Code Quality","text":"

magicgui attempts to adhere to strict coding rules and employs the following static analysis tools to prevent errors from being introduced into the codebase:

  • black - code formatting
  • ruff - linting
  • mypy - static type analysis
  • codecov - test coverage

To prevent continuous integration failures when contributing, please consider installing pre-commit in your environment to run all of these checks prior to checking in new code.

pre-commit install\n

To run the checks manually, you can use:

pre-commit run --all-files\n
"},{"location":"CONTRIBUTING/#adding-a-widget","title":"Adding a widget","text":"

These instructions may change in the future as the repo structures changes. If they appear outdated as you follow them, please open an issue.

To add a new widget, you will need to:

  1. Create a new class in magicgui/widgets/_concrete.py that inherits from the base class most appropriate for your widget (e.g. ValueWidget, or CategoricalWidget).

    In some (complex) cases, you may need to extend one of the base classes. If so, it is likely that you will also need to extend one of the Protocols found in magicgui.widgets.protocols. This is where all of protocols that backend classes need to implement to work with a given widget type. (Don't hesitate to open an issue if you're confused).

  2. Most likely, you will want to decorate the class with @backend_widget. Using this decorator implies that there is a class with the same name in any any backend modules that will support this widget type (e.g. magicgui.backends._qtpy.widgets for Qt support.).

  3. Make any changes necessary to your new concrete class. For example, you may need to change the value property and corresponding setter to handle a specific type. This part of the code should be backend agnostic.
  4. Export the new class in magicgui/widgets/__init__.py so that it can be imported from magicgui.widgets.
  5. Implement the backend widget class (using the same class name) in the appropriate backend module (e.g. magicgui.backends._qtpy.widgets for Qt support). Usually this will mean implementing the appropriate _mgui_get/set_... methods for the Protocol of the corresponding widget base class your chose to extend.
  6. Export the backend widget class in the __init__.py of the backend module (e.g. magicgui.backends._qtpy.__init__.py for Qt support). This is important, as that is where the @backend_widget decorator will look.
  7. Add a test for your new widget.

For an example of a minimal PR adding a new widget, see #483, which added a QuantityWidget to be used with pint.Quantity objects.

"},{"location":"CONTRIBUTING/#associating-a-widget-with-a-type","title":"Associating a widget with a type","text":"

To associate your new widget with a specific type such that it will be used when someone annotates a parameter with that type, you will need to update code in magicgui.type_map._type_map.

In the simplest of cases, this will mean adding a new entry to the magicgui.type_map._type_map._SIMPLE_TYPES dict. This is a mapping from a python type to a widget class. (Note that all subclasses of the type will also be matched.)

For more complex cases, you can add a new conditional to the body of the match_type function. That function should always return a tuple of widget type, and kwargs that will be passed to the widget constructor. For example: return widgets.MyNewWidget, {}.

"},{"location":"CONTRIBUTING/#building-the-documentation","title":"Building the documentation","text":"

To build the documentation locally, you will need to install the docs extra:

pip install -e .[docs]\n

Then, from the root of the repository, run:

mkdocs serve\n

This will start a local server at http://127.0.0.1:8000/ where you can view the documentation as you edit it.

"},{"location":"dataclasses/","title":"Dataclasses & guiclass","text":""},{"location":"dataclasses/#what-are-dataclasses","title":"What are dataclasses?","text":"

dataclasses are a feature added in Python 3.7 (PEP 557) that allow you to simply define classes that store a specific set of data. They encourage clear, type-annotated code, and are a great way to define data structures with minimal boilerplate.

New to dataclasses?

If you're totally new to dataclasses, you might want to start with the official documentation for the dataclasses module, or this Real Python post on dataclasses. The following is a very brief example of the key features:

Example dataclass
from dataclasses import dataclass\n\n@dataclass  # (1)!\nclass Person:\n    name: str # (2)!\n    age: int = 0  # (3)!\n\np = Person(name='John', age=30)  # (4)!\nprint(p) # (5)!\n
  1. The @dataclass decorator is used to mark a class as a dataclass. This will automatically generate an __init__ method with a parameter for each annotated class attribute.
  2. Attribute names are annotated with types. Note that, as with all Python type hints, these have no runtime effect (i.e. no validation is performed).
  3. Optional attributes can be defined with a default value. If no default value is specified, then the field is required when creating a new object.
  4. Creating a new object is as simple as passing in the required arguments.
  5. The __repr__ method is automatically generated and will print out the class name and all of the attributes and their current values.
"},{"location":"dataclasses/#dataclass-patterns-outside-the-standard-library","title":"dataclass patterns outside the standard library","text":"

The dataclasses module is not the only way to define data-focused classes in Python. There are other libraries that provide similar functionality, and some of them have additional features that are not available in the standard library.

  • attrs is a popular library that provides a number of additional features on top of the standard library dataclasses, including complex validation and type conversions.
  • pydantic is a library that provides runtime type enforcement and casting, serialization, and other features.
  • msgspec is a fast serialization library with a msgspec.Struct that is similar to a dataclass.
"},{"location":"dataclasses/#magicgui-guiclass","title":"magicgui guiclass","text":"

Experimental

This is an experimental feature. The API may change in the future without deprecations or warnings.

magicgui supports the dataclass API as a way to define the interface for compound widget, where each attribute of the dataclass is a separate widget. The magicgui.experimental.guiclass decorator can be used to mark a class as a \"GUI class\". A GUI class is a Python standard dataclass that has two additional features:

  1. A property (named \"gui\" by default) that returns a Container widget which contains a widget for each attribute of the dataclass.
  2. An property (named \"events\" by default) that returns a psygnal.SignalGroup object that allows you to connect callbacks to the change event of any of field in the dataclass. (Under the hood, this uses the @evented dataclass decorator from psygnal.)

Tip

You can still use all of the standard dataclass features, including field values, __post_init__ processing, and ClassVar.

Info

In the future, we may also support other dataclass-like objects, such as pydantic models, attrs classes, and traitlets classes.

from magicgui.experimental import guiclass\n\n@guiclass\nclass MyDataclass:\n    a: int = 0\n    b: str = 'hello'\n    c: bool = True\n\nobj = MyDataclass()\nobj.gui.show()\n

The individual widgets in the Container may be accessed by the same name as the corresponding attribute. For example, obj.gui.a will return the SpinBox widget that controls the value of the a attribute.

"},{"location":"dataclasses/#two-way-data-binding","title":"Two-way data binding","text":"

As you interact programmatically with the obj instance, the widgets in the obj.gui will update. Similarly, as you change the value of the widgets in the obj.gui, the values of the obj instance will be updated.

obj = MyDataclass(a=10)\nobj.b = 'world'\nobj.c = False\n\nobj.gui.show()\n

All magicgui-related stuff is in the gui attribute

The original dataclass instance (obj) is essentially untouched. Just as in a regular dataclass, obj.a returns the current value of a in the dataclass. The widget for the class will be at obj.gui (or whatever name you specified in the gui_name parameter) So, obj.gui.a.value, returns the current value of the widget. Unless you explicitly disconnect the gui from the underlying object/model, the two will always be in sync.

"},{"location":"dataclasses/#adding-buttons-and-callbacks","title":"Adding buttons and callbacks","text":"

Buttons are one of the few widget types that tend not to have an associated value, but simply trigger a callback when clicked. That is: it doesn't often make sense to add a field to a dataclass representing a button. To add a button to a guiclass, decorate a method with the magicgui.experimental.button decorator.

positioning buttons

Currently, all buttons are appended to the end of the widget. The ability to position the button in the layout will be added in the future.

Any additional keyword arguments to the button decorator will be passed to the magicgui.widgets.PushButton constructor (e.g. label, tooltip, etc.)

from magicgui.experimental import guiclass, button\n\n@guiclass\nclass Greeter:\n    first_name: str\n\n    @button\n    def say_hello(self):\n        print(f'Hello {self.first_name}')\n\ngreeter = Greeter('Talley')\ngreeter.gui.show()\n

clicking the \"say_hello\" button will print \"Hello Talley\" to the console

Tip

As your widget begins to manage more internal state, the guiclass pattern becomes much more useful than the magicgui decorator pattern -- which was designed with pure functions that take inputs and return outputs in mind.

"},{"location":"decorators/","title":"magicgui & magic_factory","text":""},{"location":"decorators/#from-object-to-gui","title":"From Object to GUI","text":"

The eponymous feature of magicgui is the magicgui.magicgui function, which converts an object into a widget.

Info

Currently, the only supported objects are functions, but in the future magicgui.magicgui may accept other objects, such as dataclass instances

When used to decorate a function, @magicgui will autogenerate a graphical user interface (GUI) by inspecting the function signature and adding an appropriate GUI widget for each parameter, as described in Type Hints to Widgets. Parameter types are taken from type hints, if provided, or inferred using the type of the default value otherwise.

import math\nfrom enum import Enum\nfrom magicgui import magicgui\n\n# dropdown boxes are best made by creating an enum\nclass Medium(Enum):\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n# decorate your function with the @magicgui decorator\n@magicgui(call_button=\"calculate\")\ndef snells_law(aoi=30.0, n1=Medium.Glass, n2=Medium.Water, degrees=True):\n    aoi = math.radians(aoi) if degrees else aoi\n    try:\n        result = math.asin(n1.value * math.sin(aoi) / n2.value)\n        return math.degrees(result) if degrees else result\n    except ValueError:\n        # beyond the critical angle\n        return \"Total internal reflection!\"\n\nsnells_law.show()\n

The object returned by the magicgui decorator is an instance of magicgui.widgets.FunctionGui. It can still be called like the original function, but it also knows how to present itself as a GUI.

"},{"location":"decorators/#two-way-data-binding","title":"Two-Way Data Binding","text":"

The modified snells_law object gains attributes named after each of the parameters in the function. Each attribute is an instance of a magicgui.widgets.Widget subclass (suitable for the data type represented by that parameter). As you make changes in your GUI, the attributes of the snells_law object will be kept in sync. For instance, change the first dropdown menu from \"Glass\" to \"Oil\", and the corresponding n1 object on snells_law will change its value to 1.515:

snells_law.n1.value  # 1.515\n

It goes both ways: set a parameter in the console and it will change in the GUI:

snells_law.aoi.value = 47\nsnells_law.show()\n

"},{"location":"decorators/#its-still-a-function","title":"It's still a function","text":"

magicgui tries very hard to make it so that the decorated object behaves as much like the original object as possible.

We can invoke the function in a few ways:

  • Because we provided the call_button argument to the magicgui decorator, a new button was created that will execute the function with the current gui parameters when clicked.

  • We can call the object just like the original function.

    snells_law()        # 34.7602\nsnells_law(aoi=12)  # 13.7142\n

    Now however, the current values from the GUI will be used as the default values for any arguments that are not explicitly provided to the function.

    snells_law.aoi.value = 12\nsnells_law()  # 13.7142\nsnells_law(aoi=30)  # 34.7602\n

    In essence, your original function now has a \"living\" signature whose defaults change as the user interacts with your GUI.

    import inspect\n\ninspect.signature(snells_law)\n# <MagicSignature(\n#   aoi=12.0, n1=<Medium.Glass: 1.52>, n2=<Medium.Water: 1.333>, degrees=True\n# )>\n# notice how the default `aoi` is now 12 ... because we changed it above\n
  • You can still override positional or keyword arguments in the original function, just as you would with a regular function.

    Note

    calling the function with values that differ from the GUI will not set the values in the GUI... It's just a one-time call.

    # in radians, overriding the value for the second medium (n2)\nsnells_law(0.8, n2=Medium.Air, degrees=False)  # 'Total internal reflection!'\n
"},{"location":"decorators/#connecting-events","title":"Connecting Events","text":""},{"location":"decorators/#function-calls","title":"Function Calls","text":"

With a GUI, you are usually looking for something to happen as a result of calling the function. The function will have a new called attribute that you can connect to an arbitrary callback function:

@snells_law.called.connect\ndef my_callback(value: str):\n    # The callback receives an `Event` object that has the result\n    # of the function call in the `value` attribute\n    print(f\"Your function was called! The result is: {value}\")\n\nresult = snells_law()\n

Now when you call snells_law(), or click the calculate button in the gui, my_callback will be called with the result of the calculation.

"},{"location":"decorators/#parameter-changes","title":"Parameter Changes","text":"

You can also listen for changes on individual function parameters by connecting to the <parameter_name>.changed signal:

# whenever the current value for n1 changes, print it to the console:\n@snells_law.n1.changed.connect\ndef _on_n1_changed(x: Medium):\n    print(f\"n1 was changed to {x}\")\n\nsnells_law.n1.value = Medium.Air\n

Note

This signal will be emitted regardless of whether the parameter was changed in the GUI or via by directly setting the paramaeter on the gui instance.

"},{"location":"decorators/#usage-as-a-decorator-is-optional","title":"Usage As a Decorator is Optional","text":"

Remember: the @decorator syntax is just syntactic sugar. You don't have to use @magicgui to decorate your function declaration. You can also just call it with your function as an argument:

This decorator usage:

@magicgui(auto_call=True)\ndef function():\n    pass\n

is equivalent to this:

def function():\n    pass\n\nfunction = magicgui(function, auto_call=True)\n

In many cases, it will actually be desirable not to use magicgui as a decorator if you don't need a widget immediately, but want to create one later (see also the magic_factory decorator.)

# some time later...\nwidget_instance = magicgui(function)\n
"},{"location":"decorators/#magic_factory","title":"magic_factory","text":"

The magicgui.magic_factory function/decorator acts very much like the magicgui decorator, with one important difference:

Unlike magicgui, magic_factory does not return a widget instance immediately. Instead, it returns a \"factory function\" that can be called to create a widget instance.

This is an important distinction to understand. In most cases, the @magicgui decorator is useful for interactive use or rapid prototyping. But if you are writing a library or package where someone else will be instantiating your widget (a napari plugin is a good example), you will likely want to use magic_factory instead, (or create your own Widget Container subclass).

it's just a partial

If you're familiar with functools.partial, you can think of magic_factory as a partial function application of the magicgui decorator (in fact, magic_factory is a subclass of partial). It is very roughly equivalent to:

def magic_factory(func, *args, **kwargs):\n    return partial(magicgui, func, *args, **kwargs)\n
"},{"location":"decorators/#widget_init","title":"widget_init","text":"

magic_factory gains one additional parameter: widget_init. This accepts a callable that will be called with the new widget instance each time the factory is called. This is a convenient place to add additional initialization or connect events.

from magicgui import magic_factory\n\ndef _on_init(widget):\n    print(\"widget created!\", widget)\n    widget.y.changed.connect(lambda x: print(\"y changed!\", x))\n\n@magic_factory(widget_init=_on_init)\ndef my_factory(x: int, y: str): ...\n\nnew_widget = my_factory()\n
"},{"location":"decorators/#the-lack-of-magic-in-magicgui","title":"The (lack of) \"magic\" in magicgui","text":"

Just to demystify the name a bit, there really isn't a whole lot of \"magic\" in the magicgui decorator. It's really just a thin wrapper around the magicgui.widgets.create_widget function, to create a Container with a sub-widget for each parameter in the function signature.

The widget creation is very roughly equivalent to something like this:

from inspect import signature, Parameter\nfrom magicgui.widgets import create_widget, Container\nfrom magicgui.types import Undefined\n\n\ndef pseudo_magicgui(func: 'Callable'):\n    return Container(\n        widgets=[\n            create_widget(p.default, annotation=p.annotation, name=p.name)\n            for p in signature(func).parameters.values()\n        ]\n    )\n\ndef some_func(x: int = 2, y: str = 'hello'):\n    return x, y\n\nmy_widget = pseudo_magicgui(some_func)\nmy_widget.show()\n

In the case of magicgui, a special subclass of Container (FunctionGui) is used, which additionally adds a __call__ method that allows the widget to behave like the original function.

"},{"location":"events/","title":"Events","text":"

All magicgui widgets emit events when certain properties change. For each event there is a corresponding signal attribute on the widget that can be connected to a callback function. For example, a PushButton emits an event when it is clicked, and all ValueWidget subclasses (like Slider or LineEdit) emit an event when their value changes.

"},{"location":"events/#connecting-to-events","title":"Connecting to events","text":"

To connect a callback to an event, use the connect method of the signal attribute. The exact signals available on each widget are mostly defined in the base classes, and are listed on the API page for each respective widget.

For example, to connect a callback to a LineEdit widget's changed event:

Widget APImagicgui decoratormagic_factory decorator
from magicgui import widgets\n\ntext = widgets.LineEdit(value='type something')\ntext.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n
from magicgui import magicgui\n\n@magicgui\ndef my_function(text: str):\n    ...\n\nmy_function.text.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n
from magicgui import magic_factory\n\ndef _on_init(widget):\n    widget.text.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n\n@magic_factory(widget_init=_on_init)\ndef my_function(text: str):\n    ...\n\nmy_widget = my_function()\n

It's all psygnal under the hood

magicgui uses psygnal for its event system. For greater detail on the connect method and its options, see the Usage section of psygnal's documentation, or the psygnal.SignalInstance.connect API reference.

Tip

Note that connect returns the callable that it was passed, so you can use it as a decorator if you prefer.

text = widgets.LineEdit(value='type something')\n\n# this works\ntext.changed.connect(lambda val: print(f\"Text changed to: {val}\"))\n\n# so does this\n@text.changed.connect\ndef on_text_changed(val):\n    print(f\"Text changed to: {val}\")\n
"},{"location":"installation/","title":"Installation","text":"

magicgui is a pure Python package, and can be installed with pip:

pip install magicgui\n

or with conda:

conda install -c conda-forge magicgui\n
"},{"location":"installation/#backends","title":"Backends","text":"

magicgui requires a backend to be installed in order to function, but it does not specify a particular backend by default. The following backends are available:

  • PyQt5: pip install magicgui[pyqt5]
  • PyQt6: pip install magicgui[pyqt6]
  • PySide2: pip install magicgui[pyside2]
  • PySide6: pip install magicgui[pyside6]
  • Jupyter Widgets: pip install magicgui[jupyter]

Important

Note not all widgets are necessarily implemented for all backends. Most widgets in the widget docs specify which backends are supported.

"},{"location":"installation/#extras","title":"Extras","text":"

The Image widget requires pillow. You may use the image extra:

pip install magicgui[image]\n

The magicgui.tqdm module requires tqdm. You may use the tqdm extra:

pip install magicgui[tqdm]\n

The QuantityEdit widget requires pint. You may use the quantity extra:

pip install magicgui[quantity]\n
"},{"location":"type_map/","title":"Type Hints to Widgets","text":"

One of the key offerings of magicgui is the ability to automatically generate Widgets from Python type hints. This page describes how type hints are mapped to Widgets, and how to customize that mapping.

"},{"location":"type_map/#default-type-mapping","title":"Default Type Mapping","text":"

By default, The following python Type Hint annotations are mapped to the corresponding Widget class, and parametrized with the corresponding kwargs (when applicable):

Type Hint Widget __init__ kwargs bool Slider int Slider float FloatSlider str LineEdit range RangeEdit slice SliceEdit list ListEdit tuple TupleEdit pathlib.Path FileEdit os.PathLike FileEdit Sequence[pathlib.Path] FileEdit {'mode': 'rm'} datetime.time TimeEdit datetime.timedelta TimeEdit datetime.date DateEdit datetime.datetime DateTimeEdit Literal['a', 'b'] ComboBox {'choices': ['a', 'b']} Set[Literal['a', 'b']] Select {'choices': ('a', 'b')} enum.Enum ComboBox {'choices': <enum 'Enum'>} magicgui.widgets.ProgressBar ProgressBar {'bind': <function match_type.<locals>.<lambda> at 0x13bded8a0>, 'visible': True} types.FunctionType FunctionGui {'function': ...} pint.Quantity QuantityEdit"},{"location":"type_map/#example","title":"Example","text":"

from magicgui import widgets\nimport pathlib\nimport os\nimport datetime\nfrom typing import Literal, Set, Sequence\nimport types\nimport pint\nimport enum\n\ntypes = [\n    bool, int, float, str, range, slice, list,\n    pathlib.Path, os.PathLike, Sequence[pathlib.Path],\n    datetime.time, datetime.timedelta, datetime.date, datetime.datetime,\n    Literal['a', 'b'], Set[Literal['a', 'b']], enum.Enum,\n    widgets.ProgressBar, pint.Quantity,\n]\n\nwdg = widgets.Container(\n    widgets=[\n        widgets.create_widget(annotation=t, label=str(t)) for t in types\n    ]\n)\nwdg.show()\n

"},{"location":"type_map/#customizing-widget-options-with-typingannotated","title":"Customizing Widget Options with typing.Annotated","text":"

Widget options and types may be embedded in the type hint itself using typing.Annotated.

Note

This is not the only way to customize the widget type or options in magicgui. Some functions (like magicgui.magicgui) also accept **param_options keyword arguments that map parameter names to dictionaries of widget options.

"},{"location":"type_map/#overriding-the-default-type","title":"Overriding the Default Type","text":"

To override the widget class used for a given object type, use the widget_type key in the Annotated kwargs. It can be either the string name of one of the built-in widgets, or any Widget subclass object.

Type Hint Widget __init__ kwargs Annotated[int, {'widget_type': 'Slider'}] Slider Annotated[float, {'widget_type': 'FloatSlider'}] FloatSlider"},{"location":"type_map/#overriding-the-default-options","title":"Overriding the Default Options","text":"

Any additional kwargs will be passed to the widget constructor (and must be valid for the corresponding widget type).

Type Hint Widget __init__ kwargs Annotated[int, {'step': 10, 'max': 50}] Slider {'step': 10, 'max': 50} Annotated[int, {'choices': [1, 2, 3]}] Slider {'choices': [1, 2, 3]}"},{"location":"type_map/#examples","title":"Examples","text":"

Create a widget using standard type map:

create_widgetmagicgui decoratorguiclass decorator
my_widget = widgets.create_widget(value=42, annotation=int)\n
from magicgui import magicgui\n\n@magicgui\ndef my_widget(x: int = 42):\n    return x\n
from magicgui.experimental import guiclass\n\n@guiclass\nclass MyObject:\n    x: int = 42\n\nobj = MyObject()\nmy_widget = obj.gui\n

Customize a widget using typing.Annotated:

create_widgetmagicgui decoratorguiclass decorator
from typing import Annotated\n\nInt10_50 = Annotated[int, (('widget_type', 'Slider'),('step', 10),('max', 50))]\nwdg2 = widgets.create_widget(value=42, annotation=Int10_50)\n
from magicgui import magicgui\nfrom typing import Annotated\n\nInt10_50 = Annotated[int, (('widget_type', 'Slider'),('step', 10),('max', 50))]\n\n@magicgui\ndef my_widget(x: Int10_50 = 42):\n    ...\n
from magicgui.experimental import guiclass\nfrom typing import Annotated\n\nInt10_50 = Annotated[int, (('widget_type', 'Slider'),('step', 10),('max', 50))]\n\n@guiclass\nclass MyObject:\n    x: Int10_50 = 42\n\nobj = MyObject()\nmy_widget = obj.gui\n

Note that you may also customize widget creation with kwargs to create_widget

from typing import Annotated\nfrom magicgui.widgets import Slider\n\noptions = {'step': 10, 'max': 50}\nwdg3 = widgets.create_widget(value=42, widget_type=Slider, options=options)\nwdg3.show()\n

... or to the magicgui decorator:

@magicgui(x={'widget_type': 'Slider', 'step': 10, 'max': 50})\ndef my_widget(x: int = 42):\n    ...\n\nmy_widget.show()\n

"},{"location":"type_map/#return-type-mapping","title":"Return Type Mapping","text":"

In some cases, magicgui may be able to create a widget for the return annotation of a function.

... more to come ...

"},{"location":"type_map/#postponed-annotations","title":"Postponed annotations","text":"

Using forward references and __future__.annotations with magicgui is possible, but requires some extra care. Read on for more details.

"},{"location":"type_map/#forward-references","title":"Forward References","text":"

When a type hint contains names that have not been defined yet, that definition may be expressed as a string literal, to be resolved later. This is called a Forward Reference (see PEP 484). This is useful when you want to use a type hint that refers to a type that has not yet been defined, or when you want to avoid importing a type that is only used in a type hint.

from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from mymodule import MyType\n\ndef my_function(x: 'MyType') -> None:\n    ...\n
"},{"location":"type_map/#__future__annotations","title":"__future__.annotations","text":"

In Python 3.7, the __future__.annotations feature was introduced (PEP 563), which postpones the evaluation of type annotations. The effect of this is that no type annotations will be evaluated at definition time, and all type annotations will be treated as strings (regardless of whether they are enclosed in quotes or not).

from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from mymodule import MyType\n\n# no longer necessary to use quotes around 'MyType'\ndef my_function(x: MyType) -> None:\n    ...\n

While this is a useful feature for developers, it does make it significantly more difficult to use those type annotations at runtime.

Magicgui does attempt to resolve forward references it encounters (see Resolving type hints at runtime for gory details), but this is an imperfect process, and may not always work.

"},{"location":"type_map/#if-you-must-use-postponed-annotations","title":"If You Must Use Postponed Annotations","text":"

As a general rule, if you must use forward references or __future__.annotations in a module that uses magicgui, you should:

  • don't use typing syntax that is not valid for ALL python versions you wish to support (e.g. str | int instead of Union[str, int] in python < 3.10), as these will raise an exception when magicgui attempts to evaluate them at runtime.
  • use fully qualified names for all type hints, as these will be easier for magicgui to resolve without user-supplied namespaces.

    from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    import mymodule\n\n# this is easier for magicgui to resolve\ndef my_function(x: mymodule.MyType) -> None:\n    ...\n
"},{"location":"type_map/#registering-support-for-custom-types","title":"Registering Support for Custom Types","text":"

Any third-party library may use the magicgui.register_type function to register its types with magicgui. When a registered type is used as an annotation, the registered widget will be used.

"},{"location":"type_map/#known-third-party-support-for-magicgui","title":"Known Third-Party Support for magicgui","text":"

Hi developer!

Have a library that registers types with magicgui? Let us know and we'll add it to this list!

"},{"location":"type_map/#napari","title":"napari","text":"

napari has registered a number of its types to provide access to napari-specific objects using type annotations in magicgui. Details may be found in napari's documentation on using magicgui in napari.

"},{"location":"widgets/","title":"Widgets","text":"

Tip

If you're looking for an index of all available widgets, see the Widget Index.

All individual graphical elements in magicgui are \"widgets\", and all widgets are instances of magicgui.widgets.Widget. Widgets may be created directly:

from magicgui.widgets import LineEdit\n\nline_edit = LineEdit(value='hello!')\nline_edit.show()\n

Some widgets (such as magicgui.widgets.Container) are composite widgets that comprise other widgets:

from magicgui.widgets import LineEdit, SpinBox, Container\n\nline_edit = LineEdit(value='hello!')\nspin_box = SpinBox(value=400)\ncontainer = Container(widgets=[line_edit, spin_box])\ncontainer.show()\n

magicgui provides a way to automatically select a widget given a python value or type annotation using magicgui.widgets.create_widget. Here is an example that yields the same result as the one above:

from magicgui.widgets import create_widget\n\nx = 'hello!'\ny = 400\ncontainer = Container(widgets=[create_widget(i) for i in (x, y)])\ncontainer.show()\n

Tip

Because there are often multiple valid widget types for a given python object, you may sometimes wish to create widgets directly, or use the widget_type argument in create_widget()

"},{"location":"widgets/#the-widget-hierarchy","title":"The widget hierarchy","text":"
graph TB\n    A([Widget])-->B([ValueWidget])\n    A-->C([ContainerWidget])\n    B-->D([RangedWidget])\n    B-->E([ButtonWidget])\n    B-->F([CategoricalWidget])\n    C-->H([MainWindowWidget])\n    C-->G([FunctionGui])\n    D-->I([SliderWidget])\n    click A \"#widget\"\n    click B \"#valuewidget\"\n    click C \"#containerwidget\"\n    click D \"#rangedwidget\"\n    click E \"#buttonwidget\"\n    click F \"#categoricalwidget\"\n    click H \"#mainwindowwidget\"\n    click G \"#functiongui\"\n    click I \"#sliderwidget\"

Many widgets present similar types of information in different ways. magicgui tries to maintain a consistent API among all types of widgets that are designed to represent similar objects. The general class of widget you are working with will determine the properties and attributes it has.

Note

The categories shown below are sorted by their base class (such as ValueWidget and RangedWidget). The bases are not intended to be instantiated directly. Instead, you would create the widget type you wanted, such as LineEdit or SpinBox, respectively.

"},{"location":"widgets/#widget","title":"Widget","text":"

As mentioned above, all magicgui widgets derive from magicgui.widgets.Widget and have the following attributes (this list is not comprehensive, see the magicgui.widgets.Widget API):

Attribute Type Description name str The name or \"ID\" of this widget (such as a function parameter name to which this widget corresponds). annotation Any A type annotation for the value represented by the widget. label str A string to use for an associated Label widget (if this widget is being shown in a magicgui.widgets.Container widget, and container.labels is True). By default, name will be used. Note: name refers the name of the parameter, as might be used in a signature, whereas label is just the label for that widget in the GUI. tooltip str A tooltip to display when hovering over the widget. visible bool Whether the widget is visible."},{"location":"widgets/#valuewidget","title":"ValueWidget","text":"

In addition to the base Widget properties mentioned above, the following ValueWidgets track some value:

Widget Description Label A non-editable text display. LineEdit A one-line text editor. LiteralEvalLineEdit A one-line text editor that evaluates strings as python literals. Password A one-line text editor that obscures input. TextEdit A widget to edit and display both plain and rich text. FileEdit A LineEdit widget with a button that opens a FileDialog. RangeEdit A widget to represent a python range object, with start/stop/step. SliceEdit A widget to represent slice objects, with start/stop/step. DateTimeEdit A widget for editing dates and times. DateEdit A widget for editing dates. TimeEdit A widget for editing times. Table A widget to represent columnar or 2D data with headers. QuantityEdit A combined LineEdit and ComboBox to edit a pint.Quantity. Attribute Type Description value Any The current value of the widget. changed psygnal.SignalInstance A psygnal.SignalInstance that will emit an event when the value has changed. Connect callbacks to the change event using widget.changed.connect(callback) bind Any, optional A value or callback to bind this widget. If bound, whenever widget.value is accessed, the value provided here will be returned. The bound value can be a callable, in which case bound_value(self) will be returned (i.e. your callback must accept a single parameter, which is this widget instance.). see ValueWidget.bind for details.

Here is a demonstration of all these:

from magicgui import widgets\nimport datetime\n\nwdg_list = [\n    widgets.Label(value=\"label value\", label=\"Label:\"),\n    widgets.LineEdit(value=\"line edit value\", label=\"LineEdit:\"),\n    widgets.Password(value=\"super-secret!\", label=\"Password:\"),\n    widgets.TextEdit(value=\"text edit value...\", label=\"TextEdit:\"),\n    widgets.FileEdit(value=\"/home\", label=\"FileEdit:\"),\n    widgets.RangeEdit(value=range(0, 10, 2), label=\"RangeEdit:\"),\n    widgets.SliceEdit(value=slice(0, 10, 2), label=\"SliceEdit:\"),\n    widgets.DateTimeEdit(\n      value=datetime.datetime(1999, 12, 31, 11, 30), label=\"DateTimeEdit:\"\n    ),\n    widgets.DateEdit(value=datetime.date(81, 2, 18), label=\"DateEdit:\"),\n    widgets.TimeEdit(value=datetime.time(12, 20), label=\"TimeEdit:\"),\n    widgets.QuantityEdit(value='12 seconds', label=\"Quantity:\")\n]\ncontainer = widgets.Container(widgets=wdg_list)\ncontainer.max_height = 300\ncontainer.show()\n

"},{"location":"widgets/#rangedwidget","title":"RangedWidget","text":"

RangedWidgets are numerical ValueWidgets that have a restricted range of valid values, and a step size. RangedWidgets include:

Widget Description SpinBox A widget to edit an integer with clickable up/down arrows. FloatSpinBox A widget to edit a float with clickable up/down arrows.

In addition to all of the ValueWidget attributes, RangedWidget attributes include:

Attribute Type Description min float The minimum allowable value, by default 0 max float The maximum allowable value, by default 1000 step float The step size for incrementing the value, by default 1 range tuple of float A convenience attribute for getting/setting the (min, max) simultaneously

w1 = widgets.SpinBox(value=10, max=20, label='SpinBox:')\nw2 = widgets.FloatSpinBox(value=380, step=0.5, label='FloatSpinBox:')\ncontainer = widgets.Container(widgets=[w1, w2])\ncontainer.show()\n

"},{"location":"widgets/#sliderwidget","title":"SliderWidget","text":"

SliderWidgets are special RangedWidgets that additionally have an orientation, and a readout.

Widget Description Slider A slider widget to adjust an integer value within a range. FloatSlider A slider widget to adjust an integer value within a range. LogSlider A slider widget to adjust a numerical value logarithmically within a range. ProgressBar A progress bar widget.

In addition to all of the RangedWidget attributes, SliderWidget attributes include:

Attribute Type Description orientation str The orientation for the slider. Must be either 'horizontal' or 'vertical'. by default 'horizontal' readout bool Whether to show the value of the slider. By default, True.

w1 = widgets.Slider(value=10, max=25, label='Slider:')\nw2 = widgets.FloatSlider(value=10.5, max=18.5, label='FloatSlider:')\nw3 = widgets.ProgressBar(value=80, max=100, label='ProgressBar:')\ncontainer = widgets.Container(widgets=[w1, w2, w3])\ncontainer.show()\n

"},{"location":"widgets/#buttonwidget","title":"ButtonWidget","text":"

ButtonWidgets are boolean ValueWidgets that also have some text associated with them.

Widget Description PushButton A clickable command button. CheckBox A checkbox with a text label.

In addition to all of the ValueWidget attributes, ButtonWidget attributes include:

Attribute Type Description text str The text to display on the button. If not provided, will use name.

w1 = widgets.PushButton(value=True, text='PushButton Text')\nw2 = widgets.CheckBox(value=False, text='CheckBox Text')\ncontainer = widgets.Container(widgets=[w1, w2])\ncontainer.show()\n

"},{"location":"widgets/#categoricalwidget","title":"CategoricalWidget","text":"

CategoricalWidget are ValueWidgets that provide a set of valid choices. They can be created from:

  • an enum.Enum
  • an iterable of objects (or an iterable of 2-tuples (name, object))
  • a callable that returns an enum.Enum or an iterable
  • a typing.Literal annotation.
Widget Description ComboBox A dropdown menu, allowing selection between multiple choices. RadioButtons An exclusive group of radio buttons, providing a choice from multiple choices. Select A list of options, allowing selection between multiple choices.

In addition to all of the ValueWidget attributes, CategoricalWidget attributes include:

Attribute Type Description choices Enum, Iterable, or Callable Available choices displayed in the widget. value Any In the case of a CategoricalWidget the value is the data of the currently selected choice (see also: current_choice below). current_choice str The name associated with the current choice. For instance, if choices was provided as choices=[('one', 1), ('two', 2)], then an example value would be 1, and an example current_choice would be 'one'.

choices = ['one', 'two', 'three']\nw1 = widgets.ComboBox(choices=choices, value='two', label='ComboBox:')\nw2 = widgets.RadioButtons(choices=choices, label='RadioButtons:')\nw3 = widgets.Select(choices=choices, label='Select:')\ncontainer = widgets.Container(widgets=[w1, w2, w3])\ncontainer.max_height = 220\ncontainer.show()\n

"},{"location":"widgets/#containerwidget","title":"ContainerWidget","text":"

A ContainerWidget is a list-like Widget that can contain other widgets. Containers allow you to build more complex widgets from sub-widgets. A notable example of a Container is magicgui.widgets.FunctionGui) (the product of the @magicgui decorator).

Widget Description Container A Widget to contain other widgets. MainWindow A Widget to contain other widgets, includes a menu bar. FunctionGui Wrapper for a container of widgets representing a callable object. Attribute Type Description layout str The layout for the container. Must be either 'horizontal' or 'vertical'. widgets Sequence[Widget] The widgets that the container contains. labels bool Whether each widget should be shown with a corresponding Label widget to the left. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

Container implements the full collections.abc.MutableSequence interface. You can add and remove widgets from it just as you would add or remove items from a list.

from magicgui.widgets import Container, Slider, FloatSlider, ProgressBar\n\ncontainer = widgets.Container()\ncontainer.append(widgets.LineEdit(value='Mookie', label='Your Name:'))\ncontainer.append(widgets.FloatSlider(value=10.5, label='FloatSlider:'))\ncontainer.show()\n

"},{"location":"widgets/#mainwindowwidget","title":"MainWindowWidget","text":"

A MainWindowWidget is a special type of ContainerWidget that also includes a menu bar.

"},{"location":"widgets/#functiongui","title":"FunctionGui","text":"

A FunctionGui is a special type of ContainerWidget that is created from a function. It is the product of the @magicgui decorator. It is a container that contains a widget for each of the parameters in the function. See magicgui.widgets.FunctionGui for details.

"},{"location":"widgets/#magicgui","title":"@magicgui","text":"

It's worth noting that @magicgui and @magic_factory decorators are just conveniences that build a special type of Container widget (a FunctionGui), with a widget representing each of the parameters in a decorated function.

from magicgui import magicgui\n\n@magicgui\ndef my_function(x='hello', y=400): ...\n\nmy_function.show()\n

In terms of simply building widgets, the following code performs a similar task to @magicgui.

from inspect import signature\n\ndef my_function(x='hello', y=400):\n  ...\n\nparams = signature(my_function).parameters.values()\ncontainer = Container(\n    widgets=[create_widget(p.default, name=p.name) for p in params]\n)\ncontainer.show()\n

Tip

Note that the FunctionGui widget produced by @magicgui is actually a callable object that behaves very much like the original function, except that it will use current values from the GUI as default parameters when calling the function.

"},{"location":"api/app/","title":"Application","text":""},{"location":"api/app/#magicgui.application.Application","title":"magicgui.application.Application","text":"

Magicgui Application, wrapping a native BaseApplicationBackend implementation.

"},{"location":"api/app/#magicgui.application.Application.backend_module","title":"backend_module: ModuleType property","text":"

Return module object that defines the backend.

"},{"location":"api/app/#magicgui.application.Application.backend_name","title":"backend_name: str property","text":"

Return name of the GUI backend that this app wraps.

"},{"location":"api/app/#magicgui.application.Application.native","title":"native: Any property","text":"

Return the native GUI application instance.

"},{"location":"api/app/#magicgui.application.Application.__enter__","title":"__enter__() -> Application","text":"

Context manager to start this application.

"},{"location":"api/app/#magicgui.application.Application.__exit__","title":"__exit__(*exc_details: Any) -> None","text":"

Exit context manager for this application.

"},{"location":"api/app/#magicgui.application.Application.__repr__","title":"__repr__() -> str","text":"

Return repr for this instance.

"},{"location":"api/app/#magicgui.application.Application.create","title":"create() -> None","text":"

Create the native application.

"},{"location":"api/app/#magicgui.application.Application.get_obj","title":"get_obj(name: str) -> Any","text":"

Get the backend object for the given name (such as a widget).

"},{"location":"api/app/#magicgui.application.Application.process_events","title":"process_events() -> None","text":"

Process all pending GUI events.

"},{"location":"api/app/#magicgui.application.Application.quit","title":"quit() -> None","text":"

Quit the native GUI event loop.

"},{"location":"api/app/#magicgui.application.Application.run","title":"run() -> None","text":"

Enter the native GUI event loop.

"},{"location":"api/app/#magicgui.application.Application.start_timer","title":"start_timer(interval: int = 1000, on_timeout: Callable[[], None] | None = None, single_shot: bool = False) -> None","text":"

Start a timer with a given interval, optional callback, and single_shot.

"},{"location":"api/app/#magicgui.application.use_app","title":"magicgui.application.use_app(app: AppRef | None = None) -> Application","text":"

Get/create the default Application object. See _use_app docstring.

"},{"location":"api/experimental/","title":"magicgui.experimental","text":"

Experimental

This module contains experimental features that are not yet ready for prime time. All of the features in this module are subject to change without warning or deprecation.

"},{"location":"api/experimental/#magicgui.experimental.guiclass","title":"magicgui.experimental.guiclass(cls: T | None = None, *, gui_name: str = 'gui', events_namespace: str = 'events', follow_changes: bool = True, **dataclass_kwargs: Any) -> T | Callable[[T], T]","text":"

Turn class into a dataclass with a property (gui_name) that returns a gui.

This decorator is similar to dataclasses.dataclass, but it will also add an events attribute to the class that is an instance of psygnal.SignalGroup (with a signal for each field in the dataclass; see https://psygnal.readthedocs.io/en/latest/dataclasses/ for details), and a gui property that returns a magicgui widget, bound to the values of the dataclass instance.

Note

This decorator is compatible with dataclasses using slots=True, however, there is a potential for a memory leak that the user should be aware of. If you create a guiclass instance, and then store a reference to its gui, and then delete the instance, the gui will still be bound to the instance, preventing it from being garbage collected. To avoid this, you can call unbind_gui_from_instance(gui, instance) before deleting the instance.

Parameters:

  • cls (type, default: None ) \u2013

    The class to turn into a dataclass.

  • gui_name (str, default: 'gui' ) \u2013

    The name of the property that will return a magicgui widget, by default \"gui\"

  • events_namespace (str, default: 'events' ) \u2013

    The name of the attribute that will be added to the class, by default \"events\". This attribute will be an instance of psygnal.SignalGroup that will be used to connect events to the class.

  • follow_changes (bool, default: True ) \u2013

    If True (default), changes to the dataclass instance will be reflected in the gui, and changes to the gui will be reflected in the dataclass instance.

  • dataclass_kwargs (dict, default: {} ) \u2013

    Additional keyword arguments to pass to dataclasses.dataclass.

Returns:

  • type \u2013

    The dataclass.

Examples:

>>> @guiclass\n... class MyData:\n...     x: int = 0\n...     y: str = 'hi'\n...\n...     @button\n...     def reset(self):\n...         self.x = 0\n...         self.y = 'hi'\n...\n>>> data = MyData()\n>>> data.gui.show()\n
"},{"location":"api/experimental/#magicgui.experimental.button","title":"magicgui.experimental.button(func: F | None = None, **button_kwargs: Any) -> F | Callable[[F], F]","text":"

Add a method as a button to a guiclass, which calls the decorated method.

Parameters:

  • func (callable, default: None ) \u2013

    The method to decorate. If None, returns a decorator that can be applied to a method.

  • button_kwargs (dict, default: {} ) \u2013

    Additional keyword arguments to pass to magicgui.widgets.PushButton.

"},{"location":"api/experimental/#magicgui.experimental.is_guiclass","title":"magicgui.experimental.is_guiclass(obj: object) -> TypeGuard[GuiClassProtocol]","text":"

Return True if obj is a guiclass or an instance of a guiclass.

"},{"location":"api/magic_factory/","title":"magicgui.magic_factory","text":""},{"location":"api/magic_factory/#magicgui.magic_factory","title":"magicgui.magic_factory(function=None, *, layout='vertical', scrollable=False, labels=True, tooltips=True, call_button=None, auto_call=False, result_widget=False, main_window=False, app=None, persist=False, widget_init=None, raise_on_unknown=False, **param_options)","text":"

Return a MagicFactory for function.

magic_factory is nearly identical to the magicgui decorator with the following differences:

  1. Whereas magicgui returns a FunctionGui instance, magic_factory returns a callable that returns a FunctionGui instance. (Technically, it returns an instance of MagicFactory which you behaves exactly like a functools.partial for a FunctionGui instance.)
  2. magic_factory adds a widget_init method: a callable that will be called immediately after the FunctionGui instance is created. This can be used to add additional widgets to the layout, or to connect signals to the widgets.

Important

Whereas decorating a function with magicgui will immediately create a widget instance, magic_factory will not create a widget instance until the decorated object is called. This is often what you want in a library, whereas magicgui is useful for rapid, interactive development.

Parameters:

  • function (Callable, default: None ) \u2013

    The function to decorate. Optional to allow bare decorator with optional arguments. by default None

  • layout (str, default: 'vertical' ) \u2013

    The type of layout to use. Must be horizontal or vertical by default \"vertical\".

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether labels are shown in the widget. by default True

  • tooltips (bool, default: True ) \u2013

    Whether tooltips are shown when hovering over widgets. by default True

  • call_button (bool or str, default: None ) \u2013

    If True, create an additional button that calls the original function when clicked. If a str, set the button text. If None (the default), it defaults to True when auto_call is False, and False otherwise.

  • auto_call (bool, default: False ) \u2013

    If True, changing any parameter in either the GUI or the widget attributes will call the original function with the current settings. by default False

  • result_widget (bool, default: False ) \u2013

    Whether to display a LineEdit widget the output of the function when called, by default False

  • main_window (bool, default: False ) \u2013

    Whether this widget should be treated as the main app window, with menu bar, by default False.

  • app (Application or str, default: None ) \u2013

    A backend to use, by default None (use the default backend.)

  • persist (bool, default: False ) \u2013

    If True, when parameter values change in the widget, they will be stored to disk and restored when the widget is loaded again with persist = True. Call magicgui._util.user_cache_dir() to get the default cache location. By default False.

  • widget_init (callable, default: None ) \u2013

    A function that will be called with the newly created widget instance as its only argument. This can be used to customize the widget after it is created. by default None.

  • raise_on_unknown (bool, default: False ) \u2013

    If True, raise an error if magicgui cannot determine widget for function argument or return type. If False, ignore unknown types. By default False.

  • param_options (dict of dict, default: {} ) \u2013

    Any additional keyword arguments will be used as parameter-specific widget options. Keywords must match the name of one of the arguments in the function signature, and the value must be a dict of keyword arguments to pass to the widget constructor.

Returns:

  • result ( MagicFactory or Callable[[F], MagicFactory] ) \u2013

    If function is not None (such as when this is used as a bare decorator), returns a MagicFactory instance. If function is None such as when arguments are provided like magic_factory(auto_call=True), then returns a function that can be used as a decorator.

Examples:

>>> @magic_factory\n... def my_function(a: int = 1, b: str = 'hello'):\n...     pass\n...\n>>> my_widget = my_function()\n>>> my_widget.show()\n>>> my_widget.a.value == 1  # True\n>>> my_widget.b.value = 'world'\n
"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory","title":"magicgui.type_map._magicgui.MagicFactory","text":"

Bases: partial, Generic[_FGuiVar]

Factory function that returns a FunctionGui instance.

While this can be used directly, (see example below) the preferred usage is via the magicgui.magic_factory decorator.

Examples:

>>> def func(x: int, y: str):\n...     pass\n...\n>>> factory = MagicFactory(function=func, labels=False)\n>>> # factory accepts all the same arguments as magicgui()\n>>> widget1 = factory(call_button=True)\n>>> # can also override magic_kwargs that were provided when creating the factory\n>>> widget2 = factory(auto_call=True, labels=True)\n
"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__name__","title":"__name__: str property","text":"

Pass function name.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__call__","title":"__call__(*args, **kwargs)","text":"

Call the wrapped _magicgui and return a FunctionGui.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__getattr__","title":"__getattr__(name)","text":"

Allow accessing FunctionGui attributes without mypy error.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__new__","title":"__new__(function, *args, magic_class=FunctionGui, widget_init=None, **keywords)","text":"

Create new MagicFactory.

"},{"location":"api/magic_factory/#magicgui.type_map._magicgui.MagicFactory.__repr__","title":"__repr__()","text":"

Return string repr.

"},{"location":"api/magicgui/","title":"magicgui.magicgui","text":""},{"location":"api/magicgui/#magicgui.magicgui","title":"magicgui.magicgui(function=None, *, layout='vertical', scrollable=False, labels=True, tooltips=True, call_button=None, auto_call=False, result_widget=False, main_window=False, app=None, persist=False, raise_on_unknown=False, **param_options)","text":"

Return a FunctionGui for function.

Parameters:

  • function (Callable, default: None ) \u2013

    The function to decorate. Optional to allow bare decorator with optional arguments. by default None

  • layout (str, default: 'vertical' ) \u2013

    The type of layout to use. Must be horizontal or vertical by default \"vertical\".

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether labels are shown in the widget. by default True

  • tooltips (bool, default: True ) \u2013

    Whether tooltips are shown when hovering over widgets. by default True

  • call_button (bool or str, default: None ) \u2013

    If True, create an additional button that calls the original function when clicked. If a str, set the button text. If None (the default), it defaults to True when auto_call is False, and False otherwise.

  • auto_call (bool, default: False ) \u2013

    If True, changing any parameter in either the GUI or the widget attributes will call the original function with the current settings. by default False

  • result_widget (bool, default: False ) \u2013

    Whether to display a LineEdit widget the output of the function when called, by default False

  • main_window (bool, default: False ) \u2013

    Whether this widget should be treated as the main app window, with menu bar, by default False.

  • app (Application or str, default: None ) \u2013

    A backend to use, by default None (use the default backend.)

  • persist (bool, default: False ) \u2013

    If True, when parameter values change in the widget, they will be stored to disk and restored when the widget is loaded again with persist = True. Call magicgui._util.user_cache_dir() to get the default cache location. By default False.

  • raise_on_unknown (bool, default: False ) \u2013

    If True, raise an error if magicgui cannot determine widget for function argument or return type. If False, ignore unknown types. By default False.

  • param_options (dict[str, dict], default: {} ) \u2013

    Any additional keyword arguments will be used as parameter-specific options. Keywords must match the name of one of the arguments in the function signature, and the value must be a dict of keyword arguments to pass to the widget constructor.

Returns:

  • result ( FunctionGui or Callable[[F], FunctionGui] ) \u2013

    If function is not None (such as when this is used as a bare decorator), returns a FunctionGui instance, which is a list-like container of autogenerated widgets corresponding to each parameter in the function. If function is None such as when arguments are provided like magicgui(auto_call=True), then returns a function that can be used as a decorator.

Examples:

>>> @magicgui\n... def my_function(a: int = 1, b: str = 'hello'):\n...     pass\n...\n>>> my_function.show()\n>>> my_function.a.value == 1  # True\n>>> my_function.b.value = 'world'\n
"},{"location":"api/migration/","title":"migration guide","text":""},{"location":"api/migration/#v030-migration-guide","title":"v0.3.0 migration guide","text":"

October, 2021

Version 0.3.0 of magicgui introduced some changes to the events and callbacks API. See https://github.com/pyapp-kit/magicgui/pull/253 for details

"},{"location":"api/migration/#callbacks-now-receive-the-value-directly-instead-of-an-event-object","title":"Callbacks now receive the value directly, instead of an Event object","text":"

magicgui 0.3.0 is now using psygnal as its event/callback handler.

Callbacks connected to widget.changed (and other event emitters) may now receive the value(s) directly, instead of an event object:

\ud83d\udc4e Old Method (< v0.3.0)
@widget.changed.connect\ndef my_callback(event):\n    # event was an `Event` object with a `value` attribute\n    new_value = event.value\n

Existing code using callbacks with a single positional argument will continue to receive a single Event object (and a warning will be shown, until v0.4.0 where it will become an error).

To silence the warning and opt in to the new pattern of receiving value directly, you can do one of two things:

  1. type hint your single positional argument as anything other than magicgui.events.Event
  2. provide a callback that takes no arguments
\ud83d\udc4d New Method (>= v0.3.0)
@widget.changed.connect\ndef my_callback(new_value: int):\n    ...  # use new_value directly\n\n# or, if you don't need to use new_value\n@widget.changed.connect\ndef my_callback():\n    # something that didn't need the value\n    ...\n
"},{"location":"api/migration/#event-emitters-take-no-keyword-arguments","title":"Event emitters take no keyword arguments","text":"

For the few packages who were manually emitting change events, you should no longer provide the value= keyword when emitting.

\ud83d\udc4e Old Method (< v0.3.0)
widget.changed(value='whatever')\n
\ud83d\udc4d New Method (>= v0.3.0)
widget.changed.emit('whatever')\n# OR (if you prefer the direct __call__ syntax)\nwidget.changed('whatever')\n
"},{"location":"api/migration/#v020-migration-guide","title":"v0.2.0 migration guide","text":"

December, 2020

Version 0.2.0 of magicgui was a complete rewrite that introduced a couple breaking API changes

"},{"location":"api/migration/#gui-attribute-removed","title":".Gui() attribute removed","text":"

Before v0.2.0, the magicgui.magicgui decorator added a Gui attribute to the decorated function that was to be called to instantiate a widget. In v0.2.0 the object returned from the magicgui.magicgui decorator is already an instantiated magicgui.widgets.Widget.

\ud83d\udc4e Old Method (< v0.2.0)
from magicgui import magicgui, event_loop\n\n@magicgui\ndef function(x, y):\n    ...\n\nwith event_loop():\n    gui = function.Gui(show=True)\n
\ud83d\udc4d New Method (>= v0.2.0)
from magicgui import magicgui\n\n@magicgui\ndef function(x, y):\n    ...\n\nfunction.show(run=True)\n
"},{"location":"api/migration/#new-base-widget-type","title":"New base widget type","text":"

Before v0.2.0, the Gui() object returned by the magicgui.magicgui decorator was a MagicGuiBase widget class, which in turn was a direct subclass of a backend widget, such as a QtWidgets.QWidget. In v0.2.0, all widgets derive from [magicgui.widgets.Widget``][magicgui.widgets.Widget], and the *backend* is available atwidget.native. If you are incorporating magicgui widgets into a larger Qt-based GUI, please note that you will want to usewidget.nativeinstead ofwidget`

from magicgui import magicgui, use_app\n\nuse_app('qt')\n\n@magicgui\ndef function(x, y):\n    ...\n
>>> print(type(function))\n<class 'magicgui.widgets.FunctionGui'>\n>>> print(type(function.native))\n<class 'PyQt5.QtWidgets.QWidget'>\n
"},{"location":"api/migration/#starting-the-application","title":"Starting the application","text":"

It is now easier to show a widget and start an application by calling widget.show(run=True). Calling show(run=True) will immediately block execution of your script and show the widget. If you wanted to (for instance) show multiple widgets next to each other, then you would still want to use the event_loop context manager:

from magicgui import magicgui, event_loop\n\n@magicgui\ndef function_a(x=1, y=3):\n    ...\n\n@magicgui\ndef function_b(z='asdf'):\n    ...\n\nwith event_loop():\n    function_a.show()\n    function_b.show()\n# both widgets will show (though b may be on top of a)\n
"},{"location":"api/migration/#getting-and-setting-values","title":"Getting and setting values","text":"

To get or set the value of a widget programmatically, you no longer set the corresponding widget attribute directly, but rather use the widget.value attribute:

Old Method \ud83d\udc4e

gui.x used to be a descriptor object to get/set the value, but the actual underlying widget was at gui.x_widget

gui = function.Gui()\ngui.x = 10\n

New Method \ud83d\udc4d

now function.x IS the widget, and you set its value with function.x.value

function.x.value = 10\n
"},{"location":"api/migration/#connecting-callbacks-to-events","title":"Connecting callbacks to events","text":"

When binding callbacks to change events, you no longer connect to gui.<name>_changed, you now connect to function.<name>.changed:

\ud83d\udc4e Old Method (< v0.2.0)
gui = function.Gui()\ngui.x_changed.connect(my_callback)\n
\ud83d\udc4d New Method (>= v0.2.0)
function.x.changed.connect(my_callback)\n
"},{"location":"api/migration/#renamed","title":"Renamed","text":"
  • Widget.refresh_choices has been renamed to Widget.reset_choices.

  • @magicgui(result=True) has been renamed to @magicgui(result_widget=True)

"},{"location":"api/protocols/","title":"Backend Protocols","text":"

Advanced Topic

Most users of magicgui will not need to worry about this section.

These Protocol classes declare the interface that backend adapters must implement in order to be used by magicgui. All magicgui Widget objects compose a backend widget implementing one of these protocols, and control it using the methods defined herein.

magicgui developers may be interested in this page, but end-users needn't worry about it.

"},{"location":"api/protocols/#summary","title":"Summary","text":"Widget Description WidgetProtocol Base Widget Protocol: specifies methods that all widgets must provide. ValueWidgetProtocol Widget that has a current value, with getter/setter and on_change callback. ButtonWidgetProtocol The \"value\" in a ButtonWidget is the current (checked) state. TableWidgetProtocol ValueWidget subclass intended for 2D tabular data, with row & column headers. RangedWidgetProtocol Value widget that supports numbers within a provided min/max range. CategoricalWidgetProtocol Categorical widget, that has a set of valid choices, and a current value. SliderWidgetProtocol Protocol for implementing a slider widget. ContainerProtocol Widget that can contain other widgets. BaseApplicationBackend Backend Application object. DialogProtocol Protocol for modal (blocking) containers. SupportsChoices Widget that has a set of valid choices. SupportsOrientation Widget that can be reoriented. SupportsText Widget that have text (in addition to value)... like buttons. SupportsReadOnly Widget that can be read_only."},{"location":"api/protocols/#protocol-inheritance","title":"Protocol Inheritance","text":"

The visual hierarchy of protocols looks like this:

graph LR\n    A([WidgetProtocol])-->B([ValueWidgetProtocol])\n    A-->C([ContainerProtocol])\n    M([SupportsText])-->E\n    B-->E([ButtonWidgetProtocol])\n    B-->D([RangedWidgetProtocol])\n    B-->F([CategoricalWidgetProtocol])\n    D-->I([SliderWidgetProtocol])\n    B-->J([TableWidgetProtocol])\n    K([SupportsReadOnly])-->J([TableWidgetProtocol])\n    L([SupportsChoices])-->F\n    N([SupportsOrientation])-->C\n    N-->I\n    C-->O([DialogProtocol])\n    C-->P([MainWindowProtocol])\n\n    click A \"#magicgui.widgets.protocols.WidgetProtocol\"\n    click B \"#magicgui.widgets.protocols.ValueWidgetProtocol\"\n    click C \"#magicgui.widgets.protocols.ContainerProtocol\"\n    click D \"#magicgui.widgets.protocols.RangedWidgetProtocol\"\n    click E \"#magicgui.widgets.protocols.ButtonWidgetProtocol\"\n    click F \"#magicgui.widgets.protocols.CategoricalWidgetProtocol\"\n    click I \"#magicgui.widgets.protocols.SliderWidgetProtocol\"\n    click J \"#magicgui.widgets.protocols.TableWidgetProtocol\"\n    click K \"#magicgui.widgets.protocols.SupportsReadOnly\"\n    click L \"#magicgui.widgets.protocols.SupportsChoices\"\n    click M \"#magicgui.widgets.protocols.SupportsText\"\n    click N \"#magicgui.widgets.protocols.SupportsOrientation\"\n    click O \"#magicgui.widgets.protocols.DialogProtocol\"\n    click P \"#magicgui.widgets.protocols.MainWindowProtocol\"
"},{"location":"api/protocols/#widget-protocols","title":"Widget Protocols","text":""},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol","title":"magicgui.widgets.protocols.WidgetProtocol","text":"

Bases: Protocol

Base Widget Protocol: specifies methods that all widgets must provide.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_bind_parent_change_callback","title":"_mgui_bind_parent_change_callback(callback: Callable[[Any], None]) -> None abstractmethod","text":"

Bind callback to parent change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_close_widget","title":"_mgui_close_widget() -> None abstractmethod","text":"

Close widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_enabled","title":"_mgui_get_enabled() -> bool abstractmethod","text":"

Get the enabled state of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_height","title":"_mgui_get_height() -> int abstractmethod","text":"

Get the height of the widget.

The intention is to get the height of the widget after it is shown, for the purpose of unifying widget height in a layout. Backends may do what they need to accomplish this. For example, Qt can use sizeHint().height(), since height() may return something large if the widget has not yet been painted on screen.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_max_height","title":"_mgui_get_max_height() -> int abstractmethod","text":"

Get the maximum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_max_width","title":"_mgui_get_max_width() -> int abstractmethod","text":"

Get the maximum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_min_height","title":"_mgui_get_min_height() -> int abstractmethod","text":"

Get the minimum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_min_width","title":"_mgui_get_min_width() -> int abstractmethod","text":"

Get the minimum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_native_widget","title":"_mgui_get_native_widget() -> Any abstractmethod","text":"

Return the native backend widget instance.

This is generally the widget that has the layout.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_parent","title":"_mgui_get_parent() -> Widget abstractmethod","text":"

Return the parent widget of this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_root_native_widget","title":"_mgui_get_root_native_widget() -> Any abstractmethod","text":"

Return the root native backend widget.

In most cases, this is the same as _mgui_get_native_widget. However, in cases where the native widget is in a scroll layout, this might be different.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_tooltip","title":"_mgui_get_tooltip() -> str abstractmethod","text":"

Get the tooltip for this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_visible","title":"_mgui_get_visible() -> bool abstractmethod","text":"

Get widget visibility.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_get_width","title":"_mgui_get_width() -> int abstractmethod","text":"

Get the width of the widget.

The intention is to get the width of the widget after it is shown, for the purpose of unifying widget width in a layout. Backends may do what they need to accomplish this. For example, Qt can use sizeHint().width(), since width() may return something large if the widget has not yet been painted on screen.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_render","title":"_mgui_render() -> np.ndarray abstractmethod","text":"

Return an RGBA (MxNx4) numpy array bitmap of the rendered widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_enabled","title":"_mgui_set_enabled(enabled: bool) -> None abstractmethod","text":"

Set the enabled state of the widget to enabled.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_height","title":"_mgui_set_height(value: int) -> None abstractmethod","text":"

Set the height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_max_height","title":"_mgui_set_max_height(value: int) -> None abstractmethod","text":"

Set the maximum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_max_width","title":"_mgui_set_max_width(value: int) -> None abstractmethod","text":"

Set the maximum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_min_height","title":"_mgui_set_min_height(value: int) -> None abstractmethod","text":"

Set the minimum height of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_min_width","title":"_mgui_set_min_width(value: int) -> None abstractmethod","text":"

Set the minimum width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_parent","title":"_mgui_set_parent(widget: Widget) -> None abstractmethod","text":"

Set the parent widget of this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_tooltip","title":"_mgui_set_tooltip(value: str | None) -> None abstractmethod","text":"

Set a tooltip for this widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_visible","title":"_mgui_set_visible(value: bool) -> None abstractmethod","text":"

Set widget visibility.

"},{"location":"api/protocols/#magicgui.widgets.protocols.WidgetProtocol._mgui_set_width","title":"_mgui_set_width(value: int) -> None abstractmethod","text":"

Set the width of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol","title":"magicgui.widgets.protocols.ValueWidgetProtocol","text":"

Bases: WidgetProtocol, Protocol

Widget that has a current value, with getter/setter and on_change callback.

It is worth noting that the widget is the thing that has a value. Magicgui does not maintain & synchronize an independent model.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol._mgui_bind_change_callback","title":"_mgui_bind_change_callback(callback: Callable[[Any], Any]) -> None abstractmethod","text":"

Bind callback to value change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol._mgui_get_value","title":"_mgui_get_value() -> Any abstractmethod","text":"

Get current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ValueWidgetProtocol._mgui_set_value","title":"_mgui_set_value(value: Any) -> None abstractmethod","text":"

Set current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ButtonWidgetProtocol","title":"magicgui.widgets.protocols.ButtonWidgetProtocol","text":"

Bases: ValueWidgetProtocol, SupportsText, SupportsIcon, Protocol

The \"value\" in a ButtonWidget is the current (checked) state.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol","title":"magicgui.widgets.protocols.TableWidgetProtocol","text":"

Bases: ValueWidgetProtocol, SupportsReadOnly, Protocol

ValueWidget subclass intended for 2D tabular data, with row & column headers.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_bind_change_callback","title":"_mgui_bind_change_callback(callback: Callable[[Any], Any]) -> None abstractmethod","text":"

Bind callback to value change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_bind_column_headers_change_callback","title":"_mgui_bind_column_headers_change_callback(callback: Callable[[Any], None]) -> None abstractmethod","text":"

Bind callback to column headers change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_bind_row_headers_change_callback","title":"_mgui_bind_row_headers_change_callback(callback: Callable[[Any], None]) -> None abstractmethod","text":"

Bind callback to row headers change event.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_cell","title":"_mgui_get_cell(row: int, col: int) -> Any abstractmethod","text":"

Get current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_column_count","title":"_mgui_get_column_count() -> int abstractmethod","text":"

Get the number of columns in the table.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_column_headers","title":"_mgui_get_column_headers() -> tuple abstractmethod","text":"

Get current column headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_row_count","title":"_mgui_get_row_count() -> int abstractmethod","text":"

Get the number of rows in the table.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_get_row_headers","title":"_mgui_get_row_headers() -> tuple abstractmethod","text":"

Get current row headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_remove_column","title":"_mgui_remove_column(column: int) -> None abstractmethod","text":"

Remove column at index column.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_remove_row","title":"_mgui_remove_row(row: int) -> None abstractmethod","text":"

Remove row at index row.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_cell","title":"_mgui_set_cell(row: int, col: int, value: Any) -> None abstractmethod","text":"

Set current value of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_column_count","title":"_mgui_set_column_count(ncols: int) -> None abstractmethod","text":"

Set the number of columns in the table. (Create/delete as needed).

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_column_headers","title":"_mgui_set_column_headers(headers: Sequence) -> None abstractmethod","text":"

Set current column headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_row_count","title":"_mgui_set_row_count(nrows: int) -> None abstractmethod","text":"

Set the number of rows in the table. (Create/delete as needed).

"},{"location":"api/protocols/#magicgui.widgets.protocols.TableWidgetProtocol._mgui_set_row_headers","title":"_mgui_set_row_headers(headers: Sequence) -> None abstractmethod","text":"

Set current row headers of the widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol","title":"magicgui.widgets.protocols.RangedWidgetProtocol","text":"

Bases: ValueWidgetProtocol, Protocol

Value widget that supports numbers within a provided min/max range.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_adaptive_step","title":"_mgui_get_adaptive_step() -> bool abstractmethod","text":"

Get adaptive step status.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_max","title":"_mgui_get_max() -> float abstractmethod","text":"

Get the maximum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_min","title":"_mgui_get_min() -> float abstractmethod","text":"

Get the minimum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_get_step","title":"_mgui_get_step() -> float abstractmethod","text":"

Get the step size.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_adaptive_step","title":"_mgui_set_adaptive_step(value: bool) -> None abstractmethod","text":"

Set adaptive step status.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_max","title":"_mgui_set_max(value: float) -> None abstractmethod","text":"

Set the maximum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_min","title":"_mgui_set_min(value: float) -> None abstractmethod","text":"

Set the minimum possible value.

"},{"location":"api/protocols/#magicgui.widgets.protocols.RangedWidgetProtocol._mgui_set_step","title":"_mgui_set_step(value: float) -> None abstractmethod","text":"

Set the step size.

"},{"location":"api/protocols/#magicgui.widgets.protocols.CategoricalWidgetProtocol","title":"magicgui.widgets.protocols.CategoricalWidgetProtocol","text":"

Bases: ValueWidgetProtocol, SupportsChoices, Protocol

Categorical widget, that has a set of valid choices, and a current value.

It adds no additional methods.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol","title":"magicgui.widgets.protocols.SliderWidgetProtocol","text":"

Bases: RangedWidgetProtocol, SupportsOrientation, Protocol

Protocol for implementing a slider widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol._mgui_get_tracking","title":"_mgui_get_tracking() -> bool","text":"

If tracking is False, changed is only emitted when released.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol._mgui_set_readout_visibility","title":"_mgui_set_readout_visibility(visible: bool) -> None","text":"

Set visibility of readout widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SliderWidgetProtocol._mgui_set_tracking","title":"_mgui_set_tracking(tracking: bool) -> None","text":"

If tracking is False, changed is only emitted when released.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol","title":"magicgui.widgets.protocols.ContainerProtocol","text":"

Bases: WidgetProtocol, SupportsOrientation, Protocol

Widget that can contain other widgets.

This generally manages a backend Layout.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_get_margins","title":"_mgui_get_margins() -> tuple[int, int, int, int] abstractmethod","text":"

Get the margins of the container.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_insert_widget","title":"_mgui_insert_widget(position: int, widget: Widget) -> None abstractmethod","text":"

Insert widget at the given position in the layout.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_remove_widget","title":"_mgui_remove_widget(widget: Widget) -> None abstractmethod","text":"

Remove the specified widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.ContainerProtocol._mgui_set_margins","title":"_mgui_set_margins(margins: tuple[int, int, int, int]) -> None abstractmethod","text":"

Set the margins of the container.

"},{"location":"api/protocols/#magicgui.widgets.protocols.DialogProtocol","title":"magicgui.widgets.protocols.DialogProtocol","text":"

Bases: ContainerProtocol, Protocol

Protocol for modal (blocking) containers.

"},{"location":"api/protocols/#magicgui.widgets.protocols.DialogProtocol._mgui_exec","title":"_mgui_exec() -> None abstractmethod","text":"

Show the dialog and block.

"},{"location":"api/protocols/#magicgui.widgets.protocols.MainWindowProtocol","title":"magicgui.widgets.protocols.MainWindowProtocol","text":"

Bases: ContainerProtocol, Protocol

Application main widget.

"},{"location":"api/protocols/#magicgui.widgets.protocols.MainWindowProtocol._mgui_create_menu_item","title":"_mgui_create_menu_item(menu_name: str, action_name: str, callback: Callable | None = None, shortcut: str | None = None) -> None abstractmethod","text":"

Create a new menu item.

Parameters:

  • menu_name (str) \u2013

    The name of the menu to add the item to.

  • action_name (str) \u2013

    The name of the action to add.

  • callback (Callable | None, default: None ) \u2013

    A callback to be called when the action is triggered, by default None.

  • shortcut (str | None, default: None ) \u2013

    A keyboard shortcut for the action, by default None.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices","title":"magicgui.widgets.protocols.SupportsChoices","text":"

Bases: Protocol

Widget that has a set of valid choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_del_choice","title":"_mgui_del_choice(choice_name: str) -> None abstractmethod","text":"

Delete the provided choice_name and associated data.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_choice","title":"_mgui_get_choice(choice_name: str) -> Any abstractmethod","text":"

Get data for a single choice.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_choices","title":"_mgui_get_choices() -> tuple[tuple[str, Any], ...] abstractmethod","text":"

Get available choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_count","title":"_mgui_get_count() -> int abstractmethod","text":"

Return number of choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_get_current_choice","title":"_mgui_get_current_choice() -> str abstractmethod","text":"

Return the text of the currently selected choice.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_set_choice","title":"_mgui_set_choice(choice_name: str, data: Any) -> None abstractmethod","text":"

Set data for choice_name, or add a new item if choice_name doesn't exist.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsChoices._mgui_set_choices","title":"_mgui_set_choices(choices: Iterable[tuple[str, Any]]) -> None abstractmethod","text":"

Set available choices.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsOrientation","title":"magicgui.widgets.protocols.SupportsOrientation","text":"

Bases: Protocol

Widget that can be reoriented.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsOrientation._mgui_get_orientation","title":"_mgui_get_orientation() -> str abstractmethod","text":"

Get orientation, return either 'horizontal' or 'vertical'.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsOrientation._mgui_set_orientation","title":"_mgui_set_orientation(value: str) -> None abstractmethod","text":"

Set orientation, value will be 'horizontal' or 'vertical'.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsText","title":"magicgui.widgets.protocols.SupportsText","text":"

Bases: Protocol

Widget that have text (in addition to value)... like buttons.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsText._mgui_get_text","title":"_mgui_get_text() -> str abstractmethod","text":"

Get text.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsText._mgui_set_text","title":"_mgui_set_text(value: str) -> None abstractmethod","text":"

Set text.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsReadOnly","title":"magicgui.widgets.protocols.SupportsReadOnly","text":"

Bases: Protocol

Widget that can be read_only.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsReadOnly._mgui_get_read_only","title":"_mgui_get_read_only() -> bool abstractmethod","text":"

Get read_only status.

"},{"location":"api/protocols/#magicgui.widgets.protocols.SupportsReadOnly._mgui_set_read_only","title":"_mgui_set_read_only(value: bool) -> None abstractmethod","text":"

Set read_only.

"},{"location":"api/protocols/#application-protocol","title":"Application Protocol","text":""},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend","title":"magicgui.widgets.protocols.BaseApplicationBackend","text":"

Bases: ABC

Backend Application object.

Abstract class that provides an interface between backends and Application. Each backend must implement a subclass of BaseApplicationBackend, and implement all of its _mgui_xxx methods.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_get_backend_name","title":"_mgui_get_backend_name() -> str abstractmethod","text":"

Return the name of the backend.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_get_native_app","title":"_mgui_get_native_app() -> Any abstractmethod","text":"

Return the native GUI application instance.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_process_events","title":"_mgui_process_events() -> None abstractmethod","text":"

Process all pending GUI events.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_quit","title":"_mgui_quit() -> None abstractmethod","text":"

Quit the native GUI event loop.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_run","title":"_mgui_run() -> None abstractmethod","text":"

Start the application.

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_start_timer","title":"_mgui_start_timer(interval: int = 0, on_timeout: Callable[[], None] | None = None, single: bool = False) -> None abstractmethod","text":"

Create and start a timer.

Parameters:

  • interval (int, default: 0 ) \u2013

    Interval between timeouts, by default 0

  • on_timeout (Optional[Callable[[], None]], default: None ) \u2013

    Function to call when timer finishes, by default None

  • single (bool, default: False ) \u2013

    Whether the timer should only fire once, by default False

"},{"location":"api/protocols/#magicgui.widgets.protocols.BaseApplicationBackend._mgui_stop_timer","title":"_mgui_stop_timer() -> None abstractmethod","text":"

Stop timer. Should check for the existence of the timer.

"},{"location":"api/type_map/","title":"magicgui.type_map","text":"Widget Description get_widget_class Return a Widget subclass for the value/annotation. register_type Register a widget_type to be used for all parameters with type type_. type_registered Context manager that temporarily registers a widget type for a given type_. type2callback Return any callbacks that have been registered for type_."},{"location":"api/type_map/#magicgui.type_map.get_widget_class","title":"magicgui.type_map.get_widget_class(value: Any = Undefined, annotation: Any = Undefined, options: dict | None = None, is_result: bool = False, raise_on_unknown: bool = True) -> tuple[WidgetClass, dict]","text":"

Return a Widget subclass for the value/annotation.

Parameters:

  • value (Any, default: Undefined ) \u2013

    A python value. Will be used to determine the widget type if an annotation is not explicitly provided by default None

  • annotation (Optional[Type], default: Undefined ) \u2013

    A type annotation, by default None

  • options (dict, default: None ) \u2013

    Options to pass when constructing the widget, by default {}

  • is_result (bool, default: False ) \u2013

    Identifies whether the returned widget should be tailored to an input or to an output.

  • raise_on_unknown (bool, default: True ) \u2013

    Raise exception if no widget is found for the given type, by default True

Returns:

  • Tuple[WidgetClass, dict] \u2013

    The WidgetClass, and dict that can be used for params. dict may be different than the options passed in.

"},{"location":"api/type_map/#magicgui.type_map.register_type","title":"magicgui.type_map.register_type(type_: _T | None = None, *, widget_type: WidgetRef | None = None, return_callback: ReturnCallback | None = None, **options: Any) -> _T | Callable[[_T], _T]","text":"

Register a widget_type to be used for all parameters with type type_.

Note: registering a Union (or Optional) type effectively registers all types in the union with the arguments.

Parameters:

  • type_ (type, default: None ) \u2013

    The type for which a widget class or return callback will be provided.

  • widget_type (WidgetRef, default: None ) \u2013

    A widget class from the current backend that should be used whenever type_ is used as the type annotation for an argument in a decorated function, by default None

  • return_callback (ReturnCallback | None, default: None ) \u2013

    If provided, whenever type_ is declared as the return type of a decorated function, return_callback(widget, value, return_type) will be called whenever the decorated function is called... where widget is the Widget instance, and value is the return value of the decorated function.

  • options (Any, default: {} ) \u2013

    key value pairs where the keys are valid dict

Raises:

  • ValueError \u2013

    If none of widget_type, return_callback, bind or choices are provided.

"},{"location":"api/type_map/#magicgui.type_map.type_registered","title":"magicgui.type_map.type_registered(type_: _T, *, widget_type: WidgetRef | None = None, return_callback: ReturnCallback | None = None, **options: Any) -> Iterator[None]","text":"

Context manager that temporarily registers a widget type for a given type_.

When the context is exited, the previous widget type associations for type_ is restored.

Parameters:

  • type_ (_T) \u2013

    The type for which a widget class or return callback will be provided.

  • widget_type (Optional[WidgetRef], default: None ) \u2013

    A widget class from the current backend that should be used whenever type_ is used as the type annotation for an argument in a decorated function, by default None

  • return_callback (ReturnCallback | None, default: None ) \u2013

    If provided, whenever type_ is declared as the return type of a decorated function, return_callback(widget, value, return_type) will be called whenever the decorated function is called... where widget is the Widget instance, and value is the return value of the decorated function.

  • options (Any, default: {} ) \u2013

    key value pairs where the keys are valid dict

"},{"location":"api/type_map/#magicgui.type_map.type2callback","title":"magicgui.type_map.type2callback(type_: type) -> list[ReturnCallback]","text":"

Return any callbacks that have been registered for type_.

Parameters:

  • type_ (type) \u2013

    The type_ to look up.

Returns:

  • list of callable \u2013

    Where a return callback accepts two arguments (gui, value) and does something.

"},{"location":"api/widgets/","title":"Widget Index","text":"

Here you will find a list of all the widgets that are available in magicgui. Each widget has a link to its own documentation page, where you can find more information about the widget, including its parameters and events.

Widget Description CheckBox A checkbox with a text label. ComboBox A dropdown menu, allowing selection between multiple choices. Container A Widget to contain other widgets. DateEdit A widget for editing dates. DateTimeEdit A widget for editing dates and times. Dialog A modal container. EmptyWidget A base widget with no value. FileEdit A LineEdit widget with a button that opens a FileDialog. FloatRangeSlider A slider widget to adjust a range defined by two float values within a range. FloatSlider A slider widget to adjust an integer value within a range. FloatSpinBox A widget to edit a float with clickable up/down arrows. FunctionGui Wrapper for a container of widgets representing a callable object. Image A non-editable image display. Label A non-editable text display. LineEdit A one-line text editor. ListEdit A widget to represent a list of values. LiteralEvalLineEdit A one-line text editor that evaluates strings as python literals. LogSlider A slider widget to adjust a numerical value logarithmically within a range. MainFunctionGui Container of widgets as a Main Application Window. MainWindow A Widget to contain other widgets, includes a menu bar. Password A one-line text editor that obscures input. ProgressBar A progress bar widget. PushButton A clickable command button. QuantityEdit A combined LineEdit and ComboBox to edit a pint.Quantity. RadioButton A radio button with a text label. RadioButtons An exclusive group of radio buttons, providing a choice from multiple choices. RangeEdit A widget to represent a python range object, with start/stop/step. RangeSlider A slider widget to adjust a range between two integer values within a range. Select A list of options, allowing selection between multiple choices. SliceEdit A widget to represent slice objects, with start/stop/step. Slider A slider widget to adjust an integer value within a range. SpinBox A widget to edit an integer with clickable up/down arrows. Table A widget to represent columnar or 2D data with headers. TextEdit A widget to edit and display both plain and rich text. TimeEdit A widget for editing times. ToolBar Toolbar that contains a set of controls. TupleEdit A widget to represent a tuple of values."},{"location":"api/widgets/CheckBox/","title":"CheckBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/CheckBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the button is clicked (may also be connected at the alias clicked).
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/CheckBox/#magicgui.widgets.CheckBox","title":"CheckBox","text":"

Bases: ButtonWidget

A checkbox with a text label.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ComboBox/","title":"ComboBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/ComboBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ComboBox/#magicgui.widgets.ComboBox","title":"ComboBox","text":"

Bases: CategoricalWidget

A dropdown menu, allowing selection between multiple choices.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Container/","title":"Container","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Container/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Container/#magicgui.widgets.Container","title":"Container","text":"

Bases: ContainerWidget[WidgetVar]

A Widget to contain other widgets.

Note that `Container` implements the\n[`typing.MutableSequence`][typing.MutableSequence]\ninterface, so you can use it like a list to add and remove widgets.\n

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/DateEdit/","title":"DateEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/DateEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/DateEdit/#magicgui.widgets.DateEdit","title":"DateEdit","text":"

Bases: ValueWidget[date]

A widget for editing dates.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/DateTimeEdit/","title":"DateTimeEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/DateTimeEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/DateTimeEdit/#magicgui.widgets.DateTimeEdit","title":"DateTimeEdit","text":"

Bases: ValueWidget[datetime]

A widget for editing dates and times.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Dialog/","title":"Dialog","text":"

Available in backends: qt

"},{"location":"api/widgets/Dialog/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Dialog/#magicgui.widgets.Dialog","title":"Dialog","text":"

Bases: DialogWidget

A modal container.

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/EmptyWidget/","title":"EmptyWidget","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/EmptyWidget/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget","title":"EmptyWidget","text":"

Bases: ValueWidget

A base widget with no value.

This widget is primarily here to serve as a \"hidden widget\" to which a value or\ncallback can be bound.\n

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget.value","title":"value: Any property writable","text":"

Look for a bound value, otherwise fallback to get_value.

"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget.__repr__","title":"__repr__() -> str","text":"

Return string repr (avoid looking for value).

"},{"location":"api/widgets/EmptyWidget/#magicgui.widgets.EmptyWidget.get_value","title":"get_value() -> Any","text":"

Return value if one has been manually set... otherwise return Param.empty.

"},{"location":"api/widgets/FileEdit/","title":"FileEdit","text":"

Available in backends:

"},{"location":"api/widgets/FileEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit","title":"FileEdit","text":"

Bases: Container

A LineEdit widget with a button that opens a FileDialog.

Parameters:

  • mode (FileDialogMode or str, default: EXISTING_FILE ) \u2013
    • 'r' returns one existing file.
    • 'rm' return one or more existing files.
    • 'w' return one file name that does not have to exist.
    • 'd' returns one existing directory.
  • filter (str, default: None ) \u2013

    The filter is used to specify the kind of files that should be shown. It should be a glob-style string, like '*.png' (this may be backend-specific)

"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit.mode","title":"mode: FileDialogMode property writable","text":"

Mode for the FileDialog.

"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit.value","title":"value: tuple[Path, ...] | Path | None property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/FileEdit/#magicgui.widgets.FileEdit.__repr__","title":"__repr__() -> str","text":"

Return string representation.

"},{"location":"api/widgets/FloatRangeSlider/","title":"FloatRangeSlider","text":"

Available in backends: qt

"},{"location":"api/widgets/FloatRangeSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FloatRangeSlider/#magicgui.widgets.FloatRangeSlider","title":"FloatRangeSlider","text":"

Bases: MultiValuedSliderWidget

A slider widget to adjust a range defined by two float values within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/FloatSlider/","title":"FloatSlider","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/FloatSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FloatSlider/#magicgui.widgets.FloatSlider","title":"FloatSlider","text":"

Bases: SliderWidget[float]

A slider widget to adjust an integer value within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/FloatSpinBox/","title":"FloatSpinBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/FloatSpinBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FloatSpinBox/#magicgui.widgets.FloatSpinBox","title":"FloatSpinBox","text":"

Bases: RangedWidget[float]

A widget to edit a float with clickable up/down arrows.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/FunctionGui/","title":"FunctionGui","text":"

Available in backends:

"},{"location":"api/widgets/FunctionGui/#signals","title":"Signals","text":"
  • called(object) - Emitted with the result after the function is called.
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui","title":"FunctionGui","text":"

Bases: Container, Generic[_P, _R]

Wrapper for a container of widgets representing a callable object.

Parameters:

  • function (Callable) \u2013

    A callable to turn into a GUI

  • call_button (bool | str | None, default: None ) \u2013

    If True, create an additional button that calls the original function when clicked. If a str, set the button text. by default False when auto_call is True, and True otherwise. The button can be accessed from the .call_button property.

  • layout (str, default: 'vertical' ) \u2013

    The type of layout to use. Must be horizontal or vertical by default \"horizontal\".

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether labels are shown in the widget. by default True

  • tooltips (bool, default: True ) \u2013

    Whether tooltips are shown when hovering over widgets. by default True

  • app (Application | str | None, default: None ) \u2013

    A backend to use, by default None (use the default backend.)

  • visible (bool, default: None ) \u2013

    Whether to immediately show the widget. If False, widget is explicitly hidden. If None, widget is not shown, but will be shown if a parent container is shown, by default None.

  • auto_call (bool, default: False ) \u2013

    If True, changing any parameter in either the GUI or the widget attributes will call the original function with the current settings. by default False

  • result_widget (bool, default: False ) \u2013

    Whether to display a LineEdit widget the output of the function when called, by default False

  • param_options (dict, default: None ) \u2013

    A dict of name: widget_options dict for each parameter in the function. Will be passed to magic_signature by default None

  • name (str, default: None ) \u2013

    A name to assign to the Container widget, by default function.__name__

  • persist (bool, default: False ) \u2013

    If True, when parameter values change in the widget, they will be stored to disk (in ~/.config/magicgui/cache) and restored when the widget is loaded again with persist = True. By default, False.

  • raise_on_unknown (bool, default: False ) \u2013

    If True, raise an error if a parameter annotation is not recognized.

Raises:

  • TypeError \u2013

    If unexpected keyword arguments are provided

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__signature__","title":"__signature__: MagicSignature property","text":"

Return a MagicSignature object representing the current state of the gui.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.call_button","title":"call_button: PushButton | None property","text":"

Return the call button.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.call_count","title":"call_count: int property","text":"

Return the number of times the function has been called.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.result_name","title":"result_name: str property writable","text":"

Return a name that can be used for the result of this magicfunction.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.return_annotation","title":"return_annotation: Any property","text":"

Return annotation for inspect.Signature conversion.

ForwardRefs will be resolve when setting the annotation.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__call__","title":"__call__(*args: _P.args, **kwargs: _P.kwargs) -> _R","text":"

Call the original function with the current parameter values from the Gui.

You may pass a update_widget=True keyword argument to update the widget values to match the current parameter values before calling the function.

It is also possible to override the current parameter values from the GUI by providing args/kwargs to the function call. Only those provided will override the ones from the gui. A called signal will also be emitted with the results.

Returns:

  • result ( Any ) \u2013

    whatever the return value of the original function would have been.

Examples:

gui = FunctionGui(func, show=True)\n\n# then change parameters in the gui, or by setting:  gui.param.value = something\n\ngui()  # calls the original function with the current parameters\n
"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__get__","title":"__get__(obj: object, objtype: type | None = None) -> FunctionGui","text":"

Provide descriptor protocol.

This allows the @magicgui decorator to work on a function as well as a method. If a method on a class is decorated with @magicgui, then accessing the attribute on an instance of that class will return a version of the FunctionGui in which the first argument of the function is bound to the instance. (Just like what you'd expect with the @property decorator.)

Returns:

  • bound ( FunctionGui ) \u2013

    A new FunctionGui instance.

Examples:

>>> class MyClass:\n...     @magicgui\n...     def my_method(self, x=1):\n...         print(locals())\n...\n>>> c = MyClass()\n>>> c.my_method  # the FunctionGui that can be used as a widget\n\n# calling it works as usual, with `c` provided as `self`\n>>> c.my_method(x=34)\n{'self': <__main__.MyClass object at 0x7fb610e455e0>, 'x': 34}\n
"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__init__","title":"__init__(function: Callable[_P, _R], call_button: bool | str | None = None, layout: str = 'vertical', scrollable: bool = False, labels: bool = True, tooltips: bool = True, app: AppRef | None = None, visible: bool | None = None, auto_call: bool = False, result_widget: bool = False, param_options: dict[str, dict] | None = None, name: str | None = None, persist: bool = False, raise_on_unknown: bool = False, **kwargs: Any)","text":""},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__repr__","title":"__repr__() -> str","text":"

Return string representation of instance.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.__set__","title":"__set__(obj: Any, value: Any) -> NoReturn","text":"

Prevent setting a magicgui attribute.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.copy","title":"copy() -> FunctionGui","text":"

Return a copy of this FunctionGui.

"},{"location":"api/widgets/FunctionGui/#magicgui.widgets.FunctionGui.reset_call_count","title":"reset_call_count() -> None","text":"

Reset the call count to 0.

"},{"location":"api/widgets/Image/","title":"Image","text":"

Available in backends: qt

"},{"location":"api/widgets/Image/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Image/#magicgui.widgets.Image","title":"Image","text":"

Bases: ValueWidget

A non-editable image display.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.image_data","title":"image_data: np.ndarray | None property","text":"

Return image data.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.image_rgba","title":"image_rgba: np.ndarray | None property","text":"

Return rendered numpy array.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.value","title":"value property writable","text":"

Return current image array.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.__repr__","title":"__repr__() -> str","text":"

Return representation of widget of instance.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.get_clim","title":"get_clim() -> tuple[float | None, float | None]","text":"

Get contrast limits (for monochromatic images).

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.scale_widget_to_image_size","title":"scale_widget_to_image_size()","text":"

Set the size of the widget to the size of the image.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_clim","title":"set_clim(vmin: float | None = None, vmax: float | None = None)","text":"

Set contrast limits (for monochromatic images).

Parameters:

  • vmin (float, default: None ) \u2013

    The min contrast limit to use when scaling monochromatic images

  • vmax (float, default: None ) \u2013

    The max contrast limit to use when scaling monochromatic images

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_cmap","title":"set_cmap(cmap: str | Colormap | matplotlib.colors.Colormap)","text":"

Set colormap (for monochromatic images).

Parameters:

  • cmap (str, magicgui.types.Colormap, or matplotlib.colors.Colormap) \u2013

    A colormap to use for monochromatic images. If a string, matplotlib must be installed and the colormap will be selected with cm.get_cmap(cmap).

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_data","title":"set_data(val: str | Path | np.ndarray | PIL.Image.Image, cmap: str | Colormap | matplotlib.colors.Colormap | None = None, norm: _mpl_image.Normalize | matplotlib.colors.Normalize | None = None, vmin: float | None = None, vmax: float | None = None, width: int | Literal['auto'] | None = None, height: int | Literal['auto'] | None = None, format: str | None = None)","text":"

Set image data with various optional display parameters.

Parameters:

  • val ((str, Path, ndarray or Image)) \u2013

    The image data or file to load. Data must be 2D (monochromatic), or 3D: MxNx3 (RGB) or MxNx4 (RGBA).

  • cmap (str, magicgui.types.Colormap, or matplotlib.colors.Colormap, default: None ) \u2013

    A colormap to use for monochromatic images. If a string, matplotlib must be installed and the colormap will be selected with cm.get_cmap(cmap).

  • norm (magicgui.types.Normalize, or matplotlib.colors.Normalize, default: None ) \u2013

    A normalization object to use for rendering images. Accepts matplotlib Normalize objects.

  • vmin (float, default: None ) \u2013

    The min contrast limit to use when scaling monochromatic images

  • vmax (float, default: None ) \u2013

    The max contrast limit to use when scaling monochromatic images

  • width (int or 'auto', default: None ) \u2013

    Set the width of the widget. If \"auto\", sets the widget size to the image size (1:1). If width is provided, height is auto-set based on aspect ratio.

  • height (int or 'auto', default: None ) \u2013

    Set the height of the widget. If \"auto\", sets the widget size to the image size (1:1). If width is provided, height is auto-set based on aspect ratio.

  • format (str, default: None ) \u2013

    Force image format type for imread when val is provided as a string, by default None

Raises:

  • TypeError \u2013

    If the provided data shape or type is invalid.

  • ImportError \u2013

    If a string is provided for val and PIL is not installed.

  • RuntimeError \u2013

    If a PIL.Image.Image instance is provided as data, with an unrecognized image mode.

"},{"location":"api/widgets/Image/#magicgui.widgets.Image.set_norm","title":"set_norm(norm: Normalize | matplotlib.colors.Normalize)","text":"

Set normalization method.

Parameters:

  • norm (magicgui.types.Normalize, or matplotlib.colors.Normalize) \u2013

    A normalization object to use for rendering images. Accepts matplotlib Normalize objects.

"},{"location":"api/widgets/Label/","title":"Label","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Label/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Label/#magicgui.widgets.Label","title":"Label","text":"

Bases: ValueWidget[str]

A non-editable text display.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/LineEdit/","title":"LineEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/LineEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/LineEdit/#magicgui.widgets.LineEdit","title":"LineEdit","text":"

Bases: ValueWidget[str]

A one-line text editor.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ListEdit/","title":"ListEdit","text":"

Available in backends:

"},{"location":"api/widgets/ListEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit","title":"ListEdit","text":"

Bases: Container[ValueWidget[_V]]

A widget to represent a list of values.

A ListEdit container can create a list with multiple objects of same type. It\nwill contain many child widgets and their value is represented as a Python list\nobject. If a list is given as the initial value, types of child widgets are\ndetermined from the contents. Number of contents can be adjusted with +/-\nbuttons.\n

Parameters:

  • value (Iterable, default: Undefined ) \u2013

    The starting value for the widget.

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • options (dict, default: None ) \u2013

    Widget options of child widgets.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation. For ListEdit, annotation will be like 'list[str]'.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.data","title":"data: ListDataView[_V] property writable","text":"

Return a data view of current value.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.value","title":"value: list[_V] property writable","text":"

Return current value as a list object.

"},{"location":"api/widgets/ListEdit/#magicgui.widgets.ListEdit.__delitem__","title":"__delitem__(key: int | slice) -> None","text":"

Delete child widget(s).

"},{"location":"api/widgets/LiteralEvalLineEdit/","title":"LiteralEvalLineEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/LiteralEvalLineEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/LiteralEvalLineEdit/#magicgui.widgets.LiteralEvalLineEdit","title":"LiteralEvalLineEdit","text":"

Bases: ValueWidget[str]

A one-line text editor that evaluates strings as python literals.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/LogSlider/","title":"LogSlider","text":"

Available in backends:

"},{"location":"api/widgets/LogSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/LogSlider/#magicgui.widgets.LogSlider","title":"LogSlider","text":"

Bases: TransformedRangedWidget

A slider widget to adjust a numerical value logarithmically within a range.

Parameters:

  • base (Enum, Iterable, or Callable, default: e ) \u2013

    The base to use for the log, by default math.e.

"},{"location":"api/widgets/LogSlider/#magicgui.widgets.LogSlider.base","title":"base: float property writable","text":"

Return base used for the log.

"},{"location":"api/widgets/LogSlider/#magicgui.widgets.LogSlider.tracking","title":"tracking: bool property writable","text":"

Return whether slider tracking is enabled.

If tracking is enabled (the default), the slider emits the changed() signal while the slider is being dragged. If tracking is disabled, the slider emits the changed() signal only when the user releases the slider.

"},{"location":"api/widgets/MainFunctionGui/","title":"MainFunctionGui","text":"

Available in backends:

"},{"location":"api/widgets/MainFunctionGui/#signals","title":"Signals","text":"
  • called(object) - Emitted with the result after the function is called.
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/MainFunctionGui/#magicgui.widgets.MainFunctionGui","title":"MainFunctionGui","text":"

Bases: FunctionGui[_P, _R], MainWindow

Container of widgets as a Main Application Window.

"},{"location":"api/widgets/MainWindow/","title":"MainWindow","text":"

Available in backends: qt

"},{"location":"api/widgets/MainWindow/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/MainWindow/#magicgui.widgets.MainWindow","title":"MainWindow","text":"

Bases: MainWindowWidget

A Widget to contain other widgets, includes a menu bar.

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Password/","title":"Password","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Password/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Password/#magicgui.widgets.Password","title":"Password","text":"

Bases: ValueWidget[str]

A one-line text editor that obscures input.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ProgressBar/","title":"ProgressBar","text":"

Available in backends: qt

"},{"location":"api/widgets/ProgressBar/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar","title":"ProgressBar","text":"

Bases: SliderWidget[float]

A progress bar widget.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar.step","title":"step: float property writable","text":"

Step size for widget values.

"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar.decrement","title":"decrement(val: float | None = None) -> None","text":"

Decrease current value by step size, or provided value.

"},{"location":"api/widgets/ProgressBar/#magicgui.widgets.ProgressBar.increment","title":"increment(val: float | None = None) -> None","text":"

Increase current value by step size, or provided value.

"},{"location":"api/widgets/PushButton/","title":"PushButton","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/PushButton/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the button is clicked (may also be connected at the alias clicked).
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/PushButton/#magicgui.widgets.PushButton","title":"PushButton","text":"

Bases: ButtonWidget

A clickable command button.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/QuantityEdit/","title":"QuantityEdit","text":"

Available in backends: qt

"},{"location":"api/widgets/QuantityEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/QuantityEdit/#magicgui.widgets.QuantityEdit","title":"QuantityEdit","text":"

Bases: ValueWidget

A combined LineEdit and ComboBox to edit a pint.Quantity.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/RadioButton/","title":"RadioButton","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/RadioButton/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the button is clicked (may also be connected at the alias clicked).
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RadioButton/#magicgui.widgets.RadioButton","title":"RadioButton","text":"

Bases: ButtonWidget

A radio button with a text label.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/RadioButtons/","title":"RadioButtons","text":"

Available in backends: qt

"},{"location":"api/widgets/RadioButtons/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RadioButtons/#magicgui.widgets.RadioButtons","title":"RadioButtons","text":"

Bases: CategoricalWidget, _OrientationMixin

An exclusive group of radio buttons, providing a choice from multiple choices.

Parameters:

  • value (Any) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/RangeEdit/","title":"RangeEdit","text":"

Available in backends:

"},{"location":"api/widgets/RangeEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RangeEdit/#magicgui.widgets.RangeEdit","title":"RangeEdit","text":"

Bases: Container[SpinBox]

A widget to represent a python range object, with start/stop/step.

A range object produces a sequence of integers from start (inclusive)\nto stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.\nstart defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.\nThese are exactly the valid indices for a list of 4 elements.\nWhen step is given, it specifies the increment (or decrement).\n

Parameters:

  • start (int, default: 0 ) \u2013

    The range start value, by default 0

  • stop (int, default: 10 ) \u2013

    The range stop value, by default 10

  • step (int, default: 1 ) \u2013

    The range step value, by default 1

"},{"location":"api/widgets/RangeEdit/#magicgui.widgets.RangeEdit.value","title":"value: range property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/RangeEdit/#magicgui.widgets.RangeEdit.__repr__","title":"__repr__() -> str","text":"

Return string representation.

"},{"location":"api/widgets/RangeSlider/","title":"RangeSlider","text":"

Available in backends: qt

"},{"location":"api/widgets/RangeSlider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/RangeSlider/#magicgui.widgets.RangeSlider","title":"RangeSlider","text":"

Bases: MultiValuedSliderWidget

A slider widget to adjust a range between two integer values within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Select/","title":"Select","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Select/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Select/#magicgui.widgets.Select","title":"Select","text":"

Bases: CategoricalWidget

A list of options, allowing selection between multiple choices.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/SliceEdit/","title":"SliceEdit","text":"

Available in backends:

"},{"location":"api/widgets/SliceEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/SliceEdit/#magicgui.widgets.SliceEdit","title":"SliceEdit","text":"

Bases: RangeEdit

A widget to represent slice objects, with start/stop/step.

slice(stop) slice(start, stop[, step])

Slice objects may be used for extended slicing (e.g. a[0:10:2])

"},{"location":"api/widgets/SliceEdit/#magicgui.widgets.SliceEdit.value","title":"value: slice property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/Slider/","title":"Slider","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/Slider/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Slider/#magicgui.widgets.Slider","title":"Slider","text":"

Bases: SliderWidget[int]

A slider widget to adjust an integer value within a range.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/SpinBox/","title":"SpinBox","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/SpinBox/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/SpinBox/#magicgui.widgets.SpinBox","title":"SpinBox","text":"

Bases: RangedWidget[int]

A widget to edit an integer with clickable up/down arrows.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/Table/","title":"Table","text":"

Available in backends: qt

"},{"location":"api/widgets/Table/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/Table/#magicgui.widgets.Table","title":"Table","text":"

Bases: ValueWidget, _ReadOnlyMixin, MutableMapping[TblKey, list]

A widget to represent columnar or 2D data with headers.

Tables behave like plain dicts, where the keys are column headers and the (list-like) values are column data.

Parameters:

  • value ((dict, dataframe, list, array, tuple), default: None ) \u2013

    Table data (and/or header data), in one of the accepted formats:

    • list or list-of-lists : [column_values] or [[row_vals], ..., [row_vals]]
    • dict-of-dicts : {column_header -> {row_header -> value}}
    • dict-of-lists : {column_header -> [column_values]}
    • list-of-row-records : [{column_headers -> value}, ... , {column_headers -> value}]
    • split-dict-of-lists :
    • tuple-of-values : ([values], [row_headers], [column_headers])
    • dict-of-pandas-series : {column_header -> Series(values)}

index : Collection, optional A sized iterable container of row headers. By default, row headers will be tuple(range(len(data))). Values provided here override any implied in value. columns : Collection, optional A sized iterable container of column headers. By default, column headers will be tuple(range(len(data[0]))). Values provided here override any implied in value. **kwargs Additional kwargs will be passed to the magicgui.widgets.Widget constructor.

Attributes:

  • value (dict) \u2013

    Returns a dict with the keys data, index, and columns ... representing the 2D (list of lists) tabular data, row headers, and column headers, respectively. If set, will clear and update the table using the new data.

  • data (DataView) \u2013

    A DataView instance that provides numpy-like indexing (with get/set/delete) onto the 2D data array, For example table.data[0,2] gets the data in the cell of the first row, 3rd column. Works with numpy slice syntax.

  • column_headers (tuple) \u2013

    The current column headers. Can be set with a new sequence to change

  • row_headers (tuple) \u2013

    The current row headers. Can be set with a new sequence to change

  • shape (tuple of int) \u2013

    The shape of the table in (rows, columns).

  • size (int) \u2013

    The number of cells in the table.

Methods:

  • keys \u2013

    Return a TableHeadersView, providing a view on this table's headers. Use axis='row' for row headers.

  • items \u2013

    Return a TableItemsView, providing a view on this table's items, as 2-tuples of (header, data). Use axis='row' for (row_header, row_data)

  • clear \u2013

    Clear all table data and headers.

  • to_dataframe \u2013

    Returns a pandas dataframe representation of this table. (requires pandas)

  • to_dict \u2013

    Return one of many different dict-like representations of table and header data. See docstring of :meth:to_dict for details.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table--events","title":"Events","text":"

changed Emitted whenever a cell in the table changes. The value will have a dict of information regarding the cell that changed: {'data': x, 'row': int, 'column': int, 'column_header': str, 'row_header': str} CURRENTLY: only emitted on changes in the GUI. not programmatic changes.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.column_headers","title":"column_headers: tuple property writable","text":"

Return column headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.data","title":"data: DataView property writable","text":"

Return DataView object for this table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.row_headers","title":"row_headers: tuple property writable","text":"

Return row headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.shape","title":"shape: tuple[int, int] property","text":"

Return shape of table widget (rows, cols).

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.size","title":"size: int property","text":"

Return shape of table widget (rows, cols).

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.value","title":"value: dict[TblKey, Collection] property writable","text":"

Return dict with current data, index, and columns of the widget.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__delitem__","title":"__delitem__(key: TblKey) -> None","text":"

Delete a column from the table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__getitem__","title":"__getitem__(key: TblKey) -> list","text":"

Get a column from the table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__hash__","title":"__hash__() -> int","text":"

Make table hashable.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__iter__","title":"__iter__() -> Iterator","text":"

Yield column headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__len__","title":"__len__() -> int","text":"

Return number of columns.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__new__","title":"__new__(value: TableData | None = None, *, index: Collection | None = None, columns: Collection | None = None, **kwargs: Any) -> Table","text":"

Just for the signature.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__repr__","title":"__repr__() -> str","text":"

Return string repr.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.__setitem__","title":"__setitem__(key: TblKey, v: Collection) -> None","text":"

Set a column in the table. If k doesn't exist, make a new column.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.clear","title":"clear() -> None","text":"

Clear the table.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.delete_row","title":"delete_row(*, index: int | Sequence[int] | None = None, header: Any | Sequence[Any] | None = None) -> None","text":"

Delete row(s) by index or header.

Parameters:

  • index (int or Sequence[int], default: None ) \u2013

    Index or indices of row(s) to delete.

  • header (Any or Sequence[Any], default: None ) \u2013

    Header or headers of row(s) to delete.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.items","title":"items(axis: str = 'column') -> TableItemsView[TblKey, list]","text":"

Return a set-like object providing a view on this table's items.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.keys","title":"keys(axis: str = 'column') -> HeadersView[TblKey]","text":"

Return a set-like object providing a view on this table's headers.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.to_dataframe","title":"to_dataframe() -> pandas.DataFrame","text":"

Convert TableData to dataframe.

"},{"location":"api/widgets/Table/#magicgui.widgets.Table.to_dict","title":"to_dict(orient: str = 'dict') -> list | dict","text":"

Convert the Table to a dictionary.

The type of the key-value pairs can be customized with the parameters (see below).

Parameters:

  • orient (str {'dict', 'list', 'series', 'split', 'records', 'index'}, default: 'dict' ) \u2013

    Determines the type of the values of the dictionary.

    • 'dict' (default) : dict like {column -> {index -> value}}
    • 'list' : dict like {column -> [values]}
    • 'split' : dict like
    • 'records' : list like [{column -> value}, ... , {column -> value}]
    • 'index' : dict like {index -> {column -> value}}
    • 'series' : dict like {column -> Series(values)}
"},{"location":"api/widgets/TextEdit/","title":"TextEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/TextEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/TextEdit/#magicgui.widgets.TextEdit","title":"TextEdit","text":"

Bases: ValueWidget[str], _ReadOnlyMixin

A widget to edit and display both plain and rich text.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/TimeEdit/","title":"TimeEdit","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/TimeEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted when the widget value changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/TimeEdit/#magicgui.widgets.TimeEdit","title":"TimeEdit","text":"

Bases: ValueWidget[TV]

A widget for editing times.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/ToolBar/","title":"ToolBar","text":"

Available in backends: qt, ipynb

"},{"location":"api/widgets/ToolBar/#signals","title":"Signals","text":"
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/ToolBar/#magicgui.widgets.ToolBar","title":"ToolBar","text":"

Bases: ToolBarWidget

Toolbar that contains a set of controls.

Parameters:

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/TupleEdit/","title":"TupleEdit","text":"

Available in backends:

"},{"location":"api/widgets/TupleEdit/#signals","title":"Signals","text":"
  • changed(object) - Emitted with self when any sub-widget in the container changes.
  • label_changed(str) - Emitted when the widget label changes.
  • parent_changed(object) - Emitted with the backend widget when the widget parent changes.
"},{"location":"api/widgets/TupleEdit/#magicgui.widgets.TupleEdit","title":"TupleEdit","text":"

Bases: Container[ValueWidget]

A widget to represent a tuple of values.

A TupleEdit container has several child widgets of different type. Their value is\nrepresented as a Python tuple object. If a tuple is given as the initial value,\ntypes of child widgets are determined one by one. Unlike ListEdit, number of\ncontents is not editable.\n

Parameters:

  • value (Iterable, default: Undefined ) \u2013

    The starting value for the widget.

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • options (dict, default: None ) \u2013

    Widget options of child widgets.

"},{"location":"api/widgets/TupleEdit/#magicgui.widgets.TupleEdit.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation. For TupleEdit, annotation will be like 'tuple[str, int]'.

"},{"location":"api/widgets/TupleEdit/#magicgui.widgets.TupleEdit.value","title":"value: tuple property writable","text":"

Return current value as a tuple.

"},{"location":"api/widgets/bases/","title":"magicgui.widgets.bases","text":"

The magicgui.widgets.bases module contains the base classes for all widgets.

While most users will never instantiate these classes directly, the methods and properties of these classes are inherited by all widgets, and define the common API for all widgets. Therefore, it is worth being aware of the type of widget you are working with.

"},{"location":"api/widgets/bases/#summary","title":"Summary","text":"Widget Description Widget Basic Widget, wrapping a class that implements WidgetProtocol. ButtonWidget Widget with a value, Wraps a widget implementing the ButtonWidgetProtocol. CategoricalWidget Widget with a value and choices. Wraps CategoricalWidgetProtocol. ContainerWidget Widget that can contain other widgets. DialogWidget Modal Container. MainWindowWidget Top level Application widget that can contain other widgets. RangedWidget Widget with a constrained value. Wraps RangedWidgetProtocol. SliderWidget Widget with a constrained value and orientation. Wraps SliderWidgetProtocol. ValueWidget Widget with a value, Wraps ValueWidgetProtocol."},{"location":"api/widgets/bases/#class-hierarchy","title":"Class Hierarchy","text":"

In visual form, the widget class hierarchy looks like this:

classDiagram\n    Widget <|-- ValueWidget\n    Widget <|-- ContainerWidget\n    BackendWidget ..|> WidgetProtocol : implements a\n    ValueWidget <|-- RangedWidget\n    ValueWidget <|-- ButtonWidget\n    ValueWidget <|-- CategoricalWidget\n    RangedWidget <|-- SliderWidget\n    Widget --* WidgetProtocol : controls a\n    <<Interface>> WidgetProtocol\n    class WidgetProtocol {\n        _mgui_get_X()\n        _mgui_set_X()\n    }\n    class Widget{\n        name: str\n        annotation: Any\n        label: str\n        tooltip: str\n        visible: bool\n        enabled: bool\n        native: Any\n        height: int\n        width: int\n        hide()\n        show()\n        close()\n        render()\n    }\n    class ValueWidget{\n        value: Any\n        changed: SignalInstance\n        bind(value, call) Any\n        unbind()\n    }\n    class RangedWidget{\n        value: float | tuple\n        min: float\n        max: float\n        step: float\n        adaptive_step: bool\n        range: tuple[float, float]\n    }\n    class SliderWidget{\n        orientation: str\n    }\n    class ButtonWidget{\n        value: bool\n        clicked: SignalInstance\n        text: str\n    }\n    class CategoricalWidget{\n        choices: List[Any]\n    }\n    class ContainerWidget{\n        widgets: List[Widget]\n        labels: bool\n        layout: str\n        margins: tuple[int, int, int, int]\n        reset_choices()\n        asdict() Dict[str, Any]\n        update(mapping)\n    }\n\n    click Widget href \"#magicgui.widgets.bases.Widget\"\n    click ValueWidget href \"#magicgui.widgets.bases.ValueWidget\"\n    click RangedWidget href \"#magicgui.widgets.bases.RangedWidget\"\n    click SliderWidget href \"#magicgui.widgets.bases.SliderWidget\"\n    click ButtonWidget href \"#magicgui.widgets.bases.ButtonWidget\"\n    click CategoricalWidget href \"#magicgui.widgets.bases.CategoricalWidget\"\n    click ContainerWidget href \"#magicgui.widgets.bases.ContainerWidget\"\n
"},{"location":"api/widgets/bases/#base-widget-classes","title":"Base Widget Classes","text":""},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget","title":"magicgui.widgets.bases.Widget","text":"

Basic Widget, wrapping a class that implements WidgetProtocol.

Parameters:

  • widget_type (type[WidgetProtocol]) \u2013

    A class implementing a widget protocol. Will be instantiated during init.

  • name (str, default: '' ) \u2013

    The name of the parameter represented by this widget. by default \"\"

  • annotation (Any, default: None ) \u2013

    The type annotation for the parameter represented by the widget, by default None

  • label (str, default: None ) \u2013

    A string to use for an associated Label widget (if this widget is being shown in a Container widget, and labels are on). By default, name will be used. Note: name refers the name of the parameter, as might be used in a signature, whereas label is just the label for that widget in the GUI.

  • tooltip (str, default: None ) \u2013

    A tooltip to display when hovering over the widget.

  • visible (bool, default: None ) \u2013

    Whether the widget is visible, by default True.

  • enabled (bool, default: True ) \u2013

    Whether the widget is enabled, by default True.

  • gui_only (bool, default: False ) \u2013

    If True, widget is excluded from any function signature representation. by default False. (This will likely be deprecated.)

  • parent (Any, default: None ) \u2013

    Optional parent widget of this widget. CAREFUL: if a parent is set, and subsequently deleted, this widget will likely be deleted as well (depending on the backend), and will no longer be usable.

  • backend_kwargs (dict, default: None ) \u2013

    keyword argument to pass to the backend widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.enabled","title":"enabled: bool property writable","text":"

Whether widget is enabled (editable).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.height","title":"height: int property writable","text":"

Return the current height of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.label","title":"label: str property writable","text":"

Return a label to use for this widget when present in Containers.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.max_height","title":"max_height: int property writable","text":"

Get the maximum height of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.max_width","title":"max_width: int property writable","text":"

Get the maximum width of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.min_height","title":"min_height: int property writable","text":"

Get the minimum height of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.min_width","title":"min_width: int property writable","text":"

Get the minimum width of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.native","title":"native: Any property","text":"

Return native backend widget.

Note this is the widget that contains the layout, and not any parent widgets of this (e.g. a parent widget that is used to enable scroll bars)

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.param_kind","title":"param_kind: inspect._ParameterKind property writable","text":"

Return :attr:inspect.Parameter.kind represented by this widget.

Used in building signatures from multiple widgets, by default :attr:~inspect.Parameter.POSITIONAL_OR_KEYWORD

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.parent","title":"parent: Widget property writable","text":"

Return the parent widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.root_native_widget","title":"root_native_widget: Any property","text":"

Return the root native backend widget.

This can be different from the .native widget if the layout is a child of some other widget, e.g. a widget used to enable scroll bars.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.tooltip","title":"tooltip: str | None property writable","text":"

Get the tooltip for this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.visible","title":"visible: bool property writable","text":"

Return whether widget is visible.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.widget_type","title":"widget_type: str property","text":"

Return type of widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.width","title":"width: int property writable","text":"

Return the current width of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.__repr__","title":"__repr__() -> str","text":"

Return representation of widget of instance.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.close","title":"close() -> None","text":"

Close widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.hide","title":"hide() -> None","text":"

Hide widget.

alias for widget.visible = False

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.render","title":"render() -> np.ndarray","text":"

Return an RGBA (MxNx4) numpy array bitmap of the rendered widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.show","title":"show(run: bool = False) -> Widget","text":"

Show widget.

alias for widget.visible = True

Parameters:

  • run (bool, default: False ) \u2013

    Whether to start the application event loop, by default False

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.Widget.shown","title":"shown() -> Iterator[Application]","text":"

Context manager to show the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget","title":"magicgui.widgets.bases.ButtonWidget","text":"

Bases: ValueWidget[bool]

Widget with a value, Wraps a widget implementing the ButtonWidgetProtocol.

see ButtonWidgetProtocol.

Parameters:

  • value (bool, default: Undefined ) \u2013

    The starting state of the widget.

  • text (str, default: None ) \u2013

    The text to display on the button. If not provided, will use name.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget.clicked","title":"clicked: SignalInstance property","text":"

Alias for changed event.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ButtonWidget.text","title":"text: str property writable","text":"

Text of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget","title":"magicgui.widgets.bases.CategoricalWidget","text":"

Bases: ValueWidget[T]

Widget with a value and choices. Wraps CategoricalWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The initially selected choice.

  • choices (Enum, Iterable, or Callable, default: () ) \u2013

    Available choices displayed in the combo box.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.choices","title":"choices: tuple[T | None, ...] property writable","text":"

Available value choices for this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.current_choice","title":"current_choice: str property","text":"

Return the text of the currently selected choice.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.value","title":"value: T property writable","text":"

Return current value of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.__len__","title":"__len__() -> int","text":"

Return the number of choices.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.del_choice","title":"del_choice(choice_name: str) -> None","text":"

Delete the provided choice_name and associated data.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.get_choice","title":"get_choice(choice_name: str) -> T","text":"

Get data for the provided choice_name.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.reset_choices","title":"reset_choices(*_: Any) -> None","text":"

Reset choices to the default state.

If self._default_choices is a callable, this may NOT be the exact same set of choices as when the widget was instantiated, if the callable relies on external state.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.CategoricalWidget.set_choice","title":"set_choice(choice_name: str, data: Any | None = None) -> None","text":"

Set data for the provided choice_name.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget","title":"magicgui.widgets.bases.ContainerWidget","text":"

Bases: Widget, _OrientationMixin, MutableSequence[WidgetVar]

Widget that can contain other widgets.

Wraps a widget that implements ContainerProtocol.

A ContainerWidget behaves like a python list of Widget objects. Subwidgets can be accessed using integer or slice-based indexing (container[0]), as well as by widget name (container.<widget_name>). Widgets can be added with append or insert, and removed with del or pop, etc...

There is a tight connection between a ContainerWidget and an inspect.Signature object, just as there is a tight connection between individual Widgetobjects an an :class:inspect.Parameter object. The signature representation of a ContainerWidget (with the current settings as default values) is accessible with the :meth:~ContainerWidget.__signature__ method (or by using :func:inspect.signature from the standard library)

For a ContainerWidget subclass that is tightly coupled to a specific function signature (as in the \"classic\" magicgui decorator), see magicgui.widgets.FunctionGui.

Parameters:

  • widgets (Sequence[Widget], default: () ) \u2013

    A sequence of widgets with which to initialize the container, by default None.

  • layout (str, default: 'vertical' ) \u2013

    The layout for the container. must be one of {'horizontal', 'vertical'}. by default \"vertical\"

  • scrollable (bool, default: False ) \u2013

    Whether to enable scroll bars or not. If enabled, scroll bars will only appear along the layout direction, not in both directions.

  • labels (bool, default: True ) \u2013

    Whether each widget should be shown with a corresponding Label widget to the left, by default True. Note: the text for each widget defaults to widget.name, but can be overridden by setting widget.label.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__signature__","title":"__signature__: MagicSignature property","text":"

Return a MagicSignature object representing the current state of the gui.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.labels","title":"labels: bool property writable","text":"

Whether widgets are presented with labels.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.layout","title":"layout: str property writable","text":"

Return the layout of the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.margins","title":"margins: tuple[int, int, int, int] property writable","text":"

Return margin between the content and edges of the container.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__delattr__","title":"__delattr__(name: str) -> None","text":"

Delete a widget by name.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__delitem__","title":"__delitem__(key: int | slice) -> None","text":"

Delete a widget by integer or slice index.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__dir__","title":"__dir__() -> list[str]","text":"

Add subwidget names to the dir() call for this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__getattr__","title":"__getattr__(name: str) -> WidgetVar","text":"

Return attribute name. Will return a widget if present.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__getitem__","title":"__getitem__(key: int | str | slice) -> WidgetVar | MutableSequence[WidgetVar]","text":"

Get item by integer, str, or slice.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__len__","title":"__len__() -> int","text":"

Return the count of widgets.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__repr__","title":"__repr__() -> str","text":"

Return a repr.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__setattr__","title":"__setattr__(name: str, value: Any) -> None","text":"

Set attribute name. Prevents changing widget if present, (use del).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.__setitem__","title":"__setitem__(key: Any, value: Any) -> NoReturn","text":"

Prevent assignment by index.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.asdict","title":"asdict() -> dict[str, Any]","text":"

Return state of widget as dict.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.from_callable","title":"from_callable(obj: Callable, gui_options: dict | None = None, **kwargs: Unpack[ContainerKwargs]) -> Container classmethod","text":"

Create a Container widget from a callable object.

In most cases, it will be preferable to create a FunctionGui instead.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.from_signature","title":"from_signature(sig: inspect.Signature, **kwargs: Unpack[ContainerKwargs]) -> Container classmethod","text":"

Create a Container widget from an inspect.Signature object.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.index","title":"index(value: Any, start: int = 0, stop: int = 9223372036854775807) -> int","text":"

Return index of a specific widget instance (or widget name).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.insert","title":"insert(key: int, widget: WidgetVar) -> None","text":"

Insert widget at key.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.remove","title":"remove(value: Widget | str) -> None","text":"

Remove a widget instance (may also be string name of widget).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.reset_choices","title":"reset_choices(*_: Any) -> None","text":"

Reset choices for all Categorical subWidgets to the default state.

If widget._default_choices is a callable, this may NOT be the exact same set of choices as when the widget was instantiated, if the callable relies on external state.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ContainerWidget.update","title":"update(mapping: Mapping | Iterable[tuple[str, Any]] | None = None, **kwargs: Any) -> None","text":"

Update the parameters in the widget from a mapping, iterable, or kwargs.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.DialogWidget","title":"magicgui.widgets.bases.DialogWidget","text":"

Bases: ContainerWidget

Modal Container.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.DialogWidget.exec","title":"exec() -> bool","text":"

Show the dialog, and block.

Return True if the dialog was accepted, False if rejected.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.MainWindowWidget","title":"magicgui.widgets.bases.MainWindowWidget","text":"

Bases: ContainerWidget

Top level Application widget that can contain other widgets.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.MainWindowWidget.create_menu_item","title":"create_menu_item(menu_name: str, item_name: str, callback: Callable | None = None, shortcut: str | None = None) -> None","text":"

Create a menu item item_name under menu menu_name.

menu_name will be created if it does not already exist.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget","title":"magicgui.widgets.bases.RangedWidget","text":"

Bases: ValueWidget[T]

Widget with a constrained value. Wraps RangedWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.adaptive_step","title":"adaptive_step: bool property writable","text":"

Whether the step size is adaptive.

Adaptive decimal step means that the step size will continuously be adjusted to one power of ten below the current value. So when the value is 1100, the step is set to 100, so stepping up once increases it to 1200. For 1200 stepping up takes it to 1300. For negative values, stepping down from -1100 goes to -1200.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.max","title":"max: float property writable","text":"

Maximum allowable value for the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.min","title":"min: float property writable","text":"

Minimum allowable value for the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.range","title":"range: tuple[float, float] property writable","text":"

Range of allowable values for the widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.step","title":"step: float | None property writable","text":"

Step size for widget values (None if adaptive step is turned on).

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.RangedWidget.value","title":"value(value: T) -> None","text":"

Set widget value, will raise Value error if not within min/max.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget","title":"magicgui.widgets.bases.SliderWidget","text":"

Bases: RangedWidget[T], _OrientationMixin

Widget with a constrained value and orientation. Wraps SliderWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • min (float, default: Undefined ) \u2013

    The minimum allowable value, by default 0 (or value if value is less than 0)

  • max (float, default: Undefined ) \u2013

    The maximum allowable value, by default 999 (or value if value is greater than 999)

  • step (float, default: Undefined ) \u2013

    The step size for incrementing the value, by default adaptive step is used

  • orientation ((str, {'horizontal', 'vertical'}), default: 'horizontal' ) \u2013

    The orientation for the slider, by default \"horizontal\"

  • readout (bool, default: True ) \u2013

    Whether to show the editable spinbox next to the slider

  • tracking (bool, default: True ) \u2013

    If tracking is enabled (the default), the slider emits the changed signal while the slider is being dragged. If tracking is disabled, the slider emits the changed signal only after the user releases the slider.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget.options","title":"options: dict property","text":"

Return options currently being used in this widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget.readout","title":"readout: bool property writable","text":"

Get visibility state of readout widget.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.SliderWidget.tracking","title":"tracking: bool property writable","text":"

Return whether slider tracking is enabled.

If tracking is enabled (the default), the slider emits the changed() signal while the slider is being dragged. If tracking is disabled, the slider emits the changed() signal only when the user releases the slider.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget","title":"magicgui.widgets.bases.ValueWidget","text":"

Bases: Widget, Generic[T]

Widget with a value, Wraps ValueWidgetProtocol.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget.

  • bind (Callable[[ValueWidget], Any] | Any, default: Undefined ) \u2013

    A value or callback to bind this widget. If provided, whenever widget.value is accessed, the value provided here will be returned instead. bind may be a callable, in which case bind(self) will be returned (i.e. your bound callback must accept a single parameter, which is this widget instance).

  • nullable (bool, default: False ) \u2013

    If True, the widget will accepts None as a valid value, by default False.

  • **base_widget_kwargs (Any, default: {} ) \u2013

    All additional keyword arguments are passed to the base magicgui.widgets.Widget constructor.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.annotation","title":"annotation: Any property writable","text":"

Return type annotation for the parameter represented by the widget.

ForwardRefs will be resolve when setting the annotation. If the widget is nullable (had a type annototation of Optional[Type]), annotation will return the first argument in the Optional clause.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.value","title":"value: T property writable","text":"

Return current value of the widget. This may be interpreted by backends.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.__repr__","title":"__repr__() -> str","text":"

Return representation of widget of instance.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.bind","title":"bind(value: T | Callable[[ValueWidget], T], call: bool = True) -> None","text":"

Binds value to self.value.

If a value is bound to this widget, then whenever widget.value is accessed, the value provided here will be returned. value can be a callable, in which case value(self) will be returned (i.e. your callback must accept a single parameter, which is this widget instance.).

If you provide a callable and you don't want it to be called (but rather just returned as a callable object, then use call=False when binding your value.

Note: if you need to access the \"original\" widget.value within your callback, please use widget.get_value() instead of the widget.value property, in order to avoid a RuntimeError.

Parameters:

  • value (Any) \u2013

    The value (or callback) to return when accessing this widget's value.

  • call (bool, default: True ) \u2013

    If value is a callable and call is True, the callback will be called as callback(self) when accessing self.value. If False, the callback will simply be returned as a callable object, by default, True.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.get_value","title":"get_value() -> T","text":"

Callable version of self.value.

The main API is to use self.value, however, this is here in order to provide an escape hatch if trying to access the widget's value inside of a callback bound to self._bound_value.

"},{"location":"api/widgets/bases/#magicgui.widgets.bases.ValueWidget.unbind","title":"unbind() -> None","text":"

Unbinds any bound values. (see ValueWidget.bind).

"},{"location":"api/widgets/create_widget/","title":"magicgui.widgets.create_widget","text":""},{"location":"api/widgets/create_widget/#magicgui.widgets.create_widget","title":"magicgui.widgets.create_widget(value=Undefined, annotation=None, name='', param_kind='POSITIONAL_OR_KEYWORD', label=None, gui_only=False, app=None, widget_type=None, options=None, is_result=False, raise_on_unknown=True)","text":"

Create and return appropriate widget subclass.

This factory function can be used to create a widget appropriate for the provided value and/or annotation provided. See Type Mapping Docs for details on how the widget type is determined from type annotations.

Parameters:

  • value (Any, default: Undefined ) \u2013

    The starting value for the widget, by default None

  • annotation (Any, default: None ) \u2013

    The type annotation for the parameter represented by the widget, by default None.

  • name (str, default: '' ) \u2013

    The name of the parameter represented by this widget. by default \"\"

  • param_kind (str, default: 'POSITIONAL_OR_KEYWORD' ) \u2013

    The :attr:inspect.Parameter.kind represented by this widget. Used in building signatures from multiple widgets, by default \"POSITIONAL_OR_KEYWORD\"

  • label (str, default: None ) \u2013

    A string to use for an associated Label widget (if this widget is being shown in a Container widget, and labels are on). By default, name will be used. Note: name refers the name of the parameter, as might be used in a signature, whereas label is just the label for that widget in the GUI.

  • gui_only (bool, default: False ) \u2013

    Whether the widget should be considered \"only for the gui\", or if it should be included in any widget container signatures, by default False

  • app (str, default: None ) \u2013

    The backend to use, by default None

  • widget_type (str or Type[WidgetProtocol] or None, default: None ) \u2013

    A class implementing a widget protocol or a string with the name of a magicgui widget type (e.g. \"Label\", \"PushButton\", etc...). If provided, this widget type will be used instead of the type autodetermined from value and/or annotation above.

  • options (dict, default: None ) \u2013

    Dict of options to pass to the Widget constructor, by default dict()

  • is_result (boolean, default: False ) \u2013

    Whether the widget belongs to an input or an output. By default, an input is assumed.

  • raise_on_unknown (bool, default: True ) \u2013

    Raise exception if no widget is found for the given type, by default True

Returns:

  • Widget \u2013

    An instantiated widget subclass

Raises:

  • TypeError \u2013

    If the provided or autodetected widget_type does not implement any known widget protocols

Examples:

from magicgui.widgets import create_widget\n\n# create a widget from a string value\nwdg = create_widget(value=\"hello world\")\nassert wdg.value == \"hello world\"\n\n# create a widget from a string annotation\nwdg = create_widget(annotation=str)\nassert wdg.value == \"\"\n
"},{"location":"generated_examples/","title":"Examples","text":""},{"location":"generated_examples/#getting-started","title":"Getting started","text":"

A gallery of examples for magicgui.

Basic example

Basic widgets demo

"},{"location":"generated_examples/#demo-applications","title":"Demo applications","text":"

Example applications built with magicgui.

Input values dialog

Quantities with pint

Callable functions demo

Snell's law demonstration using magicgui

Hotdog or not app

Chaining functions together

"},{"location":"generated_examples/#demo-widget-types","title":"Demo widget types","text":"

Example gallery demonstrating the available widget types in magicgui.

Image widget

Custom text labels for widgets

Range slider widget

Log slider widget

Optional user choice

Multiple selection widget

Password login

File dialog widget

Dropdown selection widget

Table widget

"},{"location":"generated_examples/#matplotlib-and-magicgui","title":"matplotlib and magicgui","text":"

Examples involving matplotlib graphs and magicgui.

matplotlib figure example

Waveforms example

"},{"location":"generated_examples/#napari-and-magicgui","title":"napari and magicgui","text":"

Examples integrating magicgui with napari.

napari forward reference demo

napari Qt demo

napari parameter sweeps

napari image arithmetic widget

"},{"location":"generated_examples/#jupyter-notebooks-and-magicgui","title":"Jupyter notebooks and magicgui","text":"

Examples using jupyter notebooks together with magicgui.

Jupyter notebooks and magicgui

"},{"location":"generated_examples/#progress-bar-examples","title":"Progress bar examples","text":"

Examples of progress bars in magicgui.

Manual progress bar

Simple progress bar

Indeterminate progress bar

Nested progress bars

"},{"location":"generated_examples/#under-the-hood","title":"Under the hood","text":"

Learn more advanced usage patterns for magicgui, including self referencing widgets and decorating class methods with magicgui.

Self reference magicgui widgets

Deocrate class methods with magicgui

Download all examples in Python source code: generated_examples_python.zip

Download all examples in Jupyter notebooks: generated_examples_jupyter.zip

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/basic_example/","title":"Basic example","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/basic_example/#basic-example","title":"Basic example","text":"

A basic example using magicgui.

Out:

<FunctionGui example(x: int = 0, y='hi')>\n

from magicgui import magicgui\n\n\n@magicgui\ndef example(x: int, y=\"hi\"):\n    \"\"\"Basic example function.\"\"\"\n    return x, y\n\n\nexample.changed.connect(print)\nexample.show(run=True)\n

Total running time of the script: ( 0 minutes 1.478 seconds)

Download Python source code: basic_example.py

Download Jupyter notebook: basic_example.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/basic_widgets_demo/","title":"Basic widgets demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/basic_widgets_demo/#basic-widgets-demo","title":"Basic widgets demo","text":"

Widget demonstration with magicgui.

This code demonstrates a few of the widget types that magicgui can create based on the parameter types in your function.

Out:

<MainFunctionGui widget_demo(boolean=True, integer=1, spin_float=3.14, slider_float=43.5, slider_int=550, string='Text goes here', dropdown=<Medium.Glass: 1.52>, radio_option=2, date=datetime.date(1999, 12, 31), time=datetime.time(1, 30, 20), datetime=datetime.datetime(2023, 12, 6, 16, 43, 31, 126000), filename=PosixPath('/Users/runner'))>\n

import datetime\nfrom enum import Enum\nfrom pathlib import Path\n\nfrom magicgui import magicgui\n\n\nclass Medium(Enum):\n    \"\"\"Enum for various media and their refractive indices.\"\"\"\n\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(\n    main_window=True,\n    call_button=\"Calculate\",\n    layout=\"vertical\",\n    result_widget=True,\n    slider_float={\"widget_type\": \"FloatSlider\", \"max\": 100},\n    slider_int={\"widget_type\": \"Slider\", \"readout\": False},\n    radio_option={\n        \"widget_type\": \"RadioButtons\",\n        \"orientation\": \"horizontal\",\n        \"choices\": [(\"first option\", 1), (\"second option\", 2)],\n    },\n    filename={\"label\": \"Pick a file:\"},\n)\ndef widget_demo(\n    boolean=True,\n    integer=1,\n    spin_float=3.14159,\n    slider_float=43.5,\n    slider_int=550,\n    string=\"Text goes here\",\n    dropdown=Medium.Glass,\n    radio_option=2,\n    date=datetime.date(1999, 12, 31),\n    time=datetime.time(1, 30, 20),\n    datetime=datetime.datetime.now(),\n    filename=Path.home(),\n):\n    \"\"\"We can use numpy docstrings to provide tooltips.\n\n    Parameters\n    ----------\n    boolean : bool, optional\n        A checkbox for booleans, by default True\n    integer : int, optional\n        Some integer, by default 1\n    spin_float : float, optional\n        This one is a float, by default \"pi\"\n    slider_float : float, optional\n        Hey look! I'm a slider, by default 43.5\n    slider_int : float, optional\n        I only take integers, and I've hidden my readout, by default 550\n    string : str, optional\n        We'll use this string carefully, by default \"Text goes here\"\n    dropdown : Enum, optional\n        Pick a medium, by default Medium.Glass\n    radio_option : int\n        A set of radio buttons.\n    date : datetime.date, optional\n        Your birthday, by default datetime.date(1999, 12, 31)\n    time : datetime.time, optional\n        Some time, by default datetime.time(1, 30, 20)\n    datetime : datetime.datetime, optional\n        A very specific time and date, by default ``datetime.datetime.now()``\n    filename : str, optional\n        Pick a path, by default Path.home()\n    \"\"\"\n    return locals().values()\n\n\nwidget_demo.changed.connect(print)\nwidget_demo.show(run=True)\n

Total running time of the script: ( 0 minutes 0.206 seconds)

Download Python source code: basic_widgets_demo.py

Download Jupyter notebook: basic_widgets_demo.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/mg_execution_times/","title":"Computation times","text":"

00:01.683 total execution time for generated_examples files:

+-------------------------------------------------------------------------------------+-----------+--------+ | basic_example (docs/examples/basic_example.py) | 00:01.478 | 0.0 MB | +-------------------------------------------------------------------------------------+-----------+--------+ | basic_widgets_demo (docs/examples/basic_widgets_demo.py) | 00:00.206 | 0.0 MB | +-------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/applications/callable/","title":"Callable functions demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/callable/#callable-functions-demo","title":"Callable functions demo","text":"

This example demonstrates handling callable functions with magicgui.

Out:

<FunctionGui example(func='f')>\n

from magicgui import magicgui\n\n\ndef f(x: int, y=\"a string\") -> str:\n    \"\"\"Example function F.\"\"\"\n    return f\"{y} {x}\"\n\n\ndef g(x: int = 6, y=\"another string\") -> str:\n    \"\"\"Example function G.\"\"\"\n    return f\"{y} asdfsdf {x}\"\n\n\n@magicgui(call_button=True, func={\"choices\": [\"f\", \"g\"]})\ndef example(func=\"f\"):\n    \"\"\"\u00cbxample function.\"\"\"\n    pass\n\n\ndef update(f: str):\n    \"\"\"Update function.\"\"\"\n    if len(example) > 2:\n        del example[1]\n    example.insert(1, magicgui(globals()[f]))\n\n\nexample.func.changed.connect(update)\nexample.show(run=True)\n

Total running time of the script: ( 0 minutes 0.069 seconds)

Download Python source code: callable.py

Download Jupyter notebook: callable.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/chaining/","title":"Chaining functions together","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/chaining/#chaining-functions-together","title":"Chaining functions together","text":"

This example demonstrates chaining multiple functions together.

Out:

calling func_a\ncalling func_b\ncalling func_c\n\n\n<Container (func_a: NoneType, func_b: NoneType, func_c: NoneType)>\n

from magicgui import magicgui, widgets\n\n\n@magicgui(auto_call=True)\ndef func_a(x: int = 64, y: int = 64):\n    \"\"\"Callable function A.\"\"\"\n    print(\"calling func_a\")\n    return x + y\n\n\n@magicgui(auto_call=True, input={\"visible\": False, \"label\": \" \", \"max\": 100000})\ndef func_b(input: int, mult=1.0):\n    \"\"\"Callable function B.\"\"\"\n    print(\"calling func_b\")\n    result = input * mult\n    # since these function defs live in globals(), you can update them directly\n    func_c.input.value = result\n    return result\n\n\n# alternatively, you can the `widget.called` signal to connect a callback function\n# where the result of the function being called is at `value`\n@func_a.called.connect\ndef _on_func_a(value: str):\n    func_b.input.value = value\n\n\n@magicgui(\n    auto_call=True,\n    input={\"visible\": False, \"max\": 100000},\n    result_widget=True,\n    labels=False,\n)\ndef func_c(input: int, format: str = \"({} + {}) * {} is {}\") -> str:\n    \"\"\"Callable function C.\"\"\"\n    print(\"calling func_c\\n\")\n    return format.format(func_a.x.value, func_a.y.value, func_b.mult.value, input)\n\n\ncontainer = widgets.Container(\n    widgets=[func_a, func_b, func_c], layout=\"vertical\", labels=False\n)\ncontainer.native.setMinimumWidth(500)\nfunc_a()\ncontainer.show(run=True)\n\n# notice which functions get called when you change each widget.\n

Total running time of the script: ( 0 minutes 0.064 seconds)

Download Python source code: chaining.py

Download Jupyter notebook: chaining.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/hotdog/","title":"Hotdog or not app","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/hotdog/#hotdog-or-not-app","title":"Hotdog or not app","text":"

Demo app to upload an image and classify if it's an hotdog or not.

import pathlib\nfrom enum import Enum\n\nfrom magicgui import magicgui\n\n\nclass HotdogOptions(Enum):\n    \"\"\"All hotdog possibilities.\"\"\"\n\n    Hotdog = 1\n    NotHotdog = 0\n\n\n@magicgui(main_window=True, layout=\"form\", call_button=\"Classify\", result_widget=True)\ndef is_hotdog(img: pathlib.Path) -> HotdogOptions:\n    \"\"\"Classify possible hotdog images.\n\n    Upload an image and check whether it's an hotdog. For example, this image\n    will be classified as one: <br><br>\n\n    <img src=\"resources/hotdog.jpg\">\n\n    Parameters\n    ----------\n    img : pathlib.Path\n        Path to a possible hotdog image\n\n    Returns\n    -------\n    HotdogOptions\n        True if image contains an hotdog in it\n    \"\"\"\n    if \"hotdog\" in img.stem:\n        return HotdogOptions.Hotdog\n    return HotdogOptions.NotHotdog\n\n\nif __name__ == \"__main__\":\n    is_hotdog.show(run=True)\n

Total running time of the script: ( 0 minutes 0.050 seconds)

Download Python source code: hotdog.py

Download Jupyter notebook: hotdog.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/mg_execution_times/","title":"Computation times","text":"

00:02.680 total execution time for generated_examples_applications files:

+-----------------------------------------------------------------------------------+-----------+--------+ | pint_quantity (docs/examples/applications/pint_quantity.py) | 00:02.439 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | callable (docs/examples/applications/callable.py) | 00:00.069 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | chaining (docs/examples/applications/chaining.py) | 00:00.064 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | snells_law (docs/examples/applications/snells_law.py) | 00:00.057 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | hotdog (docs/examples/applications/hotdog.py) | 00:00.050 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+ | values_dialog (docs/examples/applications/values_dialog.py) | 00:00.000 | 0.0 MB | +-----------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/applications/pint_quantity/","title":"Quantities with pint","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/pint_quantity/#quantities-with-pint","title":"Quantities with pint","text":"

Pint is a Python package to define, operate and manipulate physical quantities: the product of a numerical value and a unit of measurement. It allows arithmetic operations between them and conversions from and to different units. https://pint.readthedocs.io/en/stable/

Out:

<FunctionGui widget(q=<Quantity(1, 'millisecond')>)>\n

from pint import Quantity\n\nfrom magicgui import magicgui\n\n\n@magicgui\ndef widget(q=Quantity(\"1 ms\")):\n    \"\"\"Widget allowing users to input quantity measurements.\"\"\"\n    print(q)\n\n\nwidget.show(run=True)\n

Total running time of the script: ( 0 minutes 2.439 seconds)

Download Python source code: pint_quantity.py

Download Jupyter notebook: pint_quantity.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/snells_law/","title":"Snell's law demonstration using magicgui","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/snells_law/#snells-law-demonstration-using-magicgui","title":"Snell's law demonstration using magicgui","text":"

Demo app for calculating angles of refraction according to Snell's law.

Out:

<FunctionGui snells_law(aoi=1.0, n1=<Medium.Glass: 1.52>, n2=<Medium.Water: 1.333>, degrees=True)>\n

import math\nfrom enum import Enum\n\nfrom magicgui import magicgui\n\n\nclass Medium(Enum):\n    \"\"\"Enum for various media and their refractive indices.\"\"\"\n\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(call_button=\"calculate\", result_widget=True)\ndef snells_law(aoi=1.0, n1=Medium.Glass, n2=Medium.Water, degrees=True):\n    \"\"\"Calculate the angle of refraction given two media and an AOI.\"\"\"\n    if degrees:\n        aoi = math.radians(aoi)\n    try:\n        n1 = n1.value\n        n2 = n2.value\n        result = math.asin(n1 * math.sin(aoi) / n2)\n        return round(math.degrees(result) if degrees else result, 2)\n    except ValueError:  # math domain error\n        return \"TIR!\"\n\n\nsnells_law.show(run=True)\n

Total running time of the script: ( 0 minutes 0.057 seconds)

Download Python source code: snells_law.py

Download Jupyter notebook: snells_law.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/applications/values_dialog/","title":"Input values dialog","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/applications/values_dialog/#input-values-dialog","title":"Input values dialog","text":"

A basic example of a user input dialog.

This will pause code execution until the user responds.

"},{"location":"generated_examples/applications/values_dialog/#_1","title":"Input values dialog","text":"
from magicgui.widgets import request_values\n\nvals = request_values(\n    age=int,\n    name={\"annotation\": str, \"label\": \"Enter your name:\"},\n    title=\"Hi, who are you?\",\n)\nprint(repr(vals))\n

Total running time of the script: ( 0 minutes 0.000 seconds)

Download Python source code: values_dialog.py

Download Jupyter notebook: values_dialog.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/change_label/","title":"Custom text labels for widgets","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/change_label/#custom-text-labels-for-widgets","title":"Custom text labels for widgets","text":"

An example showing how to create custom text labels for your widgets.

Out:

<FunctionGui example(x=1, y='hi')>\n

from magicgui import magicgui\n\n\n# use a different label than the default (the parameter name) in the UI\n@magicgui(x={\"label\": \"widget to set x\"})\ndef example(x=1, y=\"hi\"):\n    \"\"\"Example function.\"\"\"\n    return x, y\n\n\nexample.changed.connect(print)\nexample.show(run=True)\n

Total running time of the script: ( 0 minutes 0.049 seconds)

Download Python source code: change_label.py

Download Jupyter notebook: change_label.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/choices/","title":"Dropdown selection widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/choices/#dropdown-selection-widget","title":"Dropdown selection widget","text":"

Choices for dropdowns can be provided in a few different ways.

Out:

<Container (as_list: NoneType, as_enum: NoneType, as_2tuple: NoneType, as_function: NoneType)>\n

from enum import Enum\n\nfrom magicgui import magicgui, widgets\n\n\nclass Medium(Enum):\n    \"\"\"Enum for various media and their refractive indices.\"\"\"\n\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(ri={\"choices\": [\"Oil\", \"Water\", \"Air\"]}, auto_call=True)\ndef as_list(ri=\"Water\"):\n    \"\"\"Function decorated with magicgui list of choices.\"\"\"\n    print(\"refractive index is\", Medium[ri].value)\n\n\n@magicgui(auto_call=True)\ndef as_enum(ri: Medium = Medium.Water):\n    \"\"\"Function decorated with magicgui and enumeration.\"\"\"\n    print(\"refractive index is\", ri.value)\n\n\n@magicgui(\n    ri={\"choices\": [(\"Oil\", 1.515), (\"Water\", 1.33), (\"Air\", 1.0)]}, auto_call=True\n)\ndef as_2tuple(ri=1.33):\n    \"\"\"Function decorated with magicgui tuple of choices.\"\"\"\n    print(\"refractive index is\", ri)\n\n\ndef get_choices(gui):\n    \"\"\"Function returning tuple of material and refractive index value.\"\"\"\n    return [(\"Oil\", 1.515), (\"Water\", 1.33), (\"Air\", 1.0)]\n\n\n@magicgui(ri={\"choices\": get_choices}, auto_call=True)\ndef as_function(ri: float):\n    \"\"\"Function to calculate refractive index.\"\"\"\n    print(\"refractive index is\", ri)\n\n\ncontainer = widgets.Container(\n    widgets=[as_list, as_enum, as_2tuple, as_function], layout=\"vertical\"\n)\ncontainer.show(run=True)\n

Total running time of the script: ( 0 minutes 0.070 seconds)

Download Python source code: choices.py

Download Jupyter notebook: choices.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/file_dialog/","title":"File dialog widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/file_dialog/#file-dialog-widget","title":"File dialog widget","text":"

A file dialog widget example.

    %s
* ![file dialog](../images/mkd_glr_file_dialog_001.png){: .mkd-glr-multi-img srcset=\"../images/mkd_glr_file_dialog_001.png\"}\n\n* ![file dialog](../images/mkd_glr_file_dialog_002.png){: .mkd-glr-multi-img srcset=\"../images/mkd_glr_file_dialog_002.png\"}\n\n* ![file dialog](../images/mkd_glr_file_dialog_003.png){: .mkd-glr-multi-img srcset=\"../images/mkd_glr_file_dialog_003.png\"}\n
from pathlib import Path\nfrom typing import Sequence\n\nfrom magicgui import magicgui, use_app\n\n\n@magicgui(filename={\"mode\": \"r\"})\ndef filepicker(filename=Path(\"~\")):\n    \"\"\"Take a filename and do something with it.\"\"\"\n    print(\"The filename is:\", filename)\n    return filename\n\n\n# Sequence of paths\n# We change the label using \"label\" for added clarity\n# the filter argument restricts file types\n@magicgui(filenames={\"label\": \"Choose Tiff files:\", \"filter\": \"*.tif\"})\ndef filespicker(filenames: Sequence[Path]):\n    \"\"\"Take a filename and do something with it.\"\"\"\n    print(\"The filenames are:\", filenames)\n    return filenames\n\n\n# Select a directory, instead of file(s)\n@magicgui(directory={\"mode\": \"d\", \"label\": \"Choose a directory\"})\ndef directorypicker(directory=Path(\"~\")):\n    \"\"\"Take a directory name and do something with it.\"\"\"\n    print(\"The directory name is:\", directory)\n    return directory\n\n\nfilepicker.show()\nfilespicker.show()\ndirectorypicker.show()\nfilepicker.filename.changed.connect(print)\nfilespicker.filenames.changed.connect(print)\ndirectorypicker.directory.changed.connect(print)\n\nuse_app().run()\n

Total running time of the script: ( 0 minutes 0.135 seconds)

Download Python source code: file_dialog.py

Download Jupyter notebook: file_dialog.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/image/","title":"Image widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/image/#image-widget","title":"Image widget","text":"

Example of creating an Image Widget from a file.

(This requires pillow, or that magicgui was installed as magicgui[image])

Out:

Image(200x232x3, name='')\n

from magicgui.widgets import Image\n\nimage = Image(value=\"../../images/_test.jpg\")\nimage.scale_widget_to_image_size()\nimage.show(run=True)\n

Total running time of the script: ( 0 minutes 0.049 seconds)

Download Python source code: image.py

Download Jupyter notebook: image.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/log_slider/","title":"Log slider widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/log_slider/#log-slider-widget","title":"Log slider widget","text":"

A logarithmic scale range slider widget.

Out:

<FunctionGui slider(input=1.0)>\n

from magicgui import magicgui\n\n\n@magicgui(\n    auto_call=True,\n    result_widget=True,\n    input={\"widget_type\": \"LogSlider\", \"max\": 10000, \"min\": 1, \"tracking\": False},\n)\ndef slider(input=1):\n    \"\"\"Logarithmic scale slider.\"\"\"\n    return round(input, 4)\n\n\nslider.show(run=True)\n

Total running time of the script: ( 0 minutes 0.049 seconds)

Download Python source code: log_slider.py

Download Jupyter notebook: log_slider.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/login/","title":"Password login","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/login/#password-login","title":"Password login","text":"

A password login field widget.

Out:

<FunctionGui login(username: str = '', password: str = '', password2: str = '')>\n

from magicgui import magicgui\n\n\n# note that \"password\" is a special keyword argument\n# it will create a password field in the gui by default\n# (unless you override \"widget_type\")\n# whereas \"password2\" will be a normal text field\n# (unless you override \"widget_type\")\n@magicgui(password2={\"widget_type\": \"Password\"})\ndef login(username: str, password: str, password2: str):\n    \"\"\"User login credentials.\"\"\"\n    ...\n\n\nlogin.show(run=True)\n

Total running time of the script: ( 0 minutes 0.044 seconds)

Download Python source code: login.py

Download Jupyter notebook: login.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/mg_execution_times/","title":"Computation times","text":"

00:00.610 total execution time for generated_examples_demo_widgets files:

+--------------------------------------------------------------------------------+-----------+--------+ | file_dialog (docs/examples/demo_widgets/file_dialog.py) | 00:00.135 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | choices (docs/examples/demo_widgets/choices.py) | 00:00.070 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | range_slider (docs/examples/demo_widgets/range_slider.py) | 00:00.068 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | table (docs/examples/demo_widgets/table.py) | 00:00.062 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | change_label (docs/examples/demo_widgets/change_label.py) | 00:00.049 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | image (docs/examples/demo_widgets/image.py) | 00:00.049 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | log_slider (docs/examples/demo_widgets/log_slider.py) | 00:00.049 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | selection (docs/examples/demo_widgets/selection.py) | 00:00.045 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | login (docs/examples/demo_widgets/login.py) | 00:00.044 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+ | optional (docs/examples/demo_widgets/optional.py) | 00:00.039 | 0.0 MB | +--------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/demo_widgets/optional/","title":"Optional user choice","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/optional/#optional-user-choice","title":"Optional user choice","text":"

Optional user input using a dropdown selection widget.

Out:

<FunctionGui f(path: str = None)>\n

from typing import Optional\n\nfrom magicgui import magicgui\n\n\n# Using optional will add a '----' to the combobox, which returns \"None\"\n@magicgui(path={\"choices\": [\"a\", \"b\"]})\ndef f(path: Optional[str] = None):\n    \"\"\"\u00d6ptional user input function.\"\"\"\n    print(path, type(path))\n\n\nf.show(run=True)\n

Total running time of the script: ( 0 minutes 0.039 seconds)

Download Python source code: optional.py

Download Jupyter notebook: optional.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/range_slider/","title":"Range slider widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/range_slider/#range-slider-widget","title":"Range slider widget","text":"

A double ended range slider widget.

Out:

<FunctionGui func(range_value: Tuple[int, int] = (20, 380))>\n

from typing import Tuple\n\nfrom magicgui import magicgui\n\n\n@magicgui(auto_call=True, range_value={\"widget_type\": \"RangeSlider\", \"max\": 500})\ndef func(range_value: Tuple[int, int] = (20, 380)):\n    \"\"\"Double ended range slider.\"\"\"\n    print(range_value)\n\n\nfunc.show(run=True)\n

Total running time of the script: ( 0 minutes 0.068 seconds)

Download Python source code: range_slider.py

Download Jupyter notebook: range_slider.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/selection/","title":"Multiple selection widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/selection/#multiple-selection-widget","title":"Multiple selection widget","text":"

A selection widget allowing multiple selections by the user.

Out:

<FunctionGui my_widget(pick_some=['first'])>\n

from magicgui import magicgui\n\n\n@magicgui(\n    pick_some={\n        \"choices\": (\"first\", \"second\", \"third\", \"fourth\"),\n        \"allow_multiple\": True,\n    }\n)\ndef my_widget(pick_some=(\"first\")):\n    \"\"\"Dropdown selection function.\"\"\"\n    print(\"you selected\", pick_some)\n\n\nmy_widget.show(run=True)\n

Total running time of the script: ( 0 minutes 0.045 seconds)

Download Python source code: selection.py

Download Jupyter notebook: selection.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/demo_widgets/table/","title":"Table widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/demo_widgets/table/#table-widget","title":"Table widget","text":"

Demonstrating a few ways to input tables.

Out:

Table(shape=(6, 3) at 0x135339010)\n

import numpy as np\n\nfrom magicgui.widgets import Table\n\n# all of these are valid data types\ndict_of_lists = {\"col_1\": [1, 4], \"col_2\": [2, 5], \"col_3\": [3, 6]}\n# column-dict-of-row-dicts\ndict_of_dict = {\n    \"col_1\": {\"r1\": 1, \"r2\": 4},\n    \"col_2\": {\"r1\": 2, \"r2\": 5},\n    \"col_3\": {\"r1\": 3, \"r2\": 6},\n}\n# list-of-lists\nlist_of_list = [[1, 2, 3], [4, 5, 6]]\n# Records: List-of-column-dict\nlist_of_records = [\n    {\"col_1\": 1, \"col_2\": 2, \"col_3\": 3},\n    {\"col_1\": 4, \"col_2\": 5, \"col_3\": 6},\n]\n\n# 3-tuple of data, index, column\ndata_index_column_tuple = (([[1, 2, 3], [4, 5, 6]], (\"r1\", \"r2\"), (\"c1\", \"c2\", \"c3\")),)\n# split-dict\nsplit_dict = {\n    \"data\": [[1, 2, 3], [4, 5, 6]],\n    \"index\": (\"r1\", \"r2\"),\n    \"columns\": (\"c1\", \"c2\", \"c3\"),\n}\n\ntable = Table(value=dict_of_lists)\n\n# it behaves like a dict:\ntable[\"new_col\"] = [5, 5]\nassert table.pop(\"new_col\") == [5, 5]\n# keys and items have both regular (column) and \"row\" modes\ncol_item_view = table.items()  # iterate col_header/column\nrow_item_view = table.items(\"row\")  # iterate row_header/row\n\n# we can just call dict() to get back our dict of lists\nassert dict(table) == dict_of_lists\n# or use one of many other exports in `to_dict`\nassert table.to_dict(\"records\") == list_of_records\n\n# change headers\ntable.row_headers = (\"row1\", \"row2\")\ntable.column_headers = (\"a\", \"b\", \"c\")\n\n# setting value clears and resets the table:\ntable.value = np.arange(18).reshape(6, 3)\n# we can get/set/delete the 2D data table using numpy-style indexing:\n# get every other row\nassert table.data[::2] == [[0, 1, 2], [6, 7, 8], [12, 13, 14]]\n# set every other column in the 3rd row\ntable.data[2, ::2] = [99, 99]\n\n# export to numpy or pandas\n# table.data.to_numpy()\n# table.to_dataframe()\n\n# the table.changed event emits a dict of information on any cell change\n# e.g. {'data': 'sdfg', 'row': 1, 'column': 0, 'column_header': '1', 'row_header': '1'}\ntable.changed.connect(print)\ntable.show(run=True)\n

Total running time of the script: ( 0 minutes 0.062 seconds)

Download Python source code: table.py

Download Jupyter notebook: table.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/matplotlib/mg_execution_times/","title":"Computation times","text":"

00:00.747 total execution time for generated_examples_matplotlib files:

+------------------------------------------------------------------------+-----------+--------+ | waveform (docs/examples/matplotlib/waveform.py) | 00:00.482 | 0.0 MB | +------------------------------------------------------------------------+-----------+--------+ | mpl_figure (docs/examples/matplotlib/mpl_figure.py) | 00:00.264 | 0.0 MB | +------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/matplotlib/mpl_figure/","title":"matplotlib figure example","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/matplotlib/mpl_figure/#matplotlib-figure-example","title":"matplotlib figure example","text":"

Basic example of adding a generic QWidget to a container.

Main lesson: add your QWidget to container.native.layout() as shown on line 30

Out:

<FunctionGui f(position: int = 0)>\n

import matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.backends.backend_qt5agg import FigureCanvas\n\nfrom magicgui import magicgui\n\nx = np.linspace(0, 5, 256)\ny = np.linspace(0, 5, 256)[:, np.newaxis]\ndata = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)\n\nmpl_fig = plt.figure()\nax = mpl_fig.add_subplot(111)\n(line,) = ax.plot(data[123])  # linescan through the middle of the image\n\n\n@magicgui(position={\"widget_type\": \"Slider\", \"max\": 255}, auto_call=True)\ndef f(position: int):\n    \"\"\"Function demonstrating magicgui combined with matplotlib.\"\"\"\n    line.set_ydata(data[position])\n    line.figure.canvas.draw()\n\n\n# rather than using the Container.append (`f.append`) ...\n# grab the native layout and add the QWidget to it\nf.native.layout().addWidget(FigureCanvas(mpl_fig))\n\nf.show(run=True)\n

Total running time of the script: ( 0 minutes 0.264 seconds)

Download Python source code: mpl_figure.py

Download Jupyter notebook: mpl_figure.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/matplotlib/waveform/","title":"Waveforms example","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/matplotlib/waveform/#waveforms-example","title":"Waveforms example","text":"

Simple waveform generator widget, with plotting.

Out:

<Container (signal_widget: NoneType, sine: NoneType)>\n

from dataclasses import dataclass, field\nfrom enum import Enum\nfrom functools import partial\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.backends.backend_qt5agg import FigureCanvas\nfrom scipy import signal\nfrom typing_extensions import Annotated\n\nfrom magicgui import magicgui, register_type, widgets\n\nregister_type(float, widget_type=\"FloatSlider\")\nregister_type(int, widget_type=\"Slider\")\n\nFreq = Annotated[float, {\"min\": 0.001, \"max\": 30.0}]\nPhase = Annotated[float, {\"min\": 0.0, \"max\": 360.0}]\nDuty = Annotated[float, {\"min\": 0.0, \"max\": 1.0}]\nTime = Annotated[float, {\"min\": 0.01, \"max\": 100.0}]\n\n\n@dataclass\nclass Signal:\n    \"\"\"Constructs a 1D signal.\n\n    As is, this class is not very useful, but one could add callbacks\n    or more functionality here\n\n    Parameters\n    ----------\n    func : callable\n        func must take a 'time' array as sole argument and return a 1D array with the\n        same size as the input\n    duration : float\n        the maximum of the input time array\n    size : int\n        the number of samples in the time array\n\n    \"\"\"\n\n    func: callable\n    duration: Time = 1.0\n    size: int = 500\n    time: np.ndarray = field(init=False)\n    data: np.ndarray = field(init=False)\n\n    def __post_init__(self):\n        \"\"\"Evaluate the function at instantiation time.\"\"\"\n        self.time = np.linspace(0, self.duration, self.size)\n        self.data = self.func(self.time)\n\n    def plot(self, ax=None, **kwargs):\n        \"\"\"Plots the data.\n\n        Parameters\n        ----------\n        ax: matplotlib.axes.Axes instance, default None\n           if provided the plot is done on this axes instance.\n           If None a new ax is created\n        **kwargs: Keyword arguments that are passed on to\n            the matplotib ax.plot method\n\n        Returns\n        -------\n        fig: a matplotlib.figure.Figure instance\n        ax: matplotlib.axes.Axes instance\n        \"\"\"\n        if ax is None:\n            fig, ax = plt.subplots()\n        else:\n            fig = ax.get_figure()\n        ax.plot(self.time, self.data, **kwargs)\n        return fig, ax\n\n\ndef sine(\n    duration: Time = 10.0, size: int = 500, freq: Freq = 0.5, phase: Phase = 0.0\n) -> Signal:\n    \"\"\"Returns a 1D sine wave.\n\n    Parameters\n    ----------\n    duration: float\n       the duration of the signal in seconds\n    size: int\n        the number of samples in the signal time array\n    freq: float\n       the frequency of the signal in Hz\n    phase: Phase\n       the phase of the signal (in degrees)\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=lambda t: np.sin(t * (2 * np.pi * freq) + phase * np.pi / 180),\n    )\n    return sig\n\n\ndef chirp(\n    duration: Time = 10.0,\n    size: int = 500,\n    f0: float = 1.0,\n    t1: Time = 5.0,\n    f1: float = 2.0,\n    phase: Phase = 0.0,\n) -> Signal:\n    \"\"\"Frequency-swept cosine generator.\n\n    See scipy.signal.chirp\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=partial(signal.chirp, f0=f0, t1=t1, f1=f1, phi=phase),\n    )\n    return sig\n\n\ndef sawtooth(\n    duration: Time = 10.0,\n    size: int = 500,\n    freq: Freq = 1.0,\n    width: Duty = 1.0,\n    phase: Phase = 0.0,\n) -> Signal:\n    \"\"\"Return a periodic sawtooth or triangle waveform.\n\n    See scipy.signal.sawtooth\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=lambda t: signal.sawtooth(\n            2 * np.pi * freq * t + phase * np.pi / 180, width=width\n        ),\n    )\n    return sig\n\n\ndef square(\n    duration: Time = 10.0, size: int = 500, freq: Freq = 1.0, duty: Duty = 0.5\n) -> Signal:\n    \"\"\"Return a periodic sawtooth or triangle waveform.\n\n    See scipy.signal.square\n    \"\"\"\n    sig = Signal(\n        duration=duration,\n        size=size,\n        func=lambda t: signal.square(2 * np.pi * freq * t, duty=duty),\n    )\n    return sig\n\n\ndef on_off(\n    duration: Time = 10.0, size: int = 500, t_on: Time = 0.01, t_off: Time = 0.01\n) -> Signal:\n    \"\"\"On/Off signal function.\"\"\"\n    data = np.ones(size)\n    data[: int(size * t_on / duration)] = -1\n    if t_off > 0:\n        data[int(size * t_off / duration) :] = -1\n    sig = Signal(duration=duration, size=size, func=lambda t: data)\n    return sig\n\n\nWAVEFORMS = {\n    \"sine\": sine,\n    \"chirp\": chirp,\n    \"sawtooth\": sawtooth,\n    \"square\": square,\n    \"on_off\": on_off,\n}\n\n\nclass Select(Enum):\n    \"\"\"Enumeration to select signal type.\"\"\"\n\n    OnOff = \"on_off\"\n    Sine = \"sine\"\n    Chirp = \"chirp\"\n    Sawtooth = \"sawtooth\"\n    Square = \"square\"\n\n\nclass WaveForm(widgets.Container):\n    \"\"\"Simple waveform generator widget, with plotting.\"\"\"\n\n    def __init__(self):\n        \"\"\"Creates the widget.\"\"\"\n        super().__init__()\n        self.fig, self.ax = plt.subplots()\n        self.native.layout().addWidget(FigureCanvas(self.fig))\n        self.waveform = sine\n        self.controls = None\n        self.append(self.signal_widget)\n        self.update_controls()\n        self.update_graph(sine())\n\n    @magicgui(auto_call=True)\n    def signal_widget(self, select: Select = Select.Sine) -> widgets.Container:\n        \"\"\"Waveform selection, from the WAVEFORMS dict.\"\"\"\n        self.waveform = WAVEFORMS[select.value]\n        self.update_controls()\n        self.update_graph(self.waveform())\n\n    def update_controls(self):\n        \"\"\"Reset controls according to the new function.\"\"\"\n        if self.controls is not None:\n            self.remove(self.controls)\n        self.controls = magicgui(auto_call=True)(self.waveform)\n        self.append(self.controls)\n        self.controls.called.connect(self.update_graph)\n\n    def update_graph(self, sig: Signal):\n        \"\"\"Re-plot when a parameter changes.\n\n        Note\n        ----\n        For big data, this could be slow, maybe `auto_call` should\n        not be true in the method above...\n        \"\"\"\n        self.ax.cla()\n        sig.plot(ax=self.ax)\n        self.fig.canvas.draw()\n\n\nwaveform = WaveForm()\nwaveform.show(run=True)\n

Total running time of the script: ( 0 minutes 0.482 seconds)

Download Python source code: waveform.py

Download Jupyter notebook: waveform.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/mg_execution_times/","title":"Computation times","text":"

00:28.149 total execution time for generated_examples_napari files:

+--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_combine_qt (docs/examples/napari/napari_combine_qt.py) | 00:17.571 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_parameter_sweep (docs/examples/napari/napari_parameter_sweep.py) | 00:05.931 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_img_math (docs/examples/napari/napari_img_math.py) | 00:04.589 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+ | napari_forward_refs (docs/examples/napari/napari_forward_refs.py) | 00:00.059 | 0.0 MB | +--------------------------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/napari/napari_combine_qt/","title":"napari Qt demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_combine_qt/#napari-qt-demo","title":"napari Qt demo","text":"

Napari provides a few conveniences with magicgui, and one of the most commonly used is the layer combo box that gets created when a parameter is annotated as napari.layers.Layer.

The layer box will stay in sync with the viewer model, adding and removing layers as needed.

This example shows how to use just that widget in the context of a larger custom QWidget.

import napari\nfrom qtpy.QtWidgets import QVBoxLayout, QWidget\n\nfrom magicgui.widgets import create_widget\n\n\nclass CustomWidget(QWidget):\n    \"\"\"A custom widget class.\"\"\"\n\n    def __init__(self) -> None:\n        super().__init__()\n        self.setLayout(QVBoxLayout())\n        # change annotation to napari.layers.Image (e.g) to restrict to just Images\n        self._layer_combo = create_widget(annotation=napari.layers.Layer)\n        # magicgui widgets hold the Qt widget at `widget.native`\n        self.layout().addWidget(self._layer_combo.native)\n\n\nviewer = napari.Viewer()\nviewer.add_points()\nviewer.add_points()\n\nmy_widget = CustomWidget()\nviewer.window.add_dock_widget(my_widget)\n\n# when my_widget is a magicgui.Widget, it will detect that it has been added\n# to a viewer, and automatically update the choices.  Otherwise, you need to\n# trigger this yourself:\nmy_widget._layer_combo.reset_choices()\nviewer.layers.events.inserted.connect(my_widget._layer_combo.reset_choices)\nviewer.layers.events.removed.connect(my_widget._layer_combo.reset_choices)\n\nnapari.run()\n

Total running time of the script: ( 0 minutes 17.571 seconds)

Download Python source code: napari_combine_qt.py

Download Jupyter notebook: napari_combine_qt.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/napari_forward_refs/","title":"napari forward reference demo","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_forward_refs/#napari-forward-reference-demo","title":"napari forward reference demo","text":"

Example of using a ForwardRef to avoid importing a module that provides a widget.

In this example, one might want to create a widget that takes as an argument a napari Image layer, and returns an Image. In order to avoid needing to import napari (and therefore depending directly on napari), it's possible to annotate those parameters with a string representation of the type (rather than the type itself). This is called a \"forward reference\": https://www.python.org/dev/peps/pep-0484/#forward-references

Out:

<FunctionGui subtract_background(data: napari.types.ImageData = None, background: int = 50) -> napari.types.ImageData>\n

# Note: if you'd like to avoid circular imports, or just want to avoid having your\n# linter yell at you for an undefined type annotation, you can place the import\n# inside of an `if typing.TYPE_CHECKING` conditional.  This is not evaluated at runtime,\n# only when something like mypy is doing type checking.\nfrom typing import TYPE_CHECKING\n\nfrom magicgui import magicgui\n\nif TYPE_CHECKING:\n    import napari\n\n\n@magicgui(call_button=\"execute\", background={\"max\": 200})\ndef subtract_background(\n    data: \"napari.types.ImageData\", background: int = 50\n) -> \"napari.types.ImageData\":\n    \"\"\"Subtract a constant from the data.\"\"\"\n    if data:\n        return data - background\n\n\nsubtract_background.show(run=True)\n# now, this example isn't all that interesting on its own (since there will be no Image\n# layer in the dropdown) ... but in another package, where you DO import napari,\n# you could add this widget to a napari viewer with\n# viewer.window.add_dock_widget(subtract_background)\n

Total running time of the script: ( 0 minutes 0.059 seconds)

Download Python source code: napari_forward_refs.py

Download Jupyter notebook: napari_forward_refs.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/napari_img_math/","title":"napari image arithmetic widget","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_img_math/#napari-image-arithmetic-widget","title":"napari image arithmetic widget","text":"

napari is a fast, interactive, multi-dimensional image viewer for python. It uses Qt for the GUI, so it's easy to extend napari with small, composable widgets created with magicgui. Here we're going to build this simple image arithmetic widget with a few additional lines of code.

For napari-specific magicgui documentation, see the napari docs

"},{"location":"generated_examples/napari/napari_img_math/#outline","title":"outline","text":"

This example demonstrates how to:

  1. Create a magicgui widget that can be used in another program (napari)

  2. Use an Enum to create a dropdown menu

  3. Connect some event listeners to create interactivity.

"},{"location":"generated_examples/napari/napari_img_math/#code","title":"code","text":"

Code follows, with explanation below... You can also get this example at github.

from enum import Enum\n\nimport napari\nimport numpy\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\nclass Operation(Enum):\n    # A set of valid arithmetic operations for image_arithmetic.\n    #\n    # To create nice dropdown menus with magicgui, it's best\n    # (but not required) to use Enums.  Here we make an Enum\n    # class for all of the image math operations we want to\n    # allow.\n    add = numpy.add\n    subtract = numpy.subtract\n    multiply = numpy.multiply\n    divide = numpy.divide\n\n\n# here's the magicgui!  We also use the additional\n# `call_button` option\n@magicgui(call_button=\"execute\")\ndef image_arithmetic(\n    layerA: ImageData, operation: Operation, layerB: ImageData\n) -> ImageData:\n    # Add, subtracts, multiplies, or divides to image layers.\n    return operation.value(layerA, layerB)\n\n# create a viewer and add a couple image layers\nviewer = napari.Viewer()\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 1\")\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 2\")\n\n# add our new magicgui widget to the viewer\nviewer.window.add_dock_widget(image_arithmetic)\n\n# keep the dropdown menus in the gui in sync with the layer model\nviewer.layers.events.inserted.connect(image_arithmetic.reset_choices)\nviewer.layers.events.removed.connect(image_arithmetic.reset_choices)\n\nnapari.run()\n
"},{"location":"generated_examples/napari/napari_img_math/#walkthrough","title":"walkthrough","text":"

We're going to go a little out of order so that the other code makes more sense. Let's start with the actual function we'd like to write to do some image arithmetic.

"},{"location":"generated_examples/napari/napari_img_math/#the-function","title":"the function","text":"

Our function takes two numpy arrays (in this case, from Image layers), and some mathematical operation (we'll restrict the options using an enum.Enum). When called, ourfunction calls the selected operation on the data.

def image_arithmetic(array1, operation, array2):\n    return operation.value(array1, array2)\n
"},{"location":"generated_examples/napari/napari_img_math/#type-annotations","title":"type annotations","text":"

magicgui works particularly well with type annotations, and allows third-party libraries to register widgets and behavior for handling their custom types (using magicgui.type_map.register_type). napari provides support for magicgui by registering a dropdown menu whenever a function parameter is annotated as one of the basic napari Layer types, or, in this case, ImageData indicates we just the data attribute of the layer. Furthermore, it recognizes when a function has a napari.layers.Layer or LayerData return type annotation, and will add the result to the viewer. So we gain a lot by annotating the above function with the appropriate napari types.

from napari.types import ImageData\n\ndef image_arithmetic(\n    layerA: ImageData, operation: Operation, layerB: ImageData\n) -> ImageData:\n    return operation.value(layerA, layerB)\n
"},{"location":"generated_examples/napari/napari_img_math/#the-magic-part","title":"the magic part","text":"

Finally, we decorate the function with @magicgui and tell it we'd like to have a call_button that we can click to execute the function.

@magicgui(call_button=\"execute\")\ndef image_arithmetic(layerA: ImageData, operation: Operation, layerB: ImageData):\n    return operation.value(layerA, layerB)\n

That's it! The image_arithmetic function is now a FunctionGui that can be shown, or incorporated into other GUIs (such as the napari GUI shown in this example)

!!! note While type hints aren't always required in magicgui, they are recommended ... and they are required for certain things, like the Operation(Enum) used here for the dropdown and the napari.types.ImageData annotations that napari has registered with magicgui.

"},{"location":"generated_examples/napari/napari_img_math/#create-dropdowns-with-enums","title":"create dropdowns with Enums","text":"

We'd like the user to be able to select the operation (add, subtract, multiply, divide) using a dropdown menu. enum.Enum offers a convenient way to restrict values to a strict set of options, while providing name: value pairs for each of the options. Here, the value for each choice is the actual function we would like to have called when that option is selected.

class Operation(enum.Enum):\n    add = numpy.add\n    subtract = numpy.subtract\n    multiply = numpy.multiply\n    divide = numpy.divide\n
"},{"location":"generated_examples/napari/napari_img_math/#add-it-to-napari","title":"add it to napari","text":"

When we decorated the image_arithmetic function above, it became a FunctionGui. Napari recognizes this type, so we can simply add it to the napari viewer as follows:

viewer.window.add_dock_widget(image_arithmetic)\n
"},{"location":"generated_examples/napari/napari_img_math/#connect-event-listeners-for-interactivity","title":"connect event listeners for interactivity","text":"

What fun is a GUI without some interactivity? Let's make stuff happen.

We connect the image_arithmetic.reset_choices function to the viewer.layers.events.inserted/removed event from napari, to make sure that the dropdown menus stay in sync if a layer gets added or removed from the napari window:

viewer.layers.events.inserted.connect(image_arithmetic.reset_choices)\nviewer.layers.events.removed.connect(image_arithmetic.reset_choices)\n

Tip

An additional offering from magicgui here is that the decorated function also acquires a new attribute \"called\" that can be connected to callback functions of your choice. Then, whenever the gui widget or the original function are called, the result will be passed to your callback function:

@image_arithmetic.called.connect\ndef print_mean(value):\n    # Callback function that accepts an event\n    # the value attribute has the result of calling the function\n    print(np.mean(value))\n
>>> image_arithmetic()\n1.0060037881040373\n
"},{"location":"generated_examples/napari/napari_img_math/#code_1","title":"Code","text":"

Here's the full code example again.

from enum import Enum\n\nimport napari\nimport numpy\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\nclass Operation(Enum):\n    # A set of valid arithmetic operations for image_arithmetic.\n    #\n    # To create nice dropdown menus with magicgui, it's best\n    # (but not required) to use Enums.  Here we make an Enum\n    # class for all of the image math operations we want to\n    # allow.\n    add = numpy.add\n    subtract = numpy.subtract\n    multiply = numpy.multiply\n    divide = numpy.divide\n\n\n# here's the magicgui!  We also use the additional\n# `call_button` option\n@magicgui(call_button=\"execute\")\ndef image_arithmetic(\n    layerA: ImageData, operation: Operation, layerB: ImageData\n) -> ImageData:\n    # Add, subtracts, multiplies, or divides to image layers.\n    return operation.value(layerA, layerB)\n\n\n# create a viewer and add a couple image layers\nviewer = napari.Viewer()\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 1\")\nviewer.add_image(numpy.random.rand(20, 20), name=\"Layer 2\")\n\n# add our new magicgui widget to the viewer\nviewer.window.add_dock_widget(image_arithmetic)\n\n# keep the dropdown menus in the gui in sync with the layer model\nviewer.layers.events.inserted.connect(image_arithmetic.reset_choices)\nviewer.layers.events.removed.connect(image_arithmetic.reset_choices)\n\nnapari.run()\n

Total running time of the script: ( 0 minutes 4.589 seconds)

Download Python source code: napari_img_math.py

Download Jupyter notebook: napari_img_math.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/napari/napari_parameter_sweep/","title":"napari parameter sweeps","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/napari/napari_parameter_sweep/#napari-parameter-sweeps","title":"napari parameter sweeps","text":"

napari is a fast, interactive, multi-dimensional image viewer for python. It uses Qt for the GUI, so it's easy to extend napari with small, composable widgets created with magicgui. Here, we demonstrate how to build a interactive widget that lets you immediately see the effect of changing one of the parameters of your function.

For napari-specific magicgui documentation, see the napari docs

See also: Some of this tutorial overlaps with topics covered in the napari image arithmetic example.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#outline","title":"outline","text":"

This example demonstrates how to:

  1. Create a magicgui widget that can be used in another program (napari)

  2. Automatically call our function when a parameter changes

  3. Provide magicgui with a custom widget for a specific argument

  4. Use the choices option to create a dropdown

  5. Connect some event listeners to create interactivity.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#code","title":"code","text":"

Code follows, with explanation below... You can also get this example at github.

import napari\nimport skimage.data\nimport skimage.filters\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\n# turn the gaussian blur function into a magicgui\n# - 'auto_call' tells magicgui to call the function when a parameter changes\n# - we use 'widget_type' to override the default \"float\" widget on sigma,\n#   and provide a maximum valid value.\n# - we contstrain the possible choices for 'mode'\n@magicgui(\n    auto_call=True,\n    sigma={\"widget_type\": \"FloatSlider\", \"max\": 6},\n    mode={\"choices\": [\"reflect\", \"constant\", \"nearest\", \"mirror\", \"wrap\"]},\n    layout=\"horizontal\",\n)\ndef gaussian_blur(layer: ImageData, sigma: float = 1.0, mode=\"nearest\") -> ImageData:\n    # Apply a gaussian blur to 'layer'.\n    if layer is not None:\n        return skimage.filters.gaussian(layer, sigma=sigma, mode=mode)\n\n# create a viewer and add some images\nviewer = napari.Viewer()\nviewer.add_image(skimage.data.astronaut().mean(-1), name=\"astronaut\")\nviewer.add_image(skimage.data.grass().astype(\"float\"), name=\"grass\")\n\n# Add it to the napari viewer\nviewer.window.add_dock_widget(gaussian_blur)\n# update the layer dropdown menu when the layer list changes\nviewer.layers.events.changed.connect(gaussian_blur.reset_choices)\n\nnapari.run()\n
"},{"location":"generated_examples/napari/napari_parameter_sweep/#walkthrough","title":"walkthrough","text":"

We're going to go a little out of order so that the other code makes more sense. Let's start with the actual function we'd like to write to apply a gaussian filter to an image.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#the-function","title":"the function","text":"

Our function is a very thin wrapper around skimage.filters.gaussian. It takes a napari Image layer, a sigma to control the blur radius, and a mode that determines how edges are handled.

def gaussian_blur(\n    layer: Image, sigma: float = 1, mode=\"nearest\"\n) -> Image:\n    return filters.gaussian(layer.data, sigma=sigma, mode=mode)\n

The reasons we are wrapping it here are:

  1. filters.gaussian accepts a numpy array, but we want to work with napari layers that store the data in a layer.data attribute. So we need an adapter.
  2. We'd like to add some type annotations to the signature that were not provided by filters.gaussian
"},{"location":"generated_examples/napari/napari_parameter_sweep/#type-annotations","title":"type annotations","text":"

As described in the image arithmetic example, we take advantage of napari's built in support for magicgui by annotating our function parameters and return value as napari Layer types. napari will then tell magicgui what to do with them, creating a dropdown with a list of current layers for our layer parameter, and automatically adding the result of our function to the viewer when called.

For documentation on napari types with magicgui, see the napari docs

"},{"location":"generated_examples/napari/napari_parameter_sweep/#the-magic-part","title":"the magic part","text":"

Finally, we decorate the function with @magicgui and provide some options.

@magicgui(\n    auto_call=True,\n    sigma={\"widget_type\": \"FloatSlider\", \"max\": 6},\n    mode={\"choices\": [\"reflect\", \"constant\", \"nearest\", \"mirror\", \"wrap\"]},\n)\ndef gaussian_blur(\n  layer: ImageData, sigma: float = 1.0, mode=\"nearest\"\n) -> ImageData:\n    # Apply a gaussian blur to ``layer``.\n    if layer is not None:\n        return skimage.filters.gaussian(layer, sigma=sigma, mode=mode)\n
  • auto_call=True makes it so that the gaussian_blur function will be called whenever one of the parameters changes (with the current parameters set in the GUI).
  • We then provide keyword arguments to modify the look & behavior of sigma and mode:

    • \"widget_type\": \"FloatSlider\" tells magicgui not to use the standard (float) widget for the sigma widget, but rather to use a slider widget.
    • we then set an upper limit on the slider values for sigma.
  • finally, we specify valid choices for the mode argument. This turns that parameter into a categorical/dropdown type widget, and sets the options.

"},{"location":"generated_examples/napari/napari_parameter_sweep/#connecting-events","title":"connecting events","text":"

As described in the Events documentation, we can also connect any callback to the gaussian_blur.called signal that will receive the result of our decorated function anytime it is called.

def do_something_with_result(result):\n    ...\n\ngaussian_blur.called.connect(do_something_with_result)\n
"},{"location":"generated_examples/napari/napari_parameter_sweep/#code_1","title":"Code","text":"

Here's the full code example again.

import napari\nimport skimage.data\nimport skimage.filters\nfrom napari.types import ImageData\n\nfrom magicgui import magicgui\n\n\n# turn the gaussian blur function into a magicgui\n# - 'auto_call' tells magicgui to call the function when a parameter changes\n# - we use 'widget_type' to override the default \"float\" widget on sigma,\n#   and provide a maximum valid value.\n# - we contstrain the possible choices for 'mode'\n@magicgui(\n    auto_call=True,\n    sigma={\"widget_type\": \"FloatSlider\", \"max\": 6},\n    mode={\"choices\": [\"reflect\", \"constant\", \"nearest\", \"mirror\", \"wrap\"]},\n    layout=\"horizontal\",\n)\ndef gaussian_blur(layer: ImageData, sigma: float = 1.0, mode=\"nearest\") -> ImageData:\n    # Apply a gaussian blur to 'layer'.\n    if layer is not None:\n        return skimage.filters.gaussian(layer, sigma=sigma, mode=mode)\n\n\n# create a viewer and add some images\nviewer = napari.Viewer()\nviewer.add_image(skimage.data.astronaut().mean(-1), name=\"astronaut\")\nviewer.add_image(skimage.data.grass().astype(\"float\"), name=\"grass\")\n\n# Add it to the napari viewer\nviewer.window.add_dock_widget(gaussian_blur)\n# update the layer dropdown menu when the layer list changes\nviewer.layers.events.changed.connect(gaussian_blur.reset_choices)\n\nnapari.run()\n

Total running time of the script: ( 0 minutes 5.931 seconds)

Download Python source code: napari_parameter_sweep.py

Download Jupyter notebook: napari_parameter_sweep.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/notebooks/magicgui_jupyter/","title":"Jupyter notebooks and magicgui","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/notebooks/magicgui_jupyter/#jupyter-notebooks-and-magicgui","title":"Jupyter notebooks and magicgui","text":"

This example shows magicgui widgets embedded in a jupyter notebook.

The key function here is use_app(\"ipynb\").

You can also get this example at github.

import math\nfrom enum import Enum\n\nfrom magicgui import magicgui, use_app\nuse_app(\"ipynb\")\n\nclass Medium(Enum):\n    # Various media and their refractive indices.\n    Glass = 1.520\n    Oil = 1.515\n    Water = 1.333\n    Air = 1.0003\n\n\n@magicgui(\n    call_button=\"calculate\", result_widget=True, layout='vertical', auto_call=True\n)\ndef snells_law(aoi=1.0, n1=Medium.Glass, n2=Medium.Water, degrees=True):\n    # Calculate the angle of refraction given two media and an angle of incidence.\n    if degrees:\n        aoi = math.radians(aoi)\n    try:\n        n1 = n1.value\n        n2 = n2.value\n        result = math.asin(n1 * math.sin(aoi) / n2)\n        return round(math.degrees(result) if degrees else result, 2)\n    except ValueError:  # math domain error\n        return \"TIR!\"\n\n\nsnells_law\n

Total running time of the script: ( 0 minutes 0.000 seconds)

Download Python source code: magicgui_jupyter.py

Download Jupyter notebook: magicgui_jupyter.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/notebooks/mg_execution_times/","title":"Computation times","text":"

00:00.000 total execution time for generated_examples_notebooks files:

+-----------------------------------------------------------------------------------------+-----------+--------+ | magicgui_jupyter (docs/examples/notebooks/magicgui_jupyter.py) | 00:00.000 | 0.0 MB | +-----------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/progress_bars/mg_execution_times/","title":"Computation times","text":"

00:00.244 total execution time for generated_examples_progress_bars files:

+---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_nested (docs/examples/progress_bars/progress_nested.py) | 00:00.081 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_manual (docs/examples/progress_bars/progress_manual.py) | 00:00.060 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress (docs/examples/progress_bars/progress.py) | 00:00.056 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+ | progress_indeterminate (docs/examples/progress_bars/progress_indeterminate.py) | 00:00.047 | 0.0 MB | +---------------------------------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/progress_bars/progress/","title":"Simple progress bar","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress/#simple-progress-bar","title":"Simple progress bar","text":"

A simple progress bar demo with magicgui.

Out:

<FunctionGui long_running(steps=10, delay=0.1)>\n

from time import sleep\n\nfrom magicgui import magicgui\nfrom magicgui.tqdm import trange\n\n# if magicui.tqdm.tqdm or trange are used outside of a @magicgui function, (such as in\n# interactive use in IPython), then they fall back to the standard terminal output\n\n\n# If use inside of a magicgui-decorated function\n# a progress bar widget will be added to the magicgui container\n@magicgui(call_button=True, layout=\"horizontal\")\ndef long_running(steps=10, delay=0.1):\n    \"\"\"Long running computation with range iterator.\"\"\"\n    # trange(steps) is a shortcut for `tqdm(range(steps))`\n    for _i in trange(steps):\n        sleep(delay)\n\n\nlong_running.show(run=True)\n

Total running time of the script: ( 0 minutes 0.056 seconds)

Download Python source code: progress.py

Download Jupyter notebook: progress.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/progress_bars/progress_indeterminate/","title":"Indeterminate progress bar","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress_indeterminate/#indeterminate-progress-bar","title":"Indeterminate progress bar","text":"

Example of an indeterminate progress bar for a long running computation of unknown time.

Out:

<FunctionGui long_running(sleep_time=5)>\n

import time\n\nfrom superqt.utils import thread_worker\n\nfrom magicgui import magicgui\nfrom magicgui.tqdm import tqdm\n\n\n@magicgui(call_button=True, layout=\"horizontal\")\ndef long_running(sleep_time=5):\n    \"\"\"Long running computation with an indeterminate progress bar.\"\"\"\n    # Here tqdm is not provided an iterable argument, or the 'total' kwarg\n    # so it cannot calculate the expected number of iterations\n    # which means it will create an indeterminate progress bar\n    with tqdm() as pbar:\n        # It is best practice to use a separate thread for long running computations\n        # This makes the function non-blocking, you can still interact with the widget\n        @thread_worker(connect={\"finished\": lambda: pbar.progressbar.hide()})\n        def sleep(secs):\n            time.sleep(secs)\n\n        sleep(sleep_time)\n\n\nlong_running.show(run=True)\n

Total running time of the script: ( 0 minutes 0.047 seconds)

Download Python source code: progress_indeterminate.py

Download Jupyter notebook: progress_indeterminate.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/progress_bars/progress_manual/","title":"Manual progress bar","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress_manual/#manual-progress-bar","title":"Manual progress bar","text":"

Example of a progress bar being updated manually.

Out:

<FunctionGui manual(pbar: magicgui.widgets.ProgressBar = ProgressBar(value=<function match_type.<locals>.<lambda> at 0x133c50220>, annotation=<class 'magicgui.widgets.ProgressBar'>, name='pbar'), increment: bool = 1)>\n

from magicgui import magicgui\nfrom magicgui.widgets import ProgressBar\n\n\n@magicgui(call_button=\"tick\", pbar={\"min\": 0, \"step\": 2, \"max\": 20, \"value\": 0})\ndef manual(pbar: ProgressBar, increment: bool = True):\n    \"\"\"Example of manual progress bar control.\"\"\"\n    if increment:\n        pbar.increment()\n    else:\n        pbar.decrement()\n\n\nmanual.show(run=True)\n

Total running time of the script: ( 0 minutes 0.060 seconds)

Download Python source code: progress_manual.py

Download Jupyter notebook: progress_manual.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/progress_bars/progress_nested/","title":"Nested progress bars","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/progress_bars/progress_nested/#nested-progress-bars","title":"Nested progress bars","text":"

Example using nested progress bars in magicgui.

Out:

<FunctionGui long_function(steps=10, repeats=4, choices='ABCDEFGHIJKLMNOP12345679', char='', delay=0.05)>\n

import random\nfrom time import sleep\n\nfrom magicgui import magicgui\nfrom magicgui.tqdm import tqdm, trange\n\n# if magicui.tqdm.tqdm or trange are used outside of a @magicgui function, (such as in\n# interactive use in IPython), then they fall back to the standard terminal output\n\n\n# If use inside of a magicgui-decorated function\n# a progress bar widget will be added to the magicgui container\n@magicgui(call_button=True, layout=\"vertical\")\ndef long_function(\n    steps=10, repeats=4, choices=\"ABCDEFGHIJKLMNOP12345679\", char=\"\", delay=0.05\n):\n    \"\"\"Long running computation with nested iterators.\"\"\"\n    # trange and tqdm accept all the kwargs from tqdm itself, as well as any\n    # valid kwargs for magicgui.widgets.ProgressBar, (such as \"label\")\n    for _r in trange(repeats, label=\"repeats\"):\n        letters = [random.choice(choices) for _ in range(steps)]\n        # `tqdm`, like `tqdm`, accepts any iterable\n        # this progress bar is nested and will be run & reset multiple times\n        for letter in tqdm(letters, label=\"steps\"):\n            long_function.char.value = letter\n            sleep(delay)\n\n\nlong_function.show(run=True)\n

Total running time of the script: ( 0 minutes 0.081 seconds)

Download Python source code: progress_nested.py

Download Jupyter notebook: progress_nested.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/under_the_hood/class_method/","title":"Deocrate class methods with magicgui","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/under_the_hood/class_method/#deocrate-class-methods-with-magicgui","title":"Deocrate class methods with magicgui","text":"

Demonstrates decorating a class method with magicgui.

Once the class is instantiated, instance.method_name will return a FunctionGui in which the instance will always be provided as the first argument (i.e. \"self\") when the FunctionGui or method is called.

Out:

instance: a, counter: 0.0, sigma: 0.0\ninstance: b, counter: 0.0, sigma: 0.0\n

from magicgui import event_loop, magicgui\nfrom magicgui.widgets import Container\n\n\nclass MyObject:\n    \"\"\"Example object class.\"\"\"\n\n    def __init__(self, name):\n        self.name = name\n        self.counter = 0.0\n\n    @magicgui(auto_call=True)\n    def method(self, sigma: float = 0):\n        \"\"\"Example class method.\"\"\"\n        print(f\"instance: {self.name}, counter: {self.counter}, sigma: {sigma}\")\n        self.counter = self.counter + sigma\n        return self.name\n\n\nwith event_loop():\n    a = MyObject(\"a\")\n    b = MyObject(\"b\")\n    container = Container(widgets=[a.method, b.method])\n    container.show()\n    assert a.method() == \"a\"\n    assert b.method() == \"b\"\n

Total running time of the script: ( 0 minutes 0.048 seconds)

Download Python source code: class_method.py

Download Jupyter notebook: class_method.ipynb

Gallery generated by mkdocs-gallery

"},{"location":"generated_examples/under_the_hood/mg_execution_times/","title":"Computation times","text":"

00:00.106 total execution time for generated_examples_under_the_hood files:

+----------------------------------------------------------------------------------------+-----------+--------+ | self_reference (docs/examples/under_the_hood/self_reference.py) | 00:00.058 | 0.0 MB | +----------------------------------------------------------------------------------------+-----------+--------+ | class_method (docs/examples/under_the_hood/class_method.py) | 00:00.048 | 0.0 MB | +----------------------------------------------------------------------------------------+-----------+--------+

"},{"location":"generated_examples/under_the_hood/self_reference/","title":"Self reference magicgui widgets","text":"

Note

Click here to download the full example code

"},{"location":"generated_examples/under_the_hood/self_reference/#self-reference-magicgui-widgets","title":"Self reference magicgui widgets","text":"

Widgets created with magicgui can reference themselves, and use the widget API.

Out:

<FunctionGui function(width=400, x: int = 50)>\n

from magicgui import magicgui\n\n\n@magicgui(auto_call=True, width={\"max\": 800, \"min\": 100}, x={\"widget_type\": \"Slider\"})\ndef function(width=400, x: int = 50):\n    \"\"\"Example function.\"\"\"\n    # the widget can reference itself, and use the widget API\n    function.x.width = width\n\n\nfunction.show(run=True)\n

Total running time of the script: ( 0 minutes 0.058 seconds)

Download Python source code: self_reference.py

Download Jupyter notebook: self_reference.ipynb

Gallery generated by mkdocs-gallery

"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index b5bdd1c3290891878da3380b614500810811f620..5824e190a6b22ad23e5241b6e24fc0aa5a2bc124 100644 GIT binary patch delta 15 WcmX@iewdw2zMF&N-ja=Mdzk?#rv**` delta 15 WcmX@iewdw2zMF%?Y~e<>z03e5s05<` diff --git a/type_map/index.html b/type_map/index.html index 69a4b2d81..c4ee3b819 100644 --- a/type_map/index.html +++ b/type_map/index.html @@ -3337,7 +3337,7 @@

Default Type Mappingmagicgui.widgets.ProgressBar ProgressBar -{'bind': <function match_type.<locals>.<lambda> at 0x13fedd8a0>, 'visible': True} +{'bind': <function match_type.<locals>.<lambda> at 0x13bded8a0>, 'visible': True} types.FunctionType