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.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +518 -0
- vispy/app/backends/_jupyter_rfb.py +292 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +476 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1040 -0
- vispy/app/backends/_sdl2.py +449 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +829 -0
- vispy/app/backends/_wx.py +492 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +290 -0
- vispy/app/canvas.py +833 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1829 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +544 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +106 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +646 -0
- vispy/scene/events.py +92 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +629 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +489 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +28 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +46 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +34 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/conftest.py +25 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +34 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +71 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +703 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +151 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +1088 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +135 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-310-x86_64-linux-gnu.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +689 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.16.1.dist-info/METADATA +243 -0
- vispy-0.16.1.dist-info/RECORD +522 -0
- vispy-0.16.1.dist-info/WHEEL +7 -0
- vispy-0.16.1.dist-info/licenses/LICENSE.txt +36 -0
- 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
|
+
"""
|
vispy/app/application.py
ADDED
|
@@ -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
|