vispy 0.16.1__cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +518 -0
  9. vispy/app/backends/_jupyter_rfb.py +292 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +476 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1040 -0
  20. vispy/app/backends/_sdl2.py +449 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +829 -0
  24. vispy/app/backends/_wx.py +492 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +290 -0
  29. vispy/app/canvas.py +833 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1829 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +544 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +646 -0
  285. vispy/scene/events.py +92 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +629 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +489 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +28 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +46 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +34 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/conftest.py +25 -0
  403. vispy/visuals/cube.py +41 -0
  404. vispy/visuals/ellipse.py +162 -0
  405. vispy/visuals/filters/__init__.py +10 -0
  406. vispy/visuals/filters/base_filter.py +242 -0
  407. vispy/visuals/filters/clipper.py +60 -0
  408. vispy/visuals/filters/clipping_planes.py +122 -0
  409. vispy/visuals/filters/color.py +181 -0
  410. vispy/visuals/filters/markers.py +34 -0
  411. vispy/visuals/filters/mesh.py +801 -0
  412. vispy/visuals/filters/picking.py +60 -0
  413. vispy/visuals/filters/tests/__init__.py +3 -0
  414. vispy/visuals/filters/tests/test_primitive_picking_filters.py +71 -0
  415. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  416. vispy/visuals/glsl/__init__.py +1 -0
  417. vispy/visuals/glsl/antialiasing.py +133 -0
  418. vispy/visuals/glsl/color.py +63 -0
  419. vispy/visuals/graphs/__init__.py +1 -0
  420. vispy/visuals/graphs/graph.py +240 -0
  421. vispy/visuals/graphs/layouts/__init__.py +55 -0
  422. vispy/visuals/graphs/layouts/circular.py +49 -0
  423. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  424. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  425. vispy/visuals/graphs/layouts/random.py +52 -0
  426. vispy/visuals/graphs/tests/__init__.py +1 -0
  427. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  428. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  429. vispy/visuals/graphs/util.py +120 -0
  430. vispy/visuals/gridlines.py +161 -0
  431. vispy/visuals/gridmesh.py +98 -0
  432. vispy/visuals/histogram.py +58 -0
  433. vispy/visuals/image.py +703 -0
  434. vispy/visuals/image_complex.py +130 -0
  435. vispy/visuals/infinite_line.py +199 -0
  436. vispy/visuals/instanced_mesh.py +151 -0
  437. vispy/visuals/isocurve.py +213 -0
  438. vispy/visuals/isoline.py +241 -0
  439. vispy/visuals/isosurface.py +113 -0
  440. vispy/visuals/line/__init__.py +6 -0
  441. vispy/visuals/line/arrow.py +289 -0
  442. vispy/visuals/line/dash_atlas.py +90 -0
  443. vispy/visuals/line/line.py +545 -0
  444. vispy/visuals/line_plot.py +135 -0
  445. vispy/visuals/linear_region.py +199 -0
  446. vispy/visuals/markers.py +1088 -0
  447. vispy/visuals/mesh.py +373 -0
  448. vispy/visuals/mesh_normals.py +159 -0
  449. vispy/visuals/plane.py +54 -0
  450. vispy/visuals/polygon.py +145 -0
  451. vispy/visuals/rectangle.py +196 -0
  452. vispy/visuals/regular_polygon.py +56 -0
  453. vispy/visuals/scrolling_lines.py +197 -0
  454. vispy/visuals/shaders/__init__.py +17 -0
  455. vispy/visuals/shaders/compiler.py +206 -0
  456. vispy/visuals/shaders/expression.py +99 -0
  457. vispy/visuals/shaders/function.py +788 -0
  458. vispy/visuals/shaders/multiprogram.py +145 -0
  459. vispy/visuals/shaders/parsing.py +140 -0
  460. vispy/visuals/shaders/program.py +161 -0
  461. vispy/visuals/shaders/shader_object.py +162 -0
  462. vispy/visuals/shaders/tests/__init__.py +0 -0
  463. vispy/visuals/shaders/tests/test_function.py +486 -0
  464. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  465. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  466. vispy/visuals/shaders/variable.py +272 -0
  467. vispy/visuals/spectrogram.py +169 -0
  468. vispy/visuals/sphere.py +80 -0
  469. vispy/visuals/surface_plot.py +192 -0
  470. vispy/visuals/tests/__init__.py +0 -0
  471. vispy/visuals/tests/test_arrows.py +109 -0
  472. vispy/visuals/tests/test_axis.py +120 -0
  473. vispy/visuals/tests/test_collections.py +15 -0
  474. vispy/visuals/tests/test_colorbar.py +179 -0
  475. vispy/visuals/tests/test_colormap.py +97 -0
  476. vispy/visuals/tests/test_ellipse.py +122 -0
  477. vispy/visuals/tests/test_gridlines.py +30 -0
  478. vispy/visuals/tests/test_histogram.py +24 -0
  479. vispy/visuals/tests/test_image.py +392 -0
  480. vispy/visuals/tests/test_image_complex.py +36 -0
  481. vispy/visuals/tests/test_infinite_line.py +53 -0
  482. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  483. vispy/visuals/tests/test_isosurface.py +22 -0
  484. vispy/visuals/tests/test_linear_region.py +152 -0
  485. vispy/visuals/tests/test_markers.py +135 -0
  486. vispy/visuals/tests/test_mesh.py +261 -0
  487. vispy/visuals/tests/test_mesh_normals.py +218 -0
  488. vispy/visuals/tests/test_polygon.py +112 -0
  489. vispy/visuals/tests/test_rectangle.py +163 -0
  490. vispy/visuals/tests/test_regular_polygon.py +111 -0
  491. vispy/visuals/tests/test_scalable_textures.py +196 -0
  492. vispy/visuals/tests/test_sdf.py +73 -0
  493. vispy/visuals/tests/test_spectrogram.py +42 -0
  494. vispy/visuals/tests/test_surface_plot.py +57 -0
  495. vispy/visuals/tests/test_text.py +95 -0
  496. vispy/visuals/tests/test_volume.py +542 -0
  497. vispy/visuals/tests/test_windbarb.py +33 -0
  498. vispy/visuals/text/__init__.py +7 -0
  499. vispy/visuals/text/_sdf_cpu.cpython-310-x86_64-linux-gnu.so +0 -0
  500. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  501. vispy/visuals/text/_sdf_gpu.py +316 -0
  502. vispy/visuals/text/text.py +689 -0
  503. vispy/visuals/transforms/__init__.py +34 -0
  504. vispy/visuals/transforms/_util.py +191 -0
  505. vispy/visuals/transforms/base_transform.py +233 -0
  506. vispy/visuals/transforms/chain.py +300 -0
  507. vispy/visuals/transforms/interactive.py +98 -0
  508. vispy/visuals/transforms/linear.py +564 -0
  509. vispy/visuals/transforms/nonlinear.py +398 -0
  510. vispy/visuals/transforms/tests/__init__.py +0 -0
  511. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  512. vispy/visuals/transforms/transform_system.py +339 -0
  513. vispy/visuals/tube.py +173 -0
  514. vispy/visuals/visual.py +923 -0
  515. vispy/visuals/volume.py +1366 -0
  516. vispy/visuals/windbarb.py +291 -0
  517. vispy/visuals/xyz_axis.py +34 -0
  518. vispy-0.16.1.dist-info/METADATA +243 -0
  519. vispy-0.16.1.dist-info/RECORD +522 -0
  520. vispy-0.16.1.dist-info/WHEEL +7 -0
  521. vispy-0.16.1.dist-info/licenses/LICENSE.txt +36 -0
  522. vispy-0.16.1.dist-info/top_level.txt +1 -0
vispy/__init__.py ADDED
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ """=====
6
+ Vispy
7
+ =====
8
+
9
+ Vispy is a **high-performance interactive 2D/3D data visualization
10
+ library**. Vispy leverages the computational power of modern **Graphics
11
+ Processing Units (GPUs)** through the **OpenGL** library to display very
12
+ large datasets.
13
+
14
+ For more information, see http://vispy.org.
15
+ """
16
+
17
+ from __future__ import division
18
+
19
+ __all__ = ['use', 'sys_info', 'set_log_level', 'test']
20
+
21
+ try:
22
+ from .version import version as __version__ # noqa
23
+ except ImportError:
24
+ # package is not installed
25
+ pass
26
+
27
+ from .util import config, set_log_level, keys, sys_info # noqa
28
+ from .util.wrappers import use, test # noqa
29
+
30
+
31
+ def _get_sg_image_scraper():
32
+ from .util.gallery_scraper import VisPyGalleryScraper
33
+ return VisPyGalleryScraper()
vispy/app/__init__.py ADDED
@@ -0,0 +1,15 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ """The app module defines three classes: Application, Canvas, and Timer.
5
+ On loading, vispy creates a default Application instance which can be used
6
+ via functions in the module's namespace.
7
+ """
8
+
9
+ from __future__ import division
10
+
11
+ from .application import Application # noqa
12
+ from ._default_app import use_app, create, run, quit, process_events # noqa
13
+ from .canvas import Canvas, MouseEvent, KeyEvent # noqa
14
+ from .timer import Timer # noqa
15
+ from . import base # noqa
@@ -0,0 +1,76 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ from .application import Application
6
+
7
+ # Initialize default app
8
+ # Only for use within *this* module.
9
+ # One should always call use_app() to obtain the default app.
10
+ default_app = None
11
+
12
+
13
+ def use_app(backend_name=None, call_reuse=True):
14
+ """Get/create the default Application object
15
+
16
+ It is safe to call this function multiple times, as long as
17
+ backend_name is None or matches the already selected backend.
18
+
19
+ Parameters
20
+ ----------
21
+ backend_name : str | None
22
+ The name of the backend application to use. If not specified, Vispy
23
+ tries to select a backend automatically. See ``vispy.use()`` for
24
+ details.
25
+ call_reuse : bool
26
+ Whether to call the backend's `reuse()` function (True by default).
27
+ Not implemented by default, but some backends need it. For example,
28
+ the notebook backends need to inject some JavaScript in a notebook as
29
+ soon as `use_app()` is called.
30
+
31
+ """
32
+ global default_app
33
+
34
+ # If we already have a default_app, raise error or return
35
+ if default_app is not None:
36
+ names = default_app.backend_name.lower().replace('(', ' ').strip(') ')
37
+ names = [name for name in names.split(' ') if name]
38
+ if backend_name and backend_name.lower() not in names:
39
+ raise RuntimeError('Can only select a backend once, already using '
40
+ '%s.' % names)
41
+ else:
42
+ if call_reuse:
43
+ default_app.reuse()
44
+ return default_app # Current backend matches backend_name
45
+
46
+ # Create default app
47
+ default_app = Application(backend_name)
48
+ return default_app
49
+
50
+
51
+ def create():
52
+ """Create the native application."""
53
+ use_app(call_reuse=False)
54
+ return default_app.create()
55
+
56
+
57
+ def run():
58
+ """Enter the native GUI event loop."""
59
+ use_app(call_reuse=False)
60
+ return default_app.run()
61
+
62
+
63
+ def quit():
64
+ """Quit the native GUI event loop."""
65
+ use_app(call_reuse=False)
66
+ return default_app.quit()
67
+
68
+
69
+ def process_events():
70
+ """Process all pending GUI events
71
+
72
+ If the mainloop is not running, this should be done regularly to
73
+ keep the visualization interactive and to keep the event system going.
74
+ """
75
+ use_app(call_reuse=False)
76
+ return default_app.process_events()
@@ -0,0 +1,148 @@
1
+ # Taken from Matplotlib to automatically detect any event loop currently
2
+ # in use.
3
+ # This code is copyright of Matplotlib, and their license is inlcuded at the
4
+ # bottom of this file.
5
+
6
+ import sys
7
+ import os
8
+
9
+
10
+ def _get_running_interactive_framework():
11
+ """
12
+ Return the interactive framework whose event loop is currently running, if
13
+ any, or "headless" if no event loop can be started, or None.
14
+ Returns
15
+ -------
16
+ Optional[str]
17
+ One of the following values: "qt5", "qt4", "gtk3", "wx", "tk",
18
+ "macosx", "headless", ``None``.
19
+ """
20
+ QtWidgets = (sys.modules.get("PyQt5.QtWidgets")
21
+ or sys.modules.get("PySide2.QtWidgets"))
22
+ if QtWidgets and QtWidgets.QApplication.instance():
23
+ return "qt5"
24
+ QtGui = (sys.modules.get("PyQt4.QtGui")
25
+ or sys.modules.get("PySide.QtGui"))
26
+ if QtGui and QtGui.QApplication.instance():
27
+ return "qt4"
28
+ Gtk = sys.modules.get("gi.repository.Gtk")
29
+ if Gtk and Gtk.main_level():
30
+ return "gtk3"
31
+ wx = sys.modules.get("wx")
32
+ if wx and wx.GetApp():
33
+ return "wx"
34
+ tkinter = sys.modules.get("tkinter")
35
+ if tkinter:
36
+ for frame in sys._current_frames().values():
37
+ while frame:
38
+ if frame.f_code == tkinter.mainloop.__code__:
39
+ return "tk"
40
+ frame = frame.f_back
41
+ if 'matplotlib.backends._macosx' in sys.modules:
42
+ if sys.modules["matplotlib.backends._macosx"].event_loop_is_running():
43
+ return "macosx"
44
+ if sys.platform.startswith("linux") and not os.environ.get("DISPLAY"):
45
+ return "headless"
46
+ return None
47
+
48
+ """
49
+ License agreement for matplotlib versions 1.3.0 and later
50
+ =========================================================
51
+
52
+ 1. This LICENSE AGREEMENT is between the Matplotlib Development Team
53
+ ("MDT"), and the Individual or Organization ("Licensee") accessing and
54
+ otherwise using matplotlib software in source or binary form and its
55
+ associated documentation.
56
+
57
+ 2. Subject to the terms and conditions of this License Agreement, MDT
58
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license
59
+ to reproduce, analyze, test, perform and/or display publicly, prepare
60
+ derivative works, distribute, and otherwise use matplotlib
61
+ alone or in any derivative version, provided, however, that MDT's
62
+ License Agreement and MDT's notice of copyright, i.e., "Copyright (c)
63
+ 2012- Matplotlib Development Team; All Rights Reserved" are retained in
64
+ matplotlib alone or in any derivative version prepared by
65
+ Licensee.
66
+
67
+ 3. In the event Licensee prepares a derivative work that is based on or
68
+ incorporates matplotlib or any part thereof, and wants to
69
+ make the derivative work available to others as provided herein, then
70
+ Licensee hereby agrees to include in any such work a brief summary of
71
+ the changes made to matplotlib .
72
+
73
+ 4. MDT is making matplotlib available to Licensee on an "AS
74
+ IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
75
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND
76
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
77
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
78
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
79
+
80
+ 5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
81
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
82
+ LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
83
+ MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
84
+ THE POSSIBILITY THEREOF.
85
+
86
+ 6. This License Agreement will automatically terminate upon a material
87
+ breach of its terms and conditions.
88
+
89
+ 7. Nothing in this License Agreement shall be deemed to create any
90
+ relationship of agency, partnership, or joint venture between MDT and
91
+ Licensee. This License Agreement does not grant permission to use MDT
92
+ trademarks or trade name in a trademark sense to endorse or promote
93
+ products or services of Licensee, or any third party.
94
+
95
+ 8. By copying, installing or otherwise using matplotlib ,
96
+ Licensee agrees to be bound by the terms and conditions of this License
97
+ Agreement.
98
+
99
+ License agreement for matplotlib versions prior to 1.3.0
100
+ ========================================================
101
+
102
+ 1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the
103
+ Individual or Organization ("Licensee") accessing and otherwise using
104
+ matplotlib software in source or binary form and its associated
105
+ documentation.
106
+
107
+ 2. Subject to the terms and conditions of this License Agreement, JDH
108
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license
109
+ to reproduce, analyze, test, perform and/or display publicly, prepare
110
+ derivative works, distribute, and otherwise use matplotlib
111
+ alone or in any derivative version, provided, however, that JDH's
112
+ License Agreement and JDH's notice of copyright, i.e., "Copyright (c)
113
+ 2002-2011 John D. Hunter; All Rights Reserved" are retained in
114
+ matplotlib alone or in any derivative version prepared by
115
+ Licensee.
116
+
117
+ 3. In the event Licensee prepares a derivative work that is based on or
118
+ incorporates matplotlib or any part thereof, and wants to
119
+ make the derivative work available to others as provided herein, then
120
+ Licensee hereby agrees to include in any such work a brief summary of
121
+ the changes made to matplotlib.
122
+
123
+ 4. JDH is making matplotlib available to Licensee on an "AS
124
+ IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
125
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND
126
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
127
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
128
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
129
+
130
+ 5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
131
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
132
+ LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
133
+ MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
134
+ THE POSSIBILITY THEREOF.
135
+
136
+ 6. This License Agreement will automatically terminate upon a material
137
+ breach of its terms and conditions.
138
+
139
+ 7. Nothing in this License Agreement shall be deemed to create any
140
+ relationship of agency, partnership, or joint venture between JDH and
141
+ Licensee. This License Agreement does not grant permission to use JDH
142
+ trademarks or trade name in a trademark sense to endorse or promote
143
+ products or services of Licensee, or any third party.
144
+
145
+ 8. By copying, installing or otherwise using matplotlib,
146
+ Licensee agrees to be bound by the terms and conditions of this License
147
+ Agreement.
148
+ """
@@ -0,0 +1,263 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ """Implements the global singleton app object."""
6
+
7
+ from __future__ import division
8
+
9
+ import builtins
10
+ import os
11
+ import sys
12
+
13
+ from . import backends
14
+ from .backends import CORE_BACKENDS, BACKEND_NAMES, BACKENDMAP, TRIED_BACKENDS
15
+ from .. import config
16
+ from .base import BaseApplicationBackend as ApplicationBackend # noqa
17
+ from ._detect_eventloop import _get_running_interactive_framework
18
+ from ..util import logger
19
+
20
+
21
+ class Application(object):
22
+ """Representation of the vispy application
23
+
24
+ This wraps a native GUI application instance. Vispy has a default
25
+ instance of this class that can be created/obtained via
26
+ `vispy.app.use_app()`.
27
+
28
+ Parameters
29
+ ----------
30
+ backend_name : str | None
31
+ The name of the backend application to use. If not specified,
32
+ Vispy tries to select a backend automatically. See ``vispy.use()``
33
+ for details.
34
+
35
+ Notes
36
+ -----
37
+ Upon creating an Application object, a backend is selected, but the
38
+ native backend application object is only created when `create()`
39
+ is called or `native` is used. The Canvas and Timer do this
40
+ automatically.
41
+
42
+ """
43
+
44
+ def __init__(self, backend_name=None):
45
+ self._backend_module = None
46
+ self._backend = None
47
+ self._use(backend_name)
48
+
49
+ def __repr__(self):
50
+ name = self.backend_name
51
+ if not name:
52
+ return '<Vispy app with no backend>'
53
+ else:
54
+ return '<Vispy app, wrapping the %s GUI toolkit>' % name
55
+
56
+ @property
57
+ def backend_name(self):
58
+ """The name of the GUI backend that this app wraps."""
59
+ if self._backend is not None:
60
+ return self._backend._vispy_get_backend_name()
61
+ else:
62
+ return ''
63
+
64
+ @property
65
+ def backend_module(self):
66
+ """The module object that defines the backend."""
67
+ return self._backend_module
68
+
69
+ def process_events(self):
70
+ """Process all pending GUI events. If the mainloop is not
71
+ running, this should be done regularly to keep the visualization
72
+ interactive and to keep the event system going.
73
+ """
74
+ return self._backend._vispy_process_events()
75
+
76
+ def sleep(self, duration_sec):
77
+ """Sleep for the given duration in seconds.
78
+
79
+ This is used to reduce
80
+ CPU stress when VisPy is run in interactive mode.
81
+
82
+ Parameters
83
+ ----------
84
+ duration_sec: float
85
+ Time to sleep in seconds
86
+ """
87
+ self._backend._vispy_sleep(duration_sec)
88
+
89
+ def create(self):
90
+ """Create the native application."""
91
+ # Ensure that the native app exists
92
+ self.native
93
+
94
+ def is_interactive(self):
95
+ """Determine if the user requested interactive mode."""
96
+ # The Python interpreter sets sys.flags correctly, so use them!
97
+ if sys.flags.interactive:
98
+ return True
99
+
100
+ # IPython does not set sys.flags when -i is specified, so first
101
+ # check it if it is already imported.
102
+ if not hasattr(builtins, '__IPYTHON__'):
103
+ return False
104
+
105
+ # Then we check the application singleton and determine based on
106
+ # a variable it sets.
107
+ try:
108
+ try:
109
+ # ipython >=3.0
110
+ from traitlets.config.application import Application as App
111
+ except ImportError:
112
+ # ipython <3.0
113
+ from IPython.config.application import Application as App
114
+ return App.initialized() and App.instance().interact
115
+ except (ImportError, AttributeError):
116
+ return False
117
+
118
+ def is_notebook(self):
119
+ """Determine if the user is executing in a Jupyter Notebook"""
120
+ try:
121
+ # 'get_ipython' is available in globals when running from
122
+ # IPython/Jupyter
123
+ ip = get_ipython()
124
+ if ip.has_trait('kernel'):
125
+ # There doesn't seem to be an easy way to detect the frontend
126
+ # That said, if using a kernel, the user can choose to have an
127
+ # event loop, we therefore make sure the event loop isn't
128
+ # specified before assuming it is a notebook
129
+ # https://github.com/vispy/vispy/issues/1708
130
+ # https://github.com/ipython/ipython/issues/11920
131
+ return _get_running_interactive_framework() is None
132
+ else:
133
+ # `jupyter console` is used
134
+ return False
135
+ except NameError:
136
+ return False
137
+
138
+ def run(self, allow_interactive=True):
139
+ """Enter the native GUI event loop.
140
+
141
+ Parameters
142
+ ----------
143
+ allow_interactive : bool
144
+ Is the application allowed to handle interactive mode for console
145
+ terminals? By default, typing ``python -i main.py`` results in
146
+ an interactive shell that also regularly calls the VisPy event
147
+ loop. In this specific case, the run() function will terminate
148
+ immediately and rely on the interpreter's input loop to be run
149
+ after script execution.
150
+ """
151
+ if os.getenv("_VISPY_RUNNING_GALLERY_EXAMPLES"):
152
+ # Custom sphinx-gallery scraper in doc/conf.py will handle
153
+ # rendering/running the application. To make example scripts look
154
+ # like what a user actually has to run to view the window, we let
155
+ # them run "app.run()" but immediately return here.
156
+ # Without this the application would block until someone closed the
157
+ # window that opens.
158
+ return 0
159
+ elif not allow_interactive or not self.is_interactive():
160
+ return self._backend._vispy_run()
161
+
162
+ def reuse(self):
163
+ """Called when the application is reused in an interactive session.
164
+ This allow the backend to do stuff in the client when `use_app()` is
165
+ called multiple times by the user. For example, the notebook backends
166
+ need to inject JavaScript code as soon as `use_app()` is called.
167
+ """
168
+ return self._backend._vispy_reuse()
169
+
170
+ def quit(self):
171
+ """Quit the native GUI event loop."""
172
+ return self._backend._vispy_quit()
173
+
174
+ @property
175
+ def native(self):
176
+ """The native GUI application instance."""
177
+ return self._backend._vispy_get_native_app()
178
+
179
+ def _use(self, backend_name=None):
180
+ """Select a backend by name. See class docstring for details."""
181
+ # See if we're in a specific testing mode, if so DONT check to see
182
+ # if it's a valid backend. If it isn't, it's a good thing we
183
+ # get an error later because we should have decorated our test
184
+ # with requires_application()
185
+ test_name = os.getenv('_VISPY_TESTING_APP', None)
186
+
187
+ # Check whether the given name is valid
188
+ if backend_name is not None:
189
+ if backend_name.lower() == 'default':
190
+ backend_name = None # Explicitly use default, avoid using test
191
+ elif backend_name.lower() not in BACKENDMAP:
192
+ raise ValueError('backend_name must be one of %s or None, not '
193
+ '%r' % (BACKEND_NAMES, backend_name))
194
+ elif test_name is not None:
195
+ backend_name = test_name.lower()
196
+ assert backend_name in BACKENDMAP
197
+ elif self.is_notebook():
198
+ backend_name = 'jupyter_rfb'
199
+
200
+ # Should we try and load any backend, or just this specific one?
201
+ try_others = backend_name is None
202
+
203
+ # Get backends to try ...
204
+ imported_toolkits = [] # Backends for which the native lib is imported
205
+ backends_to_try = []
206
+ if not try_others:
207
+ # We should never hit this, since we check above
208
+ assert backend_name.lower() in BACKENDMAP.keys()
209
+ # Add it
210
+ backends_to_try.append(backend_name.lower())
211
+ else:
212
+ # See if a backend is loaded
213
+ for name, module_name, native_module_name in CORE_BACKENDS:
214
+ if native_module_name and native_module_name in sys.modules:
215
+ imported_toolkits.append(name.lower())
216
+ backends_to_try.append(name.lower())
217
+ # See if a default is given
218
+ default_backend = config['default_backend'].lower()
219
+ if default_backend.lower() in BACKENDMAP.keys():
220
+ if default_backend not in backends_to_try:
221
+ backends_to_try.append(default_backend)
222
+ # After this, try each one
223
+ for name, module_name, native_module_name in CORE_BACKENDS:
224
+ name = name.lower()
225
+ if name not in backends_to_try:
226
+ backends_to_try.append(name)
227
+
228
+ # Now try each one
229
+ for key in backends_to_try:
230
+ name, module_name, native_module_name = BACKENDMAP[key]
231
+ TRIED_BACKENDS.append(name)
232
+ mod_name = 'backends.' + module_name
233
+ __import__(mod_name, globals(), level=1)
234
+ mod = getattr(backends, module_name)
235
+ if not mod.available:
236
+ msg = ('Could not import backend "%s":\n%s'
237
+ % (name, str(mod.why_not)))
238
+ if not try_others:
239
+ # Fail if user wanted to use a specific backend
240
+ raise RuntimeError(msg)
241
+ elif key in imported_toolkits:
242
+ # Warn if were unable to use an already imported toolkit
243
+ msg = ('Although %s is already imported, the %s backend '
244
+ 'could not\nbe used ("%s"). \nNote that running '
245
+ 'multiple GUI toolkits simultaneously can cause '
246
+ 'side effects.' %
247
+ (native_module_name, name, str(mod.why_not)))
248
+ logger.warning(msg)
249
+ elif backend_name is not None:
250
+ # Inform only if one isn't available
251
+ logger.warning(msg)
252
+ else:
253
+ # Success!
254
+ self._backend_module = mod
255
+ logger.info('Selected backend %s' % module_name)
256
+ break
257
+ else:
258
+ raise RuntimeError('Could not import any of the backends. '
259
+ 'You need to install any of %s. We recommend '
260
+ 'PyQt' % [b[0] for b in CORE_BACKENDS])
261
+
262
+ # Store classes for app backend and canvas backend
263
+ self._backend = self.backend_module.ApplicationBackend()
@@ -0,0 +1,52 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ """vispy.app.backends
6
+
7
+ The backend modules are dynamically imported when needed. This module
8
+ defines a small description of each supported backend, so that for
9
+ instance we can test whether the GUI toolkit for a backend is already
10
+ imported. This stuff is mostly used in the Application.use method.
11
+ """
12
+
13
+ # Define backends: name, vispy.app.backends.xxx module, native module name.
14
+ # This is the order in which they are attempted to be imported.
15
+ CORE_BACKENDS = [
16
+ ('PyQt4', '_pyqt4', 'PyQt4'),
17
+ ('PyQt5', '_pyqt5', 'PyQt5'),
18
+ ('PyQt6', '_pyqt6', 'PyQt6'),
19
+ ('PySide', '_pyside', 'PySide'),
20
+ ('PySide2', '_pyside2', 'PySide2'),
21
+ ('PySide6', '_pyside6', 'PySide6'),
22
+ ('Pyglet', '_pyglet', 'pyglet'),
23
+ ('Glfw', '_glfw', 'vispy.ext.glfw'),
24
+ ('SDL2', '_sdl2', 'sdl2'),
25
+ ('wx', '_wx', 'wx'),
26
+ ('EGL', '_egl', 'vispy.ext.egl'),
27
+ ('osmesa', '_osmesa', 'vispy.ext.osmesa'),
28
+ ('tkinter', '_tk', 'tkinter'),
29
+ ]
30
+
31
+ # Whereas core backends really represents libraries that can create a
32
+ # canvas, the pseudo backends act more like a proxy.
33
+ PSEUDO_BACKENDS = [
34
+ ('jupyter_rfb', '_jupyter_rfb', None),
35
+ ('_test', '_test', 'vispy.app.backends._test'), # add one that will fail
36
+ ]
37
+
38
+ # Combine
39
+ BACKENDS = CORE_BACKENDS + PSEUDO_BACKENDS
40
+
41
+ # Get list of backend names
42
+ BACKEND_NAMES = [b[0].lower() for b in BACKENDS]
43
+
44
+ # Map of the lowercase backend names to the backend descriptions above
45
+ # so that we can look up its properties if we only have a name.
46
+ BACKENDMAP = dict([(be[0].lower(), be) for be in BACKENDS])
47
+
48
+ # List of attempted backends. For logging.
49
+ TRIED_BACKENDS = []
50
+
51
+ # Flag for _pyside, _pyside2 _pyqt4 and _qt modules to communicate.
52
+ qt_lib = None