Kivy-examples 2.3.1.dev0__py3-none-any.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.
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/main.py +77 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/monkey.obj +7966 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/objloader.py +147 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/simple.glsl +47 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/editor.kv +72 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/main.py +64 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/compass.kv +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/main.py +77 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/needle.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/rose.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/main.py +80 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/shadow32.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/takepicture.kv +40 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/animation/animate.py +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite.py +152 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite_data/testkvdir.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_build.py +24 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_config.py +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv.py +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv_in_template1.py +27 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/template1/test.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/test.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/testkvfile.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_advanced.py +90 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_basic.py +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_advanced.py +93 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_basic.py +58 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12908_sweet_trip_mm_clap_hi.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12909_sweet_trip_mm_clap_lo.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12910_sweet_trip_mm_clap_mid.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12911_sweet_trip_mm_hat_cl.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12913_sweet_trip_mm_kick_hi.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12914_sweet_trip_mm_kick_lo.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12915_sweet_trip_mm_kick_mid.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12916_sweet_trip_mm_kwik_mod_01.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12917_sweet_trip_mm_kwik_mod_02.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12918_sweet_trip_mm_kwik_mod_03.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12919_sweet_trip_mm_kwik_mod_04.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12920_sweet_trip_mm_kwik_mod_05.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12921_sweet_trip_mm_kwik_mod_06.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12922_sweet_trip_mm_kwik_mod_07.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12923_sweet_trip_mm_metal_clave.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12925_sweet_trip_mm_sweep_x.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12926_sweet_trip_mm_sweep_y.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12927_sweet_trip_mm_sweep_z.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/audio.kv +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/main.py +81 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/pitch.py +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/camera/main.py +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/bezier.py +105 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/canvas_stress.py +72 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/circle.py +84 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/fbo_canvas.py +91 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/kiwi.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines.py +296 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines_extended.py +183 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh.py +57 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh_manipulation.py +101 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture1.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture2.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/multitexture.py +110 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/repeat_texture.py +65 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rotation.py +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rounded_rectangle.py +153 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/scale.py +37 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/stencil_canvas.py +85 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/tesselate.py +146 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture.py +143 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture_example_image.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/1.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/2.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/3.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/root.kv +32 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/main.py +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_image.py +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_video.py +31 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/camera_puzzle.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/AnchorLayoutContainer.kv +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/BoxLayoutContainer.kv +14 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ButtonContainer.kv +27 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/CheckBoxContainer.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FileChooserContainer.kv +19 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FloatLayoutContainer.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/GridLayoutContainer.kv +20 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/LabelContainer.kv +62 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/MediaContainer.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PopupContainer.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ProgressBarContainer.kv +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/RestContainer.kv +5 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ScatterContainer.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/SelectorsContainer.kv +10 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/TextContainer.kv +20 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/kivycatalog.kv +144 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/main.py +192 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.kv +117 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.py +180 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/helpers.py +30 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.kv +164 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.py +276 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/main.py +144 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/multistroke.kv +101 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.kv +110 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.py +97 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Bubbles.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Ill1.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Wall.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/faust_github.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/main.py +73 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/pictures.kv +57 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/shadow32.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/main.py +147 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/shadereditor.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/README.txt +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/background.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/faust_github.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/README +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/bug.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-left.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-right.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/accordions.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/bubbles.kv +33 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/buttons.kv +26 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/carousel.kv +51 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/checkboxes.kv +33 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/codeinput.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/dropdown.kv +40 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/filechoosers.kv +24 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/popups.kv +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/progressbar.kv +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/rstdocument.kv +24 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/scatter.kv +14 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/screenmanager.kv +46 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/sliders.kv +55 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/spinner.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/splitter.kv +13 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/switches.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/tabbedpanel + layouts.kv +69 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/textinputs.kv +48 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/togglebutton.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/main.py +243 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/showcase.kv +100 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/README.txt +12 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/icon.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/main.py +170 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/particle.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/touchtracer.kv +29 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_client_app.py +82 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_server_app.py +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/twistd_app.py +66 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/gesture_board.py +95 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/my_gestures.py +90 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/controller.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/main.py +29 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/1_skeleton.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/2_print_touch.py +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/3_draw_ellipse.py +22 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/4_draw_line.py +26 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/5_random_colors.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/6_button.py +38 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/quickstart/main.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/button.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/layout.kv +6 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/main.py +19 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/test.kv +5 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/main.py +226 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/numeric.json +38 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/README.txt +13 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/kinectviewer.py +283 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_button.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_camera.kv +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_fbo.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_layout.kv +23 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_logo.kv +36 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_scatter.kv +6 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_stencil.kv +27 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_video.kv +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/builder_template.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/id_in_kv.py +20 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/test.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/kv_and_py.py +34 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/test.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kivy.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kvrun.py +38 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/clipboard.py +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/custom_titlebar.py +56 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/imagesave.py +14 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/joystick.py +83 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/multiple_dropfile.py +51 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/on_textedit_event.py +104 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/opacitywindow.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapecollisions.py +397 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapedwindow.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/two_panes.py +47 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/urlrequest.py +128 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/main.py +122 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.py +86 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.kv +91 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.py +102 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.kv +29 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.py +193 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/tex3.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/benchmark.py +19 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/cloud.svg +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main-smaa.py +155 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main.py +50 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/music.svg +68 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/rotated.svg +23 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/ship.svg +181 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/sun.svg +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/tiger.svg +813 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/text/pango_demo.py +296 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/data/icon.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/main.py +163 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/note.kv +154 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/main.py +82 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/pong.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/main.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/pong.kv +2 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/main.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/pong.kv +21 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/main.py +26 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/pong.kv +31 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/main.py +48 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/pong.kv +34 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/main.py +75 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/pong.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/accordion_1.py +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/actionbar.py +32 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/asyncimage.py +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/boxlayout_poshint.py +54 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/bubble_test.py +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/camera.py +33 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/carousel_buttons.py +50 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.mpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinput.py +225 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinputtest.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorpicker.py +234 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorusage.py +62 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/compound_selection.py +83 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/customcollide.py +82 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget.py +193 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget2.py +47 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget3_advanced.py +62 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/fbowidget.py +111 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/focus_behavior.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/image_mipmap.py +31 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/keyboardlistener.py +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_mipmap.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_sizing.py +193 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_text_size.py +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_with_markup.py +21 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/lang_dynamic_classes.py +18 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/pagelayout.py +64 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/popup_with_kv.py +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/basic_data.py +124 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/infinite_scrolling.py +143 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/key_viewclass.py +149 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/messenger.py +196 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/pull_to_refresh.py +95 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/rv_animate_items.py +109 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/rstexample.py +128 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.py +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/screenmanager.py +106 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.py +40 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/bird.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white_animated.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/cube.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/simple_cv_joint_animated.gif +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.kv +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.py +150 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/__init__.py +7 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/custom_button.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/settings.py +93 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/shorten_text.py +80 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/spinner.py +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/splitter.py +74 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbed_panel_showcase.py +316 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbedpanel.py +50 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.kv +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.py +48 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textinput.py +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/unicode_textinput.py +244 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/videoplayer.py +26 -0
- Kivy_examples-2.3.1.dev0.dist-info/AUTHORS +66 -0
- Kivy_examples-2.3.1.dev0.dist-info/LICENSE +21 -0
- Kivy_examples-2.3.1.dev0.dist-info/METADATA +382 -0
- Kivy_examples-2.3.1.dev0.dist-info/RECORD +624 -0
- Kivy_examples-2.3.1.dev0.dist-info/WHEEL +5 -0
- Kivy_examples-2.3.1.dev0.dist-info/dependency_links.txt +1 -0
- Kivy_examples-2.3.1.dev0.dist-info/top_level.txt +1 -0
- kivy/__init__.py +519 -0
- kivy/_version.py +18 -0
- kivy/animation.py +831 -0
- kivy/app.py +1213 -0
- kivy/atlas.py +456 -0
- kivy/base.py +617 -0
- kivy/cache.py +262 -0
- kivy/clock.py +1172 -0
- kivy/compat.py +82 -0
- kivy/config.py +1004 -0
- kivy/context.py +102 -0
- kivy/core/__init__.py +247 -0
- kivy/core/audio/__init__.py +223 -0
- kivy/core/audio/audio_android.py +104 -0
- kivy/core/audio/audio_avplayer.py +82 -0
- kivy/core/audio/audio_ffpyplayer.py +185 -0
- kivy/core/audio/audio_gstplayer.py +101 -0
- kivy/core/audio/audio_pygame.py +127 -0
- kivy/core/camera/__init__.py +151 -0
- kivy/core/camera/camera_android.py +206 -0
- kivy/core/camera/camera_gi.py +170 -0
- kivy/core/camera/camera_opencv.py +163 -0
- kivy/core/camera/camera_picamera.py +96 -0
- kivy/core/clipboard/__init__.py +157 -0
- kivy/core/clipboard/_clipboard_ext.py +36 -0
- kivy/core/clipboard/clipboard_android.py +91 -0
- kivy/core/clipboard/clipboard_dbusklipper.py +41 -0
- kivy/core/clipboard/clipboard_dummy.py +26 -0
- kivy/core/clipboard/clipboard_gtk3.py +47 -0
- kivy/core/clipboard/clipboard_nspaste.py +44 -0
- kivy/core/clipboard/clipboard_pygame.py +67 -0
- kivy/core/clipboard/clipboard_sdl2.py +36 -0
- kivy/core/clipboard/clipboard_winctypes.py +107 -0
- kivy/core/clipboard/clipboard_xclip.py +29 -0
- kivy/core/clipboard/clipboard_xsel.py +26 -0
- kivy/core/gl/__init__.py +90 -0
- kivy/core/image/__init__.py +996 -0
- kivy/core/image/img_dds.py +40 -0
- kivy/core/image/img_ffpyplayer.py +87 -0
- kivy/core/image/img_pil.py +123 -0
- kivy/core/image/img_pygame.py +119 -0
- kivy/core/image/img_sdl2.py +66 -0
- kivy/core/image/img_tex.py +58 -0
- kivy/core/spelling/__init__.py +135 -0
- kivy/core/spelling/spelling_enchant.py +50 -0
- kivy/core/spelling/spelling_osxappkit.py +64 -0
- kivy/core/text/__init__.py +1090 -0
- kivy/core/text/markup.py +893 -0
- kivy/core/text/text_pango.py +145 -0
- kivy/core/text/text_pil.py +84 -0
- kivy/core/text/text_pygame.py +117 -0
- kivy/core/text/text_sdl2.py +50 -0
- kivy/core/video/__init__.py +219 -0
- kivy/core/video/video_ffmpeg.py +106 -0
- kivy/core/video/video_ffpyplayer.py +449 -0
- kivy/core/video/video_gstplayer.py +140 -0
- kivy/core/video/video_null.py +12 -0
- kivy/core/window/__init__.py +2515 -0
- kivy/core/window/window_egl_rpi.py +86 -0
- kivy/core/window/window_pygame.py +441 -0
- kivy/core/window/window_sdl2.py +999 -0
- kivy/deps/__init__.py +6 -0
- kivy/effects/__init__.py +23 -0
- kivy/effects/dampedscroll.py +114 -0
- kivy/effects/kinetic.py +193 -0
- kivy/effects/opacityscroll.py +27 -0
- kivy/effects/scroll.py +126 -0
- kivy/event.py +12 -0
- kivy/eventmanager/__init__.py +185 -0
- kivy/extras/__init__.py +0 -0
- kivy/extras/highlight.py +52 -0
- kivy/factory.py +190 -0
- kivy/factory_registers.py +201 -0
- kivy/garden/__init__.py +186 -0
- kivy/geometry.py +121 -0
- kivy/gesture.py +424 -0
- kivy/graphics/__init__.py +126 -0
- kivy/graphics/cgl_backend/__init__.py +0 -0
- kivy/input/__init__.py +39 -0
- kivy/input/factory.py +35 -0
- kivy/input/motionevent.py +587 -0
- kivy/input/postproc/__init__.py +27 -0
- kivy/input/postproc/calibration.py +200 -0
- kivy/input/postproc/dejitter.py +74 -0
- kivy/input/postproc/doubletap.py +101 -0
- kivy/input/postproc/ignorelist.py +47 -0
- kivy/input/postproc/retaintouch.py +93 -0
- kivy/input/postproc/tripletap.py +106 -0
- kivy/input/provider.py +40 -0
- kivy/input/providers/__init__.py +68 -0
- kivy/input/providers/androidjoystick.py +117 -0
- kivy/input/providers/hidinput.py +778 -0
- kivy/input/providers/leapfinger.py +113 -0
- kivy/input/providers/linuxwacom.py +396 -0
- kivy/input/providers/mactouch.py +220 -0
- kivy/input/providers/mouse.py +424 -0
- kivy/input/providers/mtdev.py +380 -0
- kivy/input/providers/probesysfs.py +254 -0
- kivy/input/providers/tuio.py +326 -0
- kivy/input/providers/wm_common.py +162 -0
- kivy/input/providers/wm_pen.py +121 -0
- kivy/input/providers/wm_touch.py +157 -0
- kivy/input/recorder.py +335 -0
- kivy/input/shape.py +27 -0
- kivy/interactive.py +335 -0
- kivy/lang/__init__.py +883 -0
- kivy/lang/builder.py +1004 -0
- kivy/lang/parser.py +822 -0
- kivy/lib/__init__.py +21 -0
- kivy/lib/ddsfile.py +419 -0
- kivy/lib/gstplayer/__init__.py +27 -0
- kivy/lib/mtdev.py +254 -0
- kivy/lib/vidcore_lite/__init__.py +0 -0
- kivy/loader.py +579 -0
- kivy/logger.py +646 -0
- kivy/metrics.py +421 -0
- kivy/modules/__init__.py +300 -0
- kivy/modules/_webdebugger.py +200 -0
- kivy/modules/console.py +1059 -0
- kivy/modules/cursor.py +75 -0
- kivy/modules/inspector.py +755 -0
- kivy/modules/joycursor.py +299 -0
- kivy/modules/keybinding.py +64 -0
- kivy/modules/monitor.py +90 -0
- kivy/modules/recorder.py +94 -0
- kivy/modules/screen.py +183 -0
- kivy/modules/showborder.py +33 -0
- kivy/modules/touchring.py +97 -0
- kivy/modules/webdebugger.py +30 -0
- kivy/multistroke.py +1477 -0
- kivy/network/__init__.py +7 -0
- kivy/network/urlrequest.py +794 -0
- kivy/parser.py +154 -0
- kivy/resources.py +102 -0
- kivy/storage/__init__.py +405 -0
- kivy/storage/dictstore.py +98 -0
- kivy/storage/jsonstore.py +92 -0
- kivy/storage/redisstore.py +103 -0
- kivy/support.py +267 -0
- kivy/tests/__init__.py +11 -0
- kivy/tests/async_common.py +568 -0
- kivy/tests/common.py +524 -0
- kivy/tests/conftest.py +33 -0
- kivy/tests/fixtures.py +169 -0
- kivy/tests/perf_test_textinput.py +195 -0
- kivy/tests/pyinstaller/simple_widget/main.py +12 -0
- kivy/tests/pyinstaller/simple_widget/project/__init__.py +0 -0
- kivy/tests/pyinstaller/simple_widget/project/widget.py +12 -0
- kivy/tests/pyinstaller/test_pyinstaller.py +115 -0
- kivy/tests/pyinstaller/video_widget/main.py +6 -0
- kivy/tests/pyinstaller/video_widget/project/__init__.py +38 -0
- kivy/tests/test_animations.py +415 -0
- kivy/tests/test_app.py +216 -0
- kivy/tests/test_audio.py +69 -0
- kivy/tests/test_benchmark.py +292 -0
- kivy/tests/test_clipboard.py +48 -0
- kivy/tests/test_clock.py +292 -0
- kivy/tests/test_compat.py +6 -0
- kivy/tests/test_config.py +35 -0
- kivy/tests/test_coverage.py +83 -0
- kivy/tests/test_doc_gallery.py +38 -0
- kivy/tests/test_environ_cli.py +50 -0
- kivy/tests/test_fbo_py2py3.py +74 -0
- kivy/tests/test_filechooser.py +11 -0
- kivy/tests/test_filechooser_unicode.py +82 -0
- kivy/tests/test_fonts.py +42 -0
- kivy/tests/test_garden.py +23 -0
- kivy/tests/test_graphics.py +1149 -0
- kivy/tests/test_graphics_svg.py +84 -0
- kivy/tests/test_image.py +74 -0
- kivy/tests/test_imageloader.py +485 -0
- kivy/tests/test_invalid_lang.py +42 -0
- kivy/tests/test_issues/test_6315.py +55 -0
- kivy/tests/test_issues/test_issue_1084.py +47 -0
- kivy/tests/test_issues/test_issue_1091.py +19 -0
- kivy/tests/test_issues/test_issue_599.py +21 -0
- kivy/tests/test_issues/test_issue_609.py +19 -0
- kivy/tests/test_issues/test_issue_6909.py +28 -0
- kivy/tests/test_issues/test_issue_883.py +12 -0
- kivy/tests/test_kivy_init.py +30 -0
- kivy/tests/test_knspace.py +247 -0
- kivy/tests/test_lang.py +431 -0
- kivy/tests/test_lang_complex.py +87 -0
- kivy/tests/test_lang_pre_process_and_post_process.py +394 -0
- kivy/tests/test_logger.py +516 -0
- kivy/tests/test_metrics.py +30 -0
- kivy/tests/test_module_inspector.py +382 -0
- kivy/tests/test_motion_event.py +44 -0
- kivy/tests/test_mouse_hover_event.py +249 -0
- kivy/tests/test_mouse_multitouchsim.py +554 -0
- kivy/tests/test_multistroke.py +389 -0
- kivy/tests/test_properties.py +1332 -0
- kivy/tests/test_resources.py +79 -0
- kivy/tests/test_rst_replace.py +63 -0
- kivy/tests/test_screen.py +38 -0
- kivy/tests/test_storage.py +135 -0
- kivy/tests/test_uix_actionbar.py +363 -0
- kivy/tests/test_uix_anchorlayout.py +79 -0
- kivy/tests/test_uix_asyncimage.py +133 -0
- kivy/tests/test_uix_boxlayout.py +94 -0
- kivy/tests/test_uix_bubble.py +425 -0
- kivy/tests/test_uix_carousel.py +93 -0
- kivy/tests/test_uix_colorpicker.py +77 -0
- kivy/tests/test_uix_dropdown.py +91 -0
- kivy/tests/test_uix_gridlayout.py +244 -0
- kivy/tests/test_uix_layout.py +16 -0
- kivy/tests/test_uix_modal.py +101 -0
- kivy/tests/test_uix_recyclegridlayout.py +383 -0
- kivy/tests/test_uix_relativelayout.py +30 -0
- kivy/tests/test_uix_scrollview.py +358 -0
- kivy/tests/test_uix_settings.py +33 -0
- kivy/tests/test_uix_slider.py +156 -0
- kivy/tests/test_uix_stacklayout.py +120 -0
- kivy/tests/test_uix_textinput.py +577 -0
- kivy/tests/test_uix_translate_coordinates.py +72 -0
- kivy/tests/test_uix_videoplayer.py +112 -0
- kivy/tests/test_uix_widget.py +137 -0
- kivy/tests/test_urlrequest/test_urlrequest_requests.py +378 -0
- kivy/tests/test_urlrequest/test_urlrequest_urllib.py +155 -0
- kivy/tests/test_utils.py +237 -0
- kivy/tests/test_vector.py +256 -0
- kivy/tests/test_video.py +25 -0
- kivy/tests/test_weakmethod.py +44 -0
- kivy/tests/test_widget.py +127 -0
- kivy/tests/test_widget_walk.py +70 -0
- kivy/tests/test_window_base.py +60 -0
- kivy/tests/test_window_info.py +29 -0
- kivy/tests/visual_test_label.py +291 -0
- kivy/tools/__init__.py +44 -0
- kivy/tools/benchmark.py +286 -0
- kivy/tools/changelog_parser.py +120 -0
- kivy/tools/coverage.py +135 -0
- kivy/tools/gallery.py +323 -0
- kivy/tools/generate-icons.py +117 -0
- kivy/tools/gles_compat/subset_gles.py +125 -0
- kivy/tools/highlight/__init__.py +9 -0
- kivy/tools/kviewer.py +80 -0
- kivy/tools/packaging/__init__.py +12 -0
- kivy/tools/packaging/cython_cfg.py +82 -0
- kivy/tools/packaging/factory.py +105 -0
- kivy/tools/packaging/pyinstaller_hooks/__init__.py +381 -0
- kivy/tools/packaging/pyinstaller_hooks/__main__.py +29 -0
- kivy/tools/packaging/pyinstaller_hooks/hook-kivy.py +9 -0
- kivy/tools/packaging/pyinstaller_hooks/pyi_rth_kivy.py +17 -0
- kivy/tools/pep8checker/pep8.py +2316 -0
- kivy/tools/pep8checker/pep8kivy.py +109 -0
- kivy/tools/report.py +223 -0
- kivy/tools/stub-gl-debug.py +201 -0
- kivy/tools/texturecompress.py +233 -0
- kivy/uix/__init__.py +56 -0
- kivy/uix/accordion.py +484 -0
- kivy/uix/actionbar.py +934 -0
- kivy/uix/anchorlayout.py +122 -0
- kivy/uix/behaviors/__init__.py +95 -0
- kivy/uix/behaviors/button.py +212 -0
- kivy/uix/behaviors/codenavigation.py +167 -0
- kivy/uix/behaviors/compoundselection.py +688 -0
- kivy/uix/behaviors/cover.py +160 -0
- kivy/uix/behaviors/drag.py +234 -0
- kivy/uix/behaviors/emacs.py +140 -0
- kivy/uix/behaviors/focus.py +595 -0
- kivy/uix/behaviors/knspace.py +590 -0
- kivy/uix/behaviors/togglebutton.py +156 -0
- kivy/uix/behaviors/touchripple.py +318 -0
- kivy/uix/boxlayout.py +331 -0
- kivy/uix/bubble.py +576 -0
- kivy/uix/button.py +137 -0
- kivy/uix/camera.py +118 -0
- kivy/uix/carousel.py +695 -0
- kivy/uix/checkbox.py +197 -0
- kivy/uix/codeinput.py +238 -0
- kivy/uix/colorpicker.py +486 -0
- kivy/uix/dropdown.py +391 -0
- kivy/uix/effectwidget.py +772 -0
- kivy/uix/filechooser.py +1134 -0
- kivy/uix/floatlayout.py +148 -0
- kivy/uix/gesturesurface.py +625 -0
- kivy/uix/gridlayout.py +629 -0
- kivy/uix/image.py +528 -0
- kivy/uix/label.py +1200 -0
- kivy/uix/layout.py +322 -0
- kivy/uix/modalview.py +339 -0
- kivy/uix/pagelayout.py +233 -0
- kivy/uix/popup.py +266 -0
- kivy/uix/progressbar.py +95 -0
- kivy/uix/recycleboxlayout.py +183 -0
- kivy/uix/recyclegridlayout.py +255 -0
- kivy/uix/recyclelayout.py +446 -0
- kivy/uix/recycleview/__init__.py +624 -0
- kivy/uix/recycleview/datamodel.py +194 -0
- kivy/uix/recycleview/layout.py +253 -0
- kivy/uix/recycleview/views.py +423 -0
- kivy/uix/relativelayout.py +324 -0
- kivy/uix/rst.py +1492 -0
- kivy/uix/sandbox.py +198 -0
- kivy/uix/scatter.py +645 -0
- kivy/uix/scatterlayout.py +93 -0
- kivy/uix/screenmanager.py +1275 -0
- kivy/uix/scrollview.py +1288 -0
- kivy/uix/settings.py +1343 -0
- kivy/uix/slider.py +421 -0
- kivy/uix/spinner.py +221 -0
- kivy/uix/splitter.py +430 -0
- kivy/uix/stacklayout.py +331 -0
- kivy/uix/stencilview.py +40 -0
- kivy/uix/switch.py +122 -0
- kivy/uix/tabbedpanel.py +880 -0
- kivy/uix/textinput.py +4049 -0
- kivy/uix/togglebutton.py +37 -0
- kivy/uix/treeview.py +665 -0
- kivy/uix/video.py +302 -0
- kivy/uix/videoplayer.py +697 -0
- kivy/uix/vkeyboard.py +879 -0
- kivy/uix/widget.py +1629 -0
- kivy/utils.py +550 -0
- kivy/vector.py +412 -0
- kivy/weakmethod.py +72 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'''
|
|
2
|
+
FFmpeg video abstraction
|
|
3
|
+
========================
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 1.0.8
|
|
6
|
+
|
|
7
|
+
This abstraction requires ffmpeg python extensions. We have made a special
|
|
8
|
+
extension that is used for the android platform but can also be used on x86
|
|
9
|
+
platforms. The project is available at::
|
|
10
|
+
|
|
11
|
+
http://github.com/tito/ffmpeg-android
|
|
12
|
+
|
|
13
|
+
The extension is designed for implementing a video player.
|
|
14
|
+
Refer to the documentation of the ffmpeg-android project for more information
|
|
15
|
+
about the requirements.
|
|
16
|
+
'''
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
import ffmpeg
|
|
20
|
+
except:
|
|
21
|
+
raise
|
|
22
|
+
|
|
23
|
+
from kivy.core.video import VideoBase
|
|
24
|
+
from kivy.graphics.texture import Texture
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class VideoFFMpeg(VideoBase):
|
|
28
|
+
|
|
29
|
+
def __init__(self, **kwargs):
|
|
30
|
+
self._do_load = False
|
|
31
|
+
self._player = None
|
|
32
|
+
super(VideoFFMpeg, self).__init__(**kwargs)
|
|
33
|
+
|
|
34
|
+
def unload(self):
|
|
35
|
+
if self._player:
|
|
36
|
+
self._player.stop()
|
|
37
|
+
self._player = None
|
|
38
|
+
self._state = ''
|
|
39
|
+
self._do_load = False
|
|
40
|
+
|
|
41
|
+
def load(self):
|
|
42
|
+
self.unload()
|
|
43
|
+
|
|
44
|
+
def play(self):
|
|
45
|
+
if self._player:
|
|
46
|
+
self.unload()
|
|
47
|
+
self._player = ffmpeg.FFVideo(self._filename)
|
|
48
|
+
self._player.set_volume(self._volume)
|
|
49
|
+
self._do_load = True
|
|
50
|
+
|
|
51
|
+
def stop(self):
|
|
52
|
+
self.unload()
|
|
53
|
+
|
|
54
|
+
def seek(self, percent, precise=True):
|
|
55
|
+
if self._player is None:
|
|
56
|
+
return
|
|
57
|
+
self._player.seek(percent)
|
|
58
|
+
|
|
59
|
+
def _do_eos(self):
|
|
60
|
+
self.unload()
|
|
61
|
+
self.dispatch('on_eos')
|
|
62
|
+
super(VideoFFMpeg, self)._do_eos()
|
|
63
|
+
|
|
64
|
+
def _update(self, dt):
|
|
65
|
+
if self._do_load:
|
|
66
|
+
self._player.open()
|
|
67
|
+
self._do_load = False
|
|
68
|
+
return
|
|
69
|
+
|
|
70
|
+
player = self._player
|
|
71
|
+
if player is None:
|
|
72
|
+
return
|
|
73
|
+
if not player.is_open:
|
|
74
|
+
self._do_eos()
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
frame = player.get_next_frame()
|
|
78
|
+
if frame is None:
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
# first time we got a frame, we know that video is read now.
|
|
82
|
+
if self._texture is None:
|
|
83
|
+
self._texture = Texture.create(size=(
|
|
84
|
+
player.get_width(), player.get_height()),
|
|
85
|
+
colorfmt='rgb')
|
|
86
|
+
self._texture.flip_vertical()
|
|
87
|
+
self.dispatch('on_load')
|
|
88
|
+
|
|
89
|
+
if self._texture:
|
|
90
|
+
self._texture.blit_buffer(frame)
|
|
91
|
+
self.dispatch('on_frame')
|
|
92
|
+
|
|
93
|
+
def _get_duration(self):
|
|
94
|
+
if self._player is None:
|
|
95
|
+
return 0
|
|
96
|
+
return self._player.get_duration()
|
|
97
|
+
|
|
98
|
+
def _get_position(self):
|
|
99
|
+
if self._player is None:
|
|
100
|
+
return 0
|
|
101
|
+
return self._player.get_position()
|
|
102
|
+
|
|
103
|
+
def _set_volume(self, value):
|
|
104
|
+
self._volume = value
|
|
105
|
+
if self._player:
|
|
106
|
+
self._player.set_volume(self._volume)
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
'''
|
|
2
|
+
FFmpeg based video abstraction
|
|
3
|
+
==============================
|
|
4
|
+
|
|
5
|
+
To use, you need to install ffpyplayer and have a compiled ffmpeg shared
|
|
6
|
+
library.
|
|
7
|
+
|
|
8
|
+
https://github.com/matham/ffpyplayer
|
|
9
|
+
|
|
10
|
+
The docs there describe how to set this up. But briefly, first you need to
|
|
11
|
+
compile ffmpeg using the shared flags while disabling the static flags (you'll
|
|
12
|
+
probably have to set the fPIC flag, e.g. CFLAGS=-fPIC). Here are some
|
|
13
|
+
instructions: https://trac.ffmpeg.org/wiki/CompilationGuide. For Windows, you
|
|
14
|
+
can download compiled GPL binaries from http://ffmpeg.zeranoe.com/builds/.
|
|
15
|
+
Similarly, you should download SDL2.
|
|
16
|
+
|
|
17
|
+
Now, you should have ffmpeg and sdl directories. In each, you should have an
|
|
18
|
+
'include', 'bin' and 'lib' directory, where e.g. for Windows, 'lib' contains
|
|
19
|
+
the .dll.a files, while 'bin' contains the actual dlls. The 'include' directory
|
|
20
|
+
holds the headers. The 'bin' directory is only needed if the shared libraries
|
|
21
|
+
are not already in the path. In the environment, define FFMPEG_ROOT and
|
|
22
|
+
SDL_ROOT, each pointing to the ffmpeg and SDL directories respectively. (If
|
|
23
|
+
you're using SDL2, the 'include' directory will contain an 'SDL2' directory,
|
|
24
|
+
which then holds the headers).
|
|
25
|
+
|
|
26
|
+
Once defined, download the ffpyplayer git repo and run
|
|
27
|
+
|
|
28
|
+
python setup.py build_ext --inplace
|
|
29
|
+
|
|
30
|
+
Finally, before running you need to ensure that ffpyplayer is in python's path.
|
|
31
|
+
|
|
32
|
+
..Note::
|
|
33
|
+
|
|
34
|
+
When kivy exits by closing the window while the video is playing,
|
|
35
|
+
it appears that the __del__method of VideoFFPy
|
|
36
|
+
is not called. Because of this, the VideoFFPy object is not
|
|
37
|
+
properly deleted when kivy exits. The consequence is that because
|
|
38
|
+
MediaPlayer creates internal threads which do not have their daemon
|
|
39
|
+
flag set, when the main threads exists, it'll hang and wait for the other
|
|
40
|
+
MediaPlayer threads to exit. But since __del__ is not called to delete the
|
|
41
|
+
MediaPlayer object, those threads will remain alive, hanging kivy. What
|
|
42
|
+
this means is that you have to be sure to delete the MediaPlayer object
|
|
43
|
+
before kivy exits by setting it to None.
|
|
44
|
+
'''
|
|
45
|
+
|
|
46
|
+
__all__ = ('VideoFFPy', )
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
import ffpyplayer
|
|
50
|
+
from ffpyplayer.player import MediaPlayer
|
|
51
|
+
from ffpyplayer.tools import set_log_callback, get_log_callback
|
|
52
|
+
except:
|
|
53
|
+
raise
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
from threading import Thread
|
|
57
|
+
from queue import Queue, Empty, Full
|
|
58
|
+
from kivy.clock import Clock, mainthread
|
|
59
|
+
from kivy.logger import Logger
|
|
60
|
+
from kivy.core.video import VideoBase
|
|
61
|
+
from kivy.graphics import Rectangle, BindTexture
|
|
62
|
+
from kivy.graphics.texture import Texture
|
|
63
|
+
from kivy.graphics.fbo import Fbo
|
|
64
|
+
from kivy.weakmethod import WeakMethod
|
|
65
|
+
import time
|
|
66
|
+
|
|
67
|
+
Logger.info('VideoFFPy: Using ffpyplayer {}'.format(ffpyplayer.version))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
logger_func = {'quiet': Logger.critical, 'panic': Logger.critical,
|
|
71
|
+
'fatal': Logger.critical, 'error': Logger.error,
|
|
72
|
+
'warning': Logger.warning, 'info': Logger.info,
|
|
73
|
+
'verbose': Logger.debug, 'debug': Logger.debug}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _log_callback(message, level):
|
|
77
|
+
message = message.strip()
|
|
78
|
+
if message:
|
|
79
|
+
logger_func[level]('ffpyplayer: {}'.format(message))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if not get_log_callback():
|
|
83
|
+
set_log_callback(_log_callback)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class VideoFFPy(VideoBase):
|
|
87
|
+
|
|
88
|
+
YUV_RGB_FS = """
|
|
89
|
+
$HEADER$
|
|
90
|
+
uniform sampler2D tex_y;
|
|
91
|
+
uniform sampler2D tex_u;
|
|
92
|
+
uniform sampler2D tex_v;
|
|
93
|
+
|
|
94
|
+
void main(void) {
|
|
95
|
+
float y = texture2D(tex_y, tex_coord0).r;
|
|
96
|
+
float u = texture2D(tex_u, tex_coord0).r - 0.5;
|
|
97
|
+
float v = texture2D(tex_v, tex_coord0).r - 0.5;
|
|
98
|
+
float r = y + 1.402 * v;
|
|
99
|
+
float g = y - 0.344 * u - 0.714 * v;
|
|
100
|
+
float b = y + 1.772 * u;
|
|
101
|
+
gl_FragColor = vec4(r, g, b, 1.0);
|
|
102
|
+
}
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
_trigger = None
|
|
106
|
+
|
|
107
|
+
def __init__(self, **kwargs):
|
|
108
|
+
self._ffplayer = None
|
|
109
|
+
self._thread = None
|
|
110
|
+
self._next_frame = None
|
|
111
|
+
self._seek_queue = []
|
|
112
|
+
self._ffplayer_need_quit = False
|
|
113
|
+
self._wakeup_queue = Queue(maxsize=1)
|
|
114
|
+
self._trigger = Clock.create_trigger(self._redraw)
|
|
115
|
+
|
|
116
|
+
super(VideoFFPy, self).__init__(**kwargs)
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def _is_stream(self):
|
|
120
|
+
# This is only used when building ff_opts, to prevent starting
|
|
121
|
+
# player paused and can probably be removed as soon as the 'eof'
|
|
122
|
+
# receiving issue is solved.
|
|
123
|
+
# See https://github.com/matham/ffpyplayer/issues/142
|
|
124
|
+
return self.filename.startswith('rtsp://')
|
|
125
|
+
|
|
126
|
+
def __del__(self):
|
|
127
|
+
self.unload()
|
|
128
|
+
|
|
129
|
+
def _wakeup_thread(self):
|
|
130
|
+
try:
|
|
131
|
+
self._wakeup_queue.put(None, False)
|
|
132
|
+
except Full:
|
|
133
|
+
pass
|
|
134
|
+
|
|
135
|
+
def _wait_for_wakeup(self, timeout):
|
|
136
|
+
try:
|
|
137
|
+
self._wakeup_queue.get(True, timeout)
|
|
138
|
+
except Empty:
|
|
139
|
+
pass
|
|
140
|
+
|
|
141
|
+
def _player_callback(self, selector, value):
|
|
142
|
+
if self._ffplayer is None:
|
|
143
|
+
return
|
|
144
|
+
if selector == 'quit':
|
|
145
|
+
def close(*args):
|
|
146
|
+
self.unload()
|
|
147
|
+
Clock.schedule_once(close, 0)
|
|
148
|
+
|
|
149
|
+
def _get_position(self):
|
|
150
|
+
if self._ffplayer is not None:
|
|
151
|
+
return self._ffplayer.get_pts()
|
|
152
|
+
return 0
|
|
153
|
+
|
|
154
|
+
def _set_position(self, pos):
|
|
155
|
+
self.seek(pos)
|
|
156
|
+
|
|
157
|
+
def _set_volume(self, volume):
|
|
158
|
+
self._volume = volume
|
|
159
|
+
if self._ffplayer is not None:
|
|
160
|
+
self._ffplayer.set_volume(self._volume)
|
|
161
|
+
|
|
162
|
+
def _get_duration(self):
|
|
163
|
+
if self._ffplayer is None:
|
|
164
|
+
return 0
|
|
165
|
+
return self._ffplayer.get_metadata()['duration']
|
|
166
|
+
|
|
167
|
+
@mainthread
|
|
168
|
+
def _do_eos(self):
|
|
169
|
+
if self.eos == 'pause':
|
|
170
|
+
self.pause()
|
|
171
|
+
elif self.eos == 'stop':
|
|
172
|
+
self.stop()
|
|
173
|
+
elif self.eos == 'loop':
|
|
174
|
+
# this causes a seek to zero
|
|
175
|
+
self.position = 0
|
|
176
|
+
|
|
177
|
+
self.dispatch('on_eos')
|
|
178
|
+
|
|
179
|
+
@mainthread
|
|
180
|
+
def _finish_setup(self):
|
|
181
|
+
# once setup is done, we make sure player state matches what user
|
|
182
|
+
# could have requested while player was being setup and it was in limbo
|
|
183
|
+
# also, thread starts player in internal paused mode, so this unpauses
|
|
184
|
+
# it if user didn't request pause meanwhile
|
|
185
|
+
if self._ffplayer is not None:
|
|
186
|
+
self._ffplayer.set_volume(self._volume)
|
|
187
|
+
self._ffplayer.set_pause(self._state == 'paused')
|
|
188
|
+
self._wakeup_thread()
|
|
189
|
+
|
|
190
|
+
def _redraw(self, *args):
|
|
191
|
+
if not self._ffplayer:
|
|
192
|
+
return
|
|
193
|
+
next_frame = self._next_frame
|
|
194
|
+
if not next_frame:
|
|
195
|
+
return
|
|
196
|
+
|
|
197
|
+
img, pts = next_frame
|
|
198
|
+
if img.get_size() != self._size or self._texture is None:
|
|
199
|
+
self._size = w, h = img.get_size()
|
|
200
|
+
|
|
201
|
+
if self._out_fmt == 'yuv420p':
|
|
202
|
+
w2 = int(w / 2)
|
|
203
|
+
h2 = int(h / 2)
|
|
204
|
+
self._tex_y = Texture.create(
|
|
205
|
+
size=(w, h), colorfmt='luminance')
|
|
206
|
+
self._tex_u = Texture.create(
|
|
207
|
+
size=(w2, h2), colorfmt='luminance')
|
|
208
|
+
self._tex_v = Texture.create(
|
|
209
|
+
size=(w2, h2), colorfmt='luminance')
|
|
210
|
+
self._fbo = fbo = Fbo(size=self._size)
|
|
211
|
+
with fbo:
|
|
212
|
+
BindTexture(texture=self._tex_u, index=1)
|
|
213
|
+
BindTexture(texture=self._tex_v, index=2)
|
|
214
|
+
Rectangle(size=fbo.size, texture=self._tex_y)
|
|
215
|
+
fbo.shader.fs = VideoFFPy.YUV_RGB_FS
|
|
216
|
+
fbo['tex_y'] = 0
|
|
217
|
+
fbo['tex_u'] = 1
|
|
218
|
+
fbo['tex_v'] = 2
|
|
219
|
+
self._texture = fbo.texture
|
|
220
|
+
else:
|
|
221
|
+
self._texture = Texture.create(size=self._size,
|
|
222
|
+
colorfmt='rgba')
|
|
223
|
+
|
|
224
|
+
# XXX FIXME
|
|
225
|
+
# self.texture.add_reload_observer(self.reload_buffer)
|
|
226
|
+
self._texture.flip_vertical()
|
|
227
|
+
self.dispatch('on_load')
|
|
228
|
+
|
|
229
|
+
if self._texture:
|
|
230
|
+
if self._out_fmt == 'yuv420p':
|
|
231
|
+
dy, du, dv, _ = img.to_memoryview()
|
|
232
|
+
if dy and du and dv:
|
|
233
|
+
self._tex_y.blit_buffer(dy, colorfmt='luminance')
|
|
234
|
+
self._tex_u.blit_buffer(du, colorfmt='luminance')
|
|
235
|
+
self._tex_v.blit_buffer(dv, colorfmt='luminance')
|
|
236
|
+
self._fbo.ask_update()
|
|
237
|
+
self._fbo.draw()
|
|
238
|
+
else:
|
|
239
|
+
self._texture.blit_buffer(
|
|
240
|
+
img.to_memoryview()[0], colorfmt='rgba')
|
|
241
|
+
|
|
242
|
+
self.dispatch('on_frame')
|
|
243
|
+
|
|
244
|
+
def _next_frame_run(self, ffplayer):
|
|
245
|
+
sleep = time.sleep
|
|
246
|
+
trigger = self._trigger
|
|
247
|
+
did_dispatch_eof = False
|
|
248
|
+
wait_for_wakeup = self._wait_for_wakeup
|
|
249
|
+
seek_queue = self._seek_queue
|
|
250
|
+
# video starts in internal paused state
|
|
251
|
+
|
|
252
|
+
# fast path, if the source video is yuv420p, we'll use a glsl shader
|
|
253
|
+
# for buffer conversion to rgba
|
|
254
|
+
# wait until we get frame metadata
|
|
255
|
+
while not self._ffplayer_need_quit:
|
|
256
|
+
src_pix_fmt = ffplayer.get_metadata().get('src_pix_fmt')
|
|
257
|
+
if not src_pix_fmt:
|
|
258
|
+
wait_for_wakeup(0.005)
|
|
259
|
+
continue
|
|
260
|
+
|
|
261
|
+
# ffpyplayer reports src_pix_fmt as bytes. this may or may not
|
|
262
|
+
# change in future, so we check for both bytes and str
|
|
263
|
+
if src_pix_fmt in (b'yuv420p', 'yuv420p'):
|
|
264
|
+
self._out_fmt = 'yuv420p'
|
|
265
|
+
ffplayer.set_output_pix_fmt(self._out_fmt)
|
|
266
|
+
break
|
|
267
|
+
|
|
268
|
+
if self._ffplayer_need_quit:
|
|
269
|
+
ffplayer.close_player()
|
|
270
|
+
return
|
|
271
|
+
|
|
272
|
+
self._ffplayer = ffplayer
|
|
273
|
+
self._finish_setup()
|
|
274
|
+
# now, we'll be in internal paused state and loop will wait until
|
|
275
|
+
# mainthread unpauses us when finishing setup
|
|
276
|
+
|
|
277
|
+
while not self._ffplayer_need_quit:
|
|
278
|
+
seek_happened = False
|
|
279
|
+
if seek_queue:
|
|
280
|
+
vals = seek_queue[:]
|
|
281
|
+
del seek_queue[:len(vals)]
|
|
282
|
+
percent, precise = vals[-1]
|
|
283
|
+
ffplayer.seek(
|
|
284
|
+
percent * ffplayer.get_metadata()['duration'],
|
|
285
|
+
relative=False,
|
|
286
|
+
accurate=precise
|
|
287
|
+
)
|
|
288
|
+
seek_happened = True
|
|
289
|
+
did_dispatch_eof = False
|
|
290
|
+
self._next_frame = None
|
|
291
|
+
|
|
292
|
+
# Get next frame if paused:
|
|
293
|
+
if seek_happened and ffplayer.get_pause():
|
|
294
|
+
ffplayer.set_volume(0.0) # Try to do it silently.
|
|
295
|
+
ffplayer.set_pause(False)
|
|
296
|
+
try:
|
|
297
|
+
# We don't know concrete number of frames to skip,
|
|
298
|
+
# this number worked fine on couple of tested videos:
|
|
299
|
+
to_skip = 6
|
|
300
|
+
while True:
|
|
301
|
+
frame, val = ffplayer.get_frame(show=False)
|
|
302
|
+
# Exit loop on invalid val:
|
|
303
|
+
if val in ('paused', 'eof'):
|
|
304
|
+
break
|
|
305
|
+
# Exit loop on seek_queue updated:
|
|
306
|
+
if seek_queue:
|
|
307
|
+
break
|
|
308
|
+
# Wait for next frame:
|
|
309
|
+
if frame is None:
|
|
310
|
+
sleep(0.005)
|
|
311
|
+
continue
|
|
312
|
+
# Wait until we skipped enough frames:
|
|
313
|
+
to_skip -= 1
|
|
314
|
+
if to_skip == 0:
|
|
315
|
+
break
|
|
316
|
+
# Assuming last frame is actual, just get it:
|
|
317
|
+
frame, val = ffplayer.get_frame(force_refresh=True)
|
|
318
|
+
finally:
|
|
319
|
+
ffplayer.set_pause(bool(self._state == 'paused'))
|
|
320
|
+
# todo: this is not safe because user could have updated
|
|
321
|
+
# volume between us reading it and setting it
|
|
322
|
+
ffplayer.set_volume(self._volume)
|
|
323
|
+
# Get next frame regular:
|
|
324
|
+
else:
|
|
325
|
+
frame, val = ffplayer.get_frame()
|
|
326
|
+
|
|
327
|
+
if val == 'eof':
|
|
328
|
+
if not did_dispatch_eof:
|
|
329
|
+
self._do_eos()
|
|
330
|
+
did_dispatch_eof = True
|
|
331
|
+
wait_for_wakeup(None)
|
|
332
|
+
elif val == 'paused':
|
|
333
|
+
did_dispatch_eof = False
|
|
334
|
+
wait_for_wakeup(None)
|
|
335
|
+
else:
|
|
336
|
+
did_dispatch_eof = False
|
|
337
|
+
if frame:
|
|
338
|
+
self._next_frame = frame
|
|
339
|
+
trigger()
|
|
340
|
+
else:
|
|
341
|
+
val = val if val else (1 / 30.)
|
|
342
|
+
wait_for_wakeup(val)
|
|
343
|
+
|
|
344
|
+
ffplayer.close_player()
|
|
345
|
+
|
|
346
|
+
def seek(self, percent, precise=True):
|
|
347
|
+
# still save seek while thread is setting up
|
|
348
|
+
self._seek_queue.append((percent, precise,))
|
|
349
|
+
self._wakeup_thread()
|
|
350
|
+
|
|
351
|
+
def stop(self):
|
|
352
|
+
self.unload()
|
|
353
|
+
|
|
354
|
+
def pause(self):
|
|
355
|
+
# if state hasn't been set (empty), there's no player. If it's
|
|
356
|
+
# paused, nothing to do so just handle playing
|
|
357
|
+
if self._state == 'playing':
|
|
358
|
+
# we could be in limbo while player is setting up so check. Player
|
|
359
|
+
# will pause when finishing setting up
|
|
360
|
+
if self._ffplayer is not None:
|
|
361
|
+
self._ffplayer.set_pause(True)
|
|
362
|
+
# even in limbo, indicate to start in paused state
|
|
363
|
+
self._state = 'paused'
|
|
364
|
+
self._wakeup_thread()
|
|
365
|
+
|
|
366
|
+
def play(self):
|
|
367
|
+
# _state starts empty and is empty again after unloading
|
|
368
|
+
if self._ffplayer:
|
|
369
|
+
# player is already setup, just handle unpausing
|
|
370
|
+
assert self._state in ('paused', 'playing')
|
|
371
|
+
if self._state == 'paused':
|
|
372
|
+
self._ffplayer.set_pause(False)
|
|
373
|
+
self._state = 'playing'
|
|
374
|
+
self._wakeup_thread()
|
|
375
|
+
return
|
|
376
|
+
|
|
377
|
+
# we're now either in limbo state waiting for thread to setup,
|
|
378
|
+
# or no thread has been started
|
|
379
|
+
if self._state == 'playing':
|
|
380
|
+
# in limbo, just wait for thread to setup player
|
|
381
|
+
return
|
|
382
|
+
elif self._state == 'paused':
|
|
383
|
+
# in limbo, still unpause for when player becomes ready
|
|
384
|
+
self._state = 'playing'
|
|
385
|
+
self._wakeup_thread()
|
|
386
|
+
return
|
|
387
|
+
|
|
388
|
+
# load first unloads
|
|
389
|
+
self.load()
|
|
390
|
+
self._out_fmt = 'rgba'
|
|
391
|
+
# if no stream, it starts internally paused, but unpauses itself
|
|
392
|
+
# if stream and we start paused, we sometimes receive eof after a
|
|
393
|
+
# few frames, depending on the stream producer.
|
|
394
|
+
# XXX: This probably needs to be figured out in ffpyplayer, using
|
|
395
|
+
# ffplay directly works.
|
|
396
|
+
ff_opts = {
|
|
397
|
+
'paused': not self._is_stream,
|
|
398
|
+
'out_fmt': self._out_fmt,
|
|
399
|
+
'sn': True,
|
|
400
|
+
'volume': self._volume,
|
|
401
|
+
}
|
|
402
|
+
ffplayer = MediaPlayer(
|
|
403
|
+
self._filename, callback=self._player_callback,
|
|
404
|
+
thread_lib='SDL',
|
|
405
|
+
loglevel='info', ff_opts=ff_opts
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
# Disabled as an attempt to fix kivy issue #6210
|
|
409
|
+
# self._ffplayer.set_volume(self._volume)
|
|
410
|
+
|
|
411
|
+
self._thread = Thread(
|
|
412
|
+
target=self._next_frame_run,
|
|
413
|
+
name='Next frame',
|
|
414
|
+
args=(ffplayer, )
|
|
415
|
+
)
|
|
416
|
+
# todo: remove
|
|
417
|
+
self._thread.daemon = True
|
|
418
|
+
|
|
419
|
+
# start in playing mode, but _ffplayer isn't set until ready. We're
|
|
420
|
+
# now in a limbo state
|
|
421
|
+
self._state = 'playing'
|
|
422
|
+
self._thread.start()
|
|
423
|
+
|
|
424
|
+
def load(self):
|
|
425
|
+
self.unload()
|
|
426
|
+
|
|
427
|
+
def unload(self):
|
|
428
|
+
# no need to call self._trigger.cancel() because _ffplayer is set
|
|
429
|
+
# to None below, and it's not safe to call clock stuff from __del__
|
|
430
|
+
|
|
431
|
+
# if thread is still alive, set it to exit and wake it
|
|
432
|
+
self._wakeup_thread()
|
|
433
|
+
self._ffplayer_need_quit = True
|
|
434
|
+
# wait until it exits
|
|
435
|
+
if self._thread:
|
|
436
|
+
# TODO: use callback, don't block here
|
|
437
|
+
self._thread.join()
|
|
438
|
+
self._thread = None
|
|
439
|
+
|
|
440
|
+
if self._ffplayer:
|
|
441
|
+
self._ffplayer = None
|
|
442
|
+
self._next_frame = None
|
|
443
|
+
self._size = (0, 0)
|
|
444
|
+
self._state = ''
|
|
445
|
+
self._seek_queue = []
|
|
446
|
+
|
|
447
|
+
# reset for next load since thread is dead for sure
|
|
448
|
+
self._ffplayer_need_quit = False
|
|
449
|
+
self._wakeup_queue = Queue(maxsize=1)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Video Gstplayer
|
|
3
|
+
===============
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 1.8.0
|
|
6
|
+
|
|
7
|
+
Implementation of a VideoBase with Kivy :class:`~kivy.lib.gstplayer.GstPlayer`
|
|
8
|
+
This player is the preferred player, using Gstreamer 1.0, working on both
|
|
9
|
+
Python 2 and 3.
|
|
10
|
+
'''
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
from kivy.lib.gstplayer import GstPlayer, get_gst_version
|
|
14
|
+
except ImportError:
|
|
15
|
+
from kivy.core import handle_win_lib_import_error
|
|
16
|
+
handle_win_lib_import_error(
|
|
17
|
+
'VideoGstplayer', 'gst', 'kivy.lib.gstplayer._gstplayer')
|
|
18
|
+
raise
|
|
19
|
+
from kivy.graphics.texture import Texture
|
|
20
|
+
from kivy.core.video import VideoBase
|
|
21
|
+
from kivy.logger import Logger
|
|
22
|
+
from kivy.clock import Clock
|
|
23
|
+
from kivy.compat import PY2
|
|
24
|
+
from threading import Lock
|
|
25
|
+
from functools import partial
|
|
26
|
+
from os.path import realpath
|
|
27
|
+
from weakref import ref
|
|
28
|
+
|
|
29
|
+
if PY2:
|
|
30
|
+
from urllib import pathname2url
|
|
31
|
+
else:
|
|
32
|
+
from urllib.request import pathname2url
|
|
33
|
+
|
|
34
|
+
Logger.info('VideoGstplayer: Using Gstreamer {}'.format(
|
|
35
|
+
'.'.join(map(str, get_gst_version()))))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _on_gstplayer_buffer(video, width, height, data):
|
|
39
|
+
video = video()
|
|
40
|
+
# if we still receive the video but no more player, remove it.
|
|
41
|
+
if not video:
|
|
42
|
+
return
|
|
43
|
+
with video._buffer_lock:
|
|
44
|
+
video._buffer = (width, height, data)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _on_gstplayer_message(mtype, message):
|
|
48
|
+
if mtype == 'error':
|
|
49
|
+
Logger.error('VideoGstplayer: {}'.format(message))
|
|
50
|
+
elif mtype == 'warning':
|
|
51
|
+
Logger.warning('VideoGstplayer: {}'.format(message))
|
|
52
|
+
elif mtype == 'info':
|
|
53
|
+
Logger.info('VideoGstplayer: {}'.format(message))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class VideoGstplayer(VideoBase):
|
|
57
|
+
|
|
58
|
+
def __init__(self, **kwargs):
|
|
59
|
+
self.player = None
|
|
60
|
+
self._buffer = None
|
|
61
|
+
self._buffer_lock = Lock()
|
|
62
|
+
super(VideoGstplayer, self).__init__(**kwargs)
|
|
63
|
+
|
|
64
|
+
def _on_gst_eos_sync(self):
|
|
65
|
+
Clock.schedule_once(self._do_eos, 0)
|
|
66
|
+
|
|
67
|
+
def load(self):
|
|
68
|
+
Logger.debug('VideoGstplayer: Load <{}>'.format(self._filename))
|
|
69
|
+
uri = self._get_uri()
|
|
70
|
+
wk_self = ref(self)
|
|
71
|
+
self.player_callback = partial(_on_gstplayer_buffer, wk_self)
|
|
72
|
+
self.player = GstPlayer(uri, self.player_callback,
|
|
73
|
+
self._on_gst_eos_sync, _on_gstplayer_message)
|
|
74
|
+
self.player.load()
|
|
75
|
+
|
|
76
|
+
def unload(self):
|
|
77
|
+
if self.player:
|
|
78
|
+
self.player.unload()
|
|
79
|
+
self.player = None
|
|
80
|
+
with self._buffer_lock:
|
|
81
|
+
self._buffer = None
|
|
82
|
+
self._texture = None
|
|
83
|
+
|
|
84
|
+
def stop(self):
|
|
85
|
+
super(VideoGstplayer, self).stop()
|
|
86
|
+
self.player.stop()
|
|
87
|
+
|
|
88
|
+
def pause(self):
|
|
89
|
+
super(VideoGstplayer, self).pause()
|
|
90
|
+
self.player.pause()
|
|
91
|
+
|
|
92
|
+
def play(self):
|
|
93
|
+
super(VideoGstplayer, self).play()
|
|
94
|
+
self.player.set_volume(self.volume)
|
|
95
|
+
self.player.play()
|
|
96
|
+
|
|
97
|
+
def seek(self, percent, precise=True):
|
|
98
|
+
self.player.seek(percent)
|
|
99
|
+
|
|
100
|
+
def _get_position(self):
|
|
101
|
+
return self.player.get_position()
|
|
102
|
+
|
|
103
|
+
def _get_duration(self):
|
|
104
|
+
return self.player.get_duration()
|
|
105
|
+
|
|
106
|
+
def _set_volume(self, value):
|
|
107
|
+
self._volume = value
|
|
108
|
+
if self.player:
|
|
109
|
+
self.player.set_volume(self._volume)
|
|
110
|
+
|
|
111
|
+
def _update(self, dt):
|
|
112
|
+
buf = None
|
|
113
|
+
with self._buffer_lock:
|
|
114
|
+
buf = self._buffer
|
|
115
|
+
self._buffer = None
|
|
116
|
+
if buf is not None:
|
|
117
|
+
self._update_texture(buf)
|
|
118
|
+
self.dispatch('on_frame')
|
|
119
|
+
|
|
120
|
+
def _update_texture(self, buf):
|
|
121
|
+
width, height, data = buf
|
|
122
|
+
|
|
123
|
+
# texture is not allocated yet, create it first
|
|
124
|
+
if not self._texture:
|
|
125
|
+
self._texture = Texture.create(size=(width, height),
|
|
126
|
+
colorfmt='rgb')
|
|
127
|
+
self._texture.flip_vertical()
|
|
128
|
+
self.dispatch('on_load')
|
|
129
|
+
|
|
130
|
+
if self._texture:
|
|
131
|
+
self._texture.blit_buffer(
|
|
132
|
+
data, size=(width, height), colorfmt='rgb')
|
|
133
|
+
|
|
134
|
+
def _get_uri(self):
|
|
135
|
+
uri = self.filename
|
|
136
|
+
if not uri:
|
|
137
|
+
return
|
|
138
|
+
if '://' not in uri:
|
|
139
|
+
uri = 'file:' + pathname2url(realpath(uri))
|
|
140
|
+
return uri
|