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.
Files changed (624) hide show
  1. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/main.py +77 -0
  2. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/monkey.obj +7966 -0
  3. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/objloader.py +147 -0
  4. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/simple.glsl +47 -0
  5. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/editor.kv +72 -0
  6. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/main.py +64 -0
  7. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/android.txt +3 -0
  8. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/compass.kv +25 -0
  9. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/main.py +77 -0
  10. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/needle.png +0 -0
  11. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/rose.png +0 -0
  12. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/android.txt +3 -0
  13. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/main.py +80 -0
  14. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/shadow32.png +0 -0
  15. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/takepicture.kv +40 -0
  16. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/animation/animate.py +42 -0
  17. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite.py +152 -0
  18. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite_data/testkvdir.kv +4 -0
  19. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_build.py +24 -0
  20. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_config.py +49 -0
  21. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv.py +25 -0
  22. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv_in_template1.py +27 -0
  23. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/template1/test.kv +4 -0
  24. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/test.kv +4 -0
  25. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/testkvfile.kv +4 -0
  26. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_advanced.py +90 -0
  27. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_basic.py +59 -0
  28. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_advanced.py +93 -0
  29. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_basic.py +58 -0
  30. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12908_sweet_trip_mm_clap_hi.wav +0 -0
  31. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12909_sweet_trip_mm_clap_lo.wav +0 -0
  32. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12910_sweet_trip_mm_clap_mid.wav +0 -0
  33. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12911_sweet_trip_mm_hat_cl.wav +0 -0
  34. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12913_sweet_trip_mm_kick_hi.wav +0 -0
  35. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12914_sweet_trip_mm_kick_lo.wav +0 -0
  36. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12915_sweet_trip_mm_kick_mid.wav +0 -0
  37. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12916_sweet_trip_mm_kwik_mod_01.wav +0 -0
  38. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12917_sweet_trip_mm_kwik_mod_02.wav +0 -0
  39. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12918_sweet_trip_mm_kwik_mod_03.wav +0 -0
  40. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12919_sweet_trip_mm_kwik_mod_04.wav +0 -0
  41. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12920_sweet_trip_mm_kwik_mod_05.wav +0 -0
  42. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12921_sweet_trip_mm_kwik_mod_06.wav +0 -0
  43. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12922_sweet_trip_mm_kwik_mod_07.wav +0 -0
  44. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12923_sweet_trip_mm_metal_clave.wav +0 -0
  45. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12925_sweet_trip_mm_sweep_x.wav +0 -0
  46. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12926_sweet_trip_mm_sweep_y.wav +0 -0
  47. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12927_sweet_trip_mm_sweep_z.wav +0 -0
  48. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/audio.kv +59 -0
  49. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/main.py +81 -0
  50. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/pitch.py +42 -0
  51. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/camera/main.py +59 -0
  52. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/bezier.py +105 -0
  53. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/canvas_stress.py +72 -0
  54. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/circle.py +84 -0
  55. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/fbo_canvas.py +91 -0
  56. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/kiwi.jpg +0 -0
  57. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines.py +296 -0
  58. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines_extended.py +183 -0
  59. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh.py +57 -0
  60. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh_manipulation.py +101 -0
  61. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture1.png +0 -0
  62. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture2.png +0 -0
  63. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/multitexture.py +110 -0
  64. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/repeat_texture.py +65 -0
  65. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rotation.py +35 -0
  66. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rounded_rectangle.py +153 -0
  67. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/scale.py +37 -0
  68. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/stencil_canvas.py +85 -0
  69. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/tesselate.py +146 -0
  70. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture.py +143 -0
  71. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture_example_image.png +0 -0
  72. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/1.kv +28 -0
  73. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/2.kv +28 -0
  74. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/3.kv +28 -0
  75. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/root.kv +32 -0
  76. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/main.py +63 -0
  77. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_image.py +25 -0
  78. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_video.py +31 -0
  79. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/camera_puzzle.py +98 -0
  80. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/AnchorLayoutContainer.kv +15 -0
  81. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/BoxLayoutContainer.kv +14 -0
  82. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ButtonContainer.kv +27 -0
  83. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/CheckBoxContainer.kv +28 -0
  84. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FileChooserContainer.kv +19 -0
  85. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FloatLayoutContainer.kv +16 -0
  86. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/GridLayoutContainer.kv +20 -0
  87. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/LabelContainer.kv +62 -0
  88. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/MediaContainer.kv +9 -0
  89. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv +4 -0
  90. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PopupContainer.kv +39 -0
  91. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ProgressBarContainer.kv +17 -0
  92. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/RestContainer.kv +5 -0
  93. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ScatterContainer.kv +16 -0
  94. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/SelectorsContainer.kv +10 -0
  95. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv +25 -0
  96. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/TextContainer.kv +20 -0
  97. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/kivycatalog.kv +144 -0
  98. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/main.py +192 -0
  99. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.kv +117 -0
  100. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.py +180 -0
  101. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/helpers.py +30 -0
  102. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.kv +164 -0
  103. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.py +276 -0
  104. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/main.py +144 -0
  105. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/multistroke.kv +101 -0
  106. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.kv +110 -0
  107. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.py +97 -0
  108. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/android.txt +3 -0
  109. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Bubbles.jpg +0 -0
  110. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Ill1.jpg +0 -0
  111. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Wall.jpg +0 -0
  112. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/faust_github.jpg +0 -0
  113. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/main.py +73 -0
  114. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/pictures.kv +57 -0
  115. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/shadow32.png +0 -0
  116. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/main.py +147 -0
  117. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/shadereditor.kv +39 -0
  118. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/README.txt +11 -0
  119. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/android.txt +3 -0
  120. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/background.png +0 -0
  121. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/faust_github.jpg +0 -0
  122. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/README +4 -0
  123. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/bug.png +0 -0
  124. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-left.png +0 -0
  125. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-right.png +0 -0
  126. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/accordions.kv +39 -0
  127. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/bubbles.kv +33 -0
  128. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/buttons.kv +26 -0
  129. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/carousel.kv +51 -0
  130. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/checkboxes.kv +33 -0
  131. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/codeinput.kv +9 -0
  132. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/dropdown.kv +40 -0
  133. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/filechoosers.kv +24 -0
  134. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/popups.kv +17 -0
  135. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/progressbar.kv +15 -0
  136. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/rstdocument.kv +24 -0
  137. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/scatter.kv +14 -0
  138. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/screenmanager.kv +46 -0
  139. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/sliders.kv +55 -0
  140. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/spinner.kv +11 -0
  141. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/splitter.kv +13 -0
  142. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/switches.kv +39 -0
  143. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/tabbedpanel + layouts.kv +69 -0
  144. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/textinputs.kv +48 -0
  145. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/togglebutton.kv +39 -0
  146. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/main.py +243 -0
  147. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/showcase.kv +100 -0
  148. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/README.txt +12 -0
  149. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/android.txt +3 -0
  150. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/icon.png +0 -0
  151. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/main.py +170 -0
  152. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/particle.png +0 -0
  153. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/touchtracer.kv +29 -0
  154. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_client_app.py +82 -0
  155. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_server_app.py +49 -0
  156. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/twistd_app.py +66 -0
  157. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/gesture_board.py +95 -0
  158. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/my_gestures.py +90 -0
  159. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/controller.kv +16 -0
  160. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/main.py +29 -0
  161. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/1_skeleton.py +15 -0
  162. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/2_print_touch.py +16 -0
  163. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/3_draw_ellipse.py +22 -0
  164. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/4_draw_line.py +26 -0
  165. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/5_random_colors.py +28 -0
  166. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/6_button.py +38 -0
  167. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/quickstart/main.py +15 -0
  168. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/button.kv +9 -0
  169. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/layout.kv +6 -0
  170. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/main.py +19 -0
  171. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/test.kv +5 -0
  172. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/android.txt +3 -0
  173. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/main.py +226 -0
  174. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/numeric.json +38 -0
  175. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/README.txt +13 -0
  176. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/kinectviewer.py +283 -0
  177. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_button.kv +9 -0
  178. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_camera.kv +25 -0
  179. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_fbo.kv +11 -0
  180. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_layout.kv +23 -0
  181. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_logo.kv +36 -0
  182. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_scatter.kv +6 -0
  183. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_stencil.kv +27 -0
  184. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_video.kv +42 -0
  185. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/builder_template.py +28 -0
  186. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/id_in_kv.py +20 -0
  187. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/test.kv +11 -0
  188. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/kv_and_py.py +34 -0
  189. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/test.kv +11 -0
  190. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kivy.jpg +0 -0
  191. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kvrun.py +38 -0
  192. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/clipboard.py +63 -0
  193. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/custom_titlebar.py +56 -0
  194. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/imagesave.py +14 -0
  195. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/joystick.py +83 -0
  196. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/multiple_dropfile.py +51 -0
  197. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/on_textedit_event.py +104 -0
  198. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/opacitywindow.py +28 -0
  199. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapecollisions.py +397 -0
  200. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapedwindow.py +98 -0
  201. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/two_panes.py +47 -0
  202. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/urlrequest.py +128 -0
  203. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/android.txt +3 -0
  204. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/main.py +122 -0
  205. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.kv +9 -0
  206. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.py +86 -0
  207. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.kv +91 -0
  208. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.py +102 -0
  209. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.kv +29 -0
  210. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.py +193 -0
  211. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/tex3.jpg +0 -0
  212. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/benchmark.py +19 -0
  213. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/cloud.svg +25 -0
  214. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main-smaa.py +155 -0
  215. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main.py +50 -0
  216. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/music.svg +68 -0
  217. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/rotated.svg +23 -0
  218. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/ship.svg +181 -0
  219. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/sun.svg +35 -0
  220. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/tiger.svg +813 -0
  221. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/text/pango_demo.py +296 -0
  222. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/data/icon.png +0 -0
  223. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/main.py +163 -0
  224. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/note.kv +154 -0
  225. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/main.py +82 -0
  226. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/pong.kv +53 -0
  227. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/main.py +15 -0
  228. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/pong.kv +2 -0
  229. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/main.py +15 -0
  230. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/pong.kv +21 -0
  231. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/main.py +26 -0
  232. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/pong.kv +31 -0
  233. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/main.py +48 -0
  234. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/pong.kv +34 -0
  235. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/main.py +75 -0
  236. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/pong.kv +53 -0
  237. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/accordion_1.py +17 -0
  238. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/actionbar.py +32 -0
  239. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/asyncimage.py +35 -0
  240. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/boxlayout_poshint.py +54 -0
  241. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/bubble_test.py +63 -0
  242. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/camera.py +33 -0
  243. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/carousel_buttons.py +50 -0
  244. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.mpg +0 -0
  245. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.png +0 -0
  246. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinput.py +225 -0
  247. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinputtest.kv +53 -0
  248. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorpicker.py +234 -0
  249. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorusage.py +62 -0
  250. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/compound_selection.py +83 -0
  251. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/customcollide.py +82 -0
  252. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget.py +193 -0
  253. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget2.py +47 -0
  254. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget3_advanced.py +62 -0
  255. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/fbowidget.py +111 -0
  256. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/focus_behavior.py +98 -0
  257. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/image_mipmap.py +31 -0
  258. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/keyboardlistener.py +42 -0
  259. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_mipmap.py +28 -0
  260. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_sizing.py +193 -0
  261. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_text_size.py +49 -0
  262. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_with_markup.py +21 -0
  263. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/lang_dynamic_classes.py +18 -0
  264. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/pagelayout.py +64 -0
  265. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/popup_with_kv.py +35 -0
  266. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/basic_data.py +124 -0
  267. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/infinite_scrolling.py +143 -0
  268. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/key_viewclass.py +149 -0
  269. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/messenger.py +196 -0
  270. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/pull_to_refresh.py +95 -0
  271. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/rv_animate_items.py +109 -0
  272. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/rstexample.py +128 -0
  273. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.kv +53 -0
  274. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.py +16 -0
  275. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/screenmanager.py +106 -0
  276. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.kv +16 -0
  277. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.py +40 -0
  278. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/android.txt +3 -0
  279. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/bird.zip +0 -0
  280. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white.png +0 -0
  281. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white_animated.zip +0 -0
  282. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/cube.zip +0 -0
  283. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.png +0 -0
  284. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.zip +0 -0
  285. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/simple_cv_joint_animated.gif +0 -0
  286. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.kv +63 -0
  287. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.py +150 -0
  288. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/__init__.py +7 -0
  289. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/custom_button.py +98 -0
  290. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/settings.py +93 -0
  291. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/shorten_text.py +80 -0
  292. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/spinner.py +17 -0
  293. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/splitter.py +74 -0
  294. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbed_panel_showcase.py +316 -0
  295. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbedpanel.py +50 -0
  296. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.kv +49 -0
  297. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.py +48 -0
  298. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textinput.py +59 -0
  299. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/unicode_textinput.py +244 -0
  300. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/videoplayer.py +26 -0
  301. Kivy_examples-2.3.1.dev0.dist-info/AUTHORS +66 -0
  302. Kivy_examples-2.3.1.dev0.dist-info/LICENSE +21 -0
  303. Kivy_examples-2.3.1.dev0.dist-info/METADATA +382 -0
  304. Kivy_examples-2.3.1.dev0.dist-info/RECORD +624 -0
  305. Kivy_examples-2.3.1.dev0.dist-info/WHEEL +5 -0
  306. Kivy_examples-2.3.1.dev0.dist-info/dependency_links.txt +1 -0
  307. Kivy_examples-2.3.1.dev0.dist-info/top_level.txt +1 -0
  308. kivy/__init__.py +519 -0
  309. kivy/_version.py +18 -0
  310. kivy/animation.py +831 -0
  311. kivy/app.py +1213 -0
  312. kivy/atlas.py +456 -0
  313. kivy/base.py +617 -0
  314. kivy/cache.py +262 -0
  315. kivy/clock.py +1172 -0
  316. kivy/compat.py +82 -0
  317. kivy/config.py +1004 -0
  318. kivy/context.py +102 -0
  319. kivy/core/__init__.py +247 -0
  320. kivy/core/audio/__init__.py +223 -0
  321. kivy/core/audio/audio_android.py +104 -0
  322. kivy/core/audio/audio_avplayer.py +82 -0
  323. kivy/core/audio/audio_ffpyplayer.py +185 -0
  324. kivy/core/audio/audio_gstplayer.py +101 -0
  325. kivy/core/audio/audio_pygame.py +127 -0
  326. kivy/core/camera/__init__.py +151 -0
  327. kivy/core/camera/camera_android.py +206 -0
  328. kivy/core/camera/camera_gi.py +170 -0
  329. kivy/core/camera/camera_opencv.py +163 -0
  330. kivy/core/camera/camera_picamera.py +96 -0
  331. kivy/core/clipboard/__init__.py +157 -0
  332. kivy/core/clipboard/_clipboard_ext.py +36 -0
  333. kivy/core/clipboard/clipboard_android.py +91 -0
  334. kivy/core/clipboard/clipboard_dbusklipper.py +41 -0
  335. kivy/core/clipboard/clipboard_dummy.py +26 -0
  336. kivy/core/clipboard/clipboard_gtk3.py +47 -0
  337. kivy/core/clipboard/clipboard_nspaste.py +44 -0
  338. kivy/core/clipboard/clipboard_pygame.py +67 -0
  339. kivy/core/clipboard/clipboard_sdl2.py +36 -0
  340. kivy/core/clipboard/clipboard_winctypes.py +107 -0
  341. kivy/core/clipboard/clipboard_xclip.py +29 -0
  342. kivy/core/clipboard/clipboard_xsel.py +26 -0
  343. kivy/core/gl/__init__.py +90 -0
  344. kivy/core/image/__init__.py +996 -0
  345. kivy/core/image/img_dds.py +40 -0
  346. kivy/core/image/img_ffpyplayer.py +87 -0
  347. kivy/core/image/img_pil.py +123 -0
  348. kivy/core/image/img_pygame.py +119 -0
  349. kivy/core/image/img_sdl2.py +66 -0
  350. kivy/core/image/img_tex.py +58 -0
  351. kivy/core/spelling/__init__.py +135 -0
  352. kivy/core/spelling/spelling_enchant.py +50 -0
  353. kivy/core/spelling/spelling_osxappkit.py +64 -0
  354. kivy/core/text/__init__.py +1090 -0
  355. kivy/core/text/markup.py +893 -0
  356. kivy/core/text/text_pango.py +145 -0
  357. kivy/core/text/text_pil.py +84 -0
  358. kivy/core/text/text_pygame.py +117 -0
  359. kivy/core/text/text_sdl2.py +50 -0
  360. kivy/core/video/__init__.py +219 -0
  361. kivy/core/video/video_ffmpeg.py +106 -0
  362. kivy/core/video/video_ffpyplayer.py +449 -0
  363. kivy/core/video/video_gstplayer.py +140 -0
  364. kivy/core/video/video_null.py +12 -0
  365. kivy/core/window/__init__.py +2515 -0
  366. kivy/core/window/window_egl_rpi.py +86 -0
  367. kivy/core/window/window_pygame.py +441 -0
  368. kivy/core/window/window_sdl2.py +999 -0
  369. kivy/deps/__init__.py +6 -0
  370. kivy/effects/__init__.py +23 -0
  371. kivy/effects/dampedscroll.py +114 -0
  372. kivy/effects/kinetic.py +193 -0
  373. kivy/effects/opacityscroll.py +27 -0
  374. kivy/effects/scroll.py +126 -0
  375. kivy/event.py +12 -0
  376. kivy/eventmanager/__init__.py +185 -0
  377. kivy/extras/__init__.py +0 -0
  378. kivy/extras/highlight.py +52 -0
  379. kivy/factory.py +190 -0
  380. kivy/factory_registers.py +201 -0
  381. kivy/garden/__init__.py +186 -0
  382. kivy/geometry.py +121 -0
  383. kivy/gesture.py +424 -0
  384. kivy/graphics/__init__.py +126 -0
  385. kivy/graphics/cgl_backend/__init__.py +0 -0
  386. kivy/input/__init__.py +39 -0
  387. kivy/input/factory.py +35 -0
  388. kivy/input/motionevent.py +587 -0
  389. kivy/input/postproc/__init__.py +27 -0
  390. kivy/input/postproc/calibration.py +200 -0
  391. kivy/input/postproc/dejitter.py +74 -0
  392. kivy/input/postproc/doubletap.py +101 -0
  393. kivy/input/postproc/ignorelist.py +47 -0
  394. kivy/input/postproc/retaintouch.py +93 -0
  395. kivy/input/postproc/tripletap.py +106 -0
  396. kivy/input/provider.py +40 -0
  397. kivy/input/providers/__init__.py +68 -0
  398. kivy/input/providers/androidjoystick.py +117 -0
  399. kivy/input/providers/hidinput.py +778 -0
  400. kivy/input/providers/leapfinger.py +113 -0
  401. kivy/input/providers/linuxwacom.py +396 -0
  402. kivy/input/providers/mactouch.py +220 -0
  403. kivy/input/providers/mouse.py +424 -0
  404. kivy/input/providers/mtdev.py +380 -0
  405. kivy/input/providers/probesysfs.py +254 -0
  406. kivy/input/providers/tuio.py +326 -0
  407. kivy/input/providers/wm_common.py +162 -0
  408. kivy/input/providers/wm_pen.py +121 -0
  409. kivy/input/providers/wm_touch.py +157 -0
  410. kivy/input/recorder.py +335 -0
  411. kivy/input/shape.py +27 -0
  412. kivy/interactive.py +335 -0
  413. kivy/lang/__init__.py +883 -0
  414. kivy/lang/builder.py +1004 -0
  415. kivy/lang/parser.py +822 -0
  416. kivy/lib/__init__.py +21 -0
  417. kivy/lib/ddsfile.py +419 -0
  418. kivy/lib/gstplayer/__init__.py +27 -0
  419. kivy/lib/mtdev.py +254 -0
  420. kivy/lib/vidcore_lite/__init__.py +0 -0
  421. kivy/loader.py +579 -0
  422. kivy/logger.py +646 -0
  423. kivy/metrics.py +421 -0
  424. kivy/modules/__init__.py +300 -0
  425. kivy/modules/_webdebugger.py +200 -0
  426. kivy/modules/console.py +1059 -0
  427. kivy/modules/cursor.py +75 -0
  428. kivy/modules/inspector.py +755 -0
  429. kivy/modules/joycursor.py +299 -0
  430. kivy/modules/keybinding.py +64 -0
  431. kivy/modules/monitor.py +90 -0
  432. kivy/modules/recorder.py +94 -0
  433. kivy/modules/screen.py +183 -0
  434. kivy/modules/showborder.py +33 -0
  435. kivy/modules/touchring.py +97 -0
  436. kivy/modules/webdebugger.py +30 -0
  437. kivy/multistroke.py +1477 -0
  438. kivy/network/__init__.py +7 -0
  439. kivy/network/urlrequest.py +794 -0
  440. kivy/parser.py +154 -0
  441. kivy/resources.py +102 -0
  442. kivy/storage/__init__.py +405 -0
  443. kivy/storage/dictstore.py +98 -0
  444. kivy/storage/jsonstore.py +92 -0
  445. kivy/storage/redisstore.py +103 -0
  446. kivy/support.py +267 -0
  447. kivy/tests/__init__.py +11 -0
  448. kivy/tests/async_common.py +568 -0
  449. kivy/tests/common.py +524 -0
  450. kivy/tests/conftest.py +33 -0
  451. kivy/tests/fixtures.py +169 -0
  452. kivy/tests/perf_test_textinput.py +195 -0
  453. kivy/tests/pyinstaller/simple_widget/main.py +12 -0
  454. kivy/tests/pyinstaller/simple_widget/project/__init__.py +0 -0
  455. kivy/tests/pyinstaller/simple_widget/project/widget.py +12 -0
  456. kivy/tests/pyinstaller/test_pyinstaller.py +115 -0
  457. kivy/tests/pyinstaller/video_widget/main.py +6 -0
  458. kivy/tests/pyinstaller/video_widget/project/__init__.py +38 -0
  459. kivy/tests/test_animations.py +415 -0
  460. kivy/tests/test_app.py +216 -0
  461. kivy/tests/test_audio.py +69 -0
  462. kivy/tests/test_benchmark.py +292 -0
  463. kivy/tests/test_clipboard.py +48 -0
  464. kivy/tests/test_clock.py +292 -0
  465. kivy/tests/test_compat.py +6 -0
  466. kivy/tests/test_config.py +35 -0
  467. kivy/tests/test_coverage.py +83 -0
  468. kivy/tests/test_doc_gallery.py +38 -0
  469. kivy/tests/test_environ_cli.py +50 -0
  470. kivy/tests/test_fbo_py2py3.py +74 -0
  471. kivy/tests/test_filechooser.py +11 -0
  472. kivy/tests/test_filechooser_unicode.py +82 -0
  473. kivy/tests/test_fonts.py +42 -0
  474. kivy/tests/test_garden.py +23 -0
  475. kivy/tests/test_graphics.py +1149 -0
  476. kivy/tests/test_graphics_svg.py +84 -0
  477. kivy/tests/test_image.py +74 -0
  478. kivy/tests/test_imageloader.py +485 -0
  479. kivy/tests/test_invalid_lang.py +42 -0
  480. kivy/tests/test_issues/test_6315.py +55 -0
  481. kivy/tests/test_issues/test_issue_1084.py +47 -0
  482. kivy/tests/test_issues/test_issue_1091.py +19 -0
  483. kivy/tests/test_issues/test_issue_599.py +21 -0
  484. kivy/tests/test_issues/test_issue_609.py +19 -0
  485. kivy/tests/test_issues/test_issue_6909.py +28 -0
  486. kivy/tests/test_issues/test_issue_883.py +12 -0
  487. kivy/tests/test_kivy_init.py +30 -0
  488. kivy/tests/test_knspace.py +247 -0
  489. kivy/tests/test_lang.py +431 -0
  490. kivy/tests/test_lang_complex.py +87 -0
  491. kivy/tests/test_lang_pre_process_and_post_process.py +394 -0
  492. kivy/tests/test_logger.py +516 -0
  493. kivy/tests/test_metrics.py +30 -0
  494. kivy/tests/test_module_inspector.py +382 -0
  495. kivy/tests/test_motion_event.py +44 -0
  496. kivy/tests/test_mouse_hover_event.py +249 -0
  497. kivy/tests/test_mouse_multitouchsim.py +554 -0
  498. kivy/tests/test_multistroke.py +389 -0
  499. kivy/tests/test_properties.py +1332 -0
  500. kivy/tests/test_resources.py +79 -0
  501. kivy/tests/test_rst_replace.py +63 -0
  502. kivy/tests/test_screen.py +38 -0
  503. kivy/tests/test_storage.py +135 -0
  504. kivy/tests/test_uix_actionbar.py +363 -0
  505. kivy/tests/test_uix_anchorlayout.py +79 -0
  506. kivy/tests/test_uix_asyncimage.py +133 -0
  507. kivy/tests/test_uix_boxlayout.py +94 -0
  508. kivy/tests/test_uix_bubble.py +425 -0
  509. kivy/tests/test_uix_carousel.py +93 -0
  510. kivy/tests/test_uix_colorpicker.py +77 -0
  511. kivy/tests/test_uix_dropdown.py +91 -0
  512. kivy/tests/test_uix_gridlayout.py +244 -0
  513. kivy/tests/test_uix_layout.py +16 -0
  514. kivy/tests/test_uix_modal.py +101 -0
  515. kivy/tests/test_uix_recyclegridlayout.py +383 -0
  516. kivy/tests/test_uix_relativelayout.py +30 -0
  517. kivy/tests/test_uix_scrollview.py +358 -0
  518. kivy/tests/test_uix_settings.py +33 -0
  519. kivy/tests/test_uix_slider.py +156 -0
  520. kivy/tests/test_uix_stacklayout.py +120 -0
  521. kivy/tests/test_uix_textinput.py +577 -0
  522. kivy/tests/test_uix_translate_coordinates.py +72 -0
  523. kivy/tests/test_uix_videoplayer.py +112 -0
  524. kivy/tests/test_uix_widget.py +137 -0
  525. kivy/tests/test_urlrequest/test_urlrequest_requests.py +378 -0
  526. kivy/tests/test_urlrequest/test_urlrequest_urllib.py +155 -0
  527. kivy/tests/test_utils.py +237 -0
  528. kivy/tests/test_vector.py +256 -0
  529. kivy/tests/test_video.py +25 -0
  530. kivy/tests/test_weakmethod.py +44 -0
  531. kivy/tests/test_widget.py +127 -0
  532. kivy/tests/test_widget_walk.py +70 -0
  533. kivy/tests/test_window_base.py +60 -0
  534. kivy/tests/test_window_info.py +29 -0
  535. kivy/tests/visual_test_label.py +291 -0
  536. kivy/tools/__init__.py +44 -0
  537. kivy/tools/benchmark.py +286 -0
  538. kivy/tools/changelog_parser.py +120 -0
  539. kivy/tools/coverage.py +135 -0
  540. kivy/tools/gallery.py +323 -0
  541. kivy/tools/generate-icons.py +117 -0
  542. kivy/tools/gles_compat/subset_gles.py +125 -0
  543. kivy/tools/highlight/__init__.py +9 -0
  544. kivy/tools/kviewer.py +80 -0
  545. kivy/tools/packaging/__init__.py +12 -0
  546. kivy/tools/packaging/cython_cfg.py +82 -0
  547. kivy/tools/packaging/factory.py +105 -0
  548. kivy/tools/packaging/pyinstaller_hooks/__init__.py +381 -0
  549. kivy/tools/packaging/pyinstaller_hooks/__main__.py +29 -0
  550. kivy/tools/packaging/pyinstaller_hooks/hook-kivy.py +9 -0
  551. kivy/tools/packaging/pyinstaller_hooks/pyi_rth_kivy.py +17 -0
  552. kivy/tools/pep8checker/pep8.py +2316 -0
  553. kivy/tools/pep8checker/pep8kivy.py +109 -0
  554. kivy/tools/report.py +223 -0
  555. kivy/tools/stub-gl-debug.py +201 -0
  556. kivy/tools/texturecompress.py +233 -0
  557. kivy/uix/__init__.py +56 -0
  558. kivy/uix/accordion.py +484 -0
  559. kivy/uix/actionbar.py +934 -0
  560. kivy/uix/anchorlayout.py +122 -0
  561. kivy/uix/behaviors/__init__.py +95 -0
  562. kivy/uix/behaviors/button.py +212 -0
  563. kivy/uix/behaviors/codenavigation.py +167 -0
  564. kivy/uix/behaviors/compoundselection.py +688 -0
  565. kivy/uix/behaviors/cover.py +160 -0
  566. kivy/uix/behaviors/drag.py +234 -0
  567. kivy/uix/behaviors/emacs.py +140 -0
  568. kivy/uix/behaviors/focus.py +595 -0
  569. kivy/uix/behaviors/knspace.py +590 -0
  570. kivy/uix/behaviors/togglebutton.py +156 -0
  571. kivy/uix/behaviors/touchripple.py +318 -0
  572. kivy/uix/boxlayout.py +331 -0
  573. kivy/uix/bubble.py +576 -0
  574. kivy/uix/button.py +137 -0
  575. kivy/uix/camera.py +118 -0
  576. kivy/uix/carousel.py +695 -0
  577. kivy/uix/checkbox.py +197 -0
  578. kivy/uix/codeinput.py +238 -0
  579. kivy/uix/colorpicker.py +486 -0
  580. kivy/uix/dropdown.py +391 -0
  581. kivy/uix/effectwidget.py +772 -0
  582. kivy/uix/filechooser.py +1134 -0
  583. kivy/uix/floatlayout.py +148 -0
  584. kivy/uix/gesturesurface.py +625 -0
  585. kivy/uix/gridlayout.py +629 -0
  586. kivy/uix/image.py +528 -0
  587. kivy/uix/label.py +1200 -0
  588. kivy/uix/layout.py +322 -0
  589. kivy/uix/modalview.py +339 -0
  590. kivy/uix/pagelayout.py +233 -0
  591. kivy/uix/popup.py +266 -0
  592. kivy/uix/progressbar.py +95 -0
  593. kivy/uix/recycleboxlayout.py +183 -0
  594. kivy/uix/recyclegridlayout.py +255 -0
  595. kivy/uix/recyclelayout.py +446 -0
  596. kivy/uix/recycleview/__init__.py +624 -0
  597. kivy/uix/recycleview/datamodel.py +194 -0
  598. kivy/uix/recycleview/layout.py +253 -0
  599. kivy/uix/recycleview/views.py +423 -0
  600. kivy/uix/relativelayout.py +324 -0
  601. kivy/uix/rst.py +1492 -0
  602. kivy/uix/sandbox.py +198 -0
  603. kivy/uix/scatter.py +645 -0
  604. kivy/uix/scatterlayout.py +93 -0
  605. kivy/uix/screenmanager.py +1275 -0
  606. kivy/uix/scrollview.py +1288 -0
  607. kivy/uix/settings.py +1343 -0
  608. kivy/uix/slider.py +421 -0
  609. kivy/uix/spinner.py +221 -0
  610. kivy/uix/splitter.py +430 -0
  611. kivy/uix/stacklayout.py +331 -0
  612. kivy/uix/stencilview.py +40 -0
  613. kivy/uix/switch.py +122 -0
  614. kivy/uix/tabbedpanel.py +880 -0
  615. kivy/uix/textinput.py +4049 -0
  616. kivy/uix/togglebutton.py +37 -0
  617. kivy/uix/treeview.py +665 -0
  618. kivy/uix/video.py +302 -0
  619. kivy/uix/videoplayer.py +697 -0
  620. kivy/uix/vkeyboard.py +879 -0
  621. kivy/uix/widget.py +1629 -0
  622. kivy/utils.py +550 -0
  623. kivy/vector.py +412 -0
  624. kivy/weakmethod.py +72 -0
kivy/app.py ADDED
@@ -0,0 +1,1213 @@
1
+ '''
2
+ Application
3
+ ===========
4
+
5
+ The :class:`App` class is the base for creating Kivy applications.
6
+ Think of it as your main entry point into the Kivy run loop. In most
7
+ cases, you subclass this class and make your own app. You create an
8
+ instance of your specific app class and then, when you are ready to
9
+ start the application's life cycle, you call your instance's
10
+ :meth:`App.run` method.
11
+
12
+
13
+ Creating an Application
14
+ -----------------------
15
+
16
+ Method using build() override
17
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18
+
19
+ To initialize your app with a widget tree, override the :meth:`~App.build`
20
+ method in your app class and return the widget tree you constructed.
21
+
22
+ Here's an example of a very simple application that just shows a button:
23
+
24
+ .. include:: ../../examples/application/app_with_build.py
25
+ :literal:
26
+
27
+ The file is also available in the examples folder at
28
+ :file:`kivy/examples/application/app_with_build.py`.
29
+
30
+ Here, no widget tree was constructed (or if you will, a tree with only
31
+ the root node).
32
+
33
+
34
+ Method using kv file
35
+ ~~~~~~~~~~~~~~~~~~~~
36
+
37
+ You can also use the :doc:`api-kivy.lang` for creating applications. The
38
+ .kv can contain rules and root widget definitions at the same time. Here
39
+ is the same example as the Button one in a kv file.
40
+
41
+ Contents of 'test.kv':
42
+
43
+ .. include:: ../../examples/application/test.kv
44
+ :literal:
45
+
46
+ Contents of 'main.py':
47
+
48
+ .. include:: ../../examples/application/app_with_kv.py
49
+ :literal:
50
+
51
+ See :file:`kivy/examples/application/app_with_kv.py`.
52
+
53
+ The relationship between main.py and test.kv is explained in
54
+ :meth:`App.load_kv`.
55
+
56
+ .. _Application configuration:
57
+
58
+ Application configuration
59
+ -------------------------
60
+
61
+ Use the configuration file
62
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
63
+
64
+ Your application might need its own configuration file. The
65
+ :class:`App` class handles 'ini' files automatically if you add
66
+ the section key-value pair to the :meth:`App.build_config` method using the
67
+ `config` parameter (an instance of :class:`~kivy.config.ConfigParser`)::
68
+
69
+ class TestApp(App):
70
+ def build_config(self, config):
71
+ config.setdefaults('section1', {
72
+ 'key1': 'value1',
73
+ 'key2': '42'
74
+ })
75
+
76
+ As soon as you add one section to the config, a file is created on the
77
+ disk (see :attr:`~App.get_application_config` for its location) and
78
+ named based your class name. "TestApp" will give a config file named
79
+ "test.ini" with the content::
80
+
81
+ [section1]
82
+ key1 = value1
83
+ key2 = 42
84
+
85
+ The "test.ini" will be automatically loaded at runtime and you can access the
86
+ configuration in your :meth:`App.build` method::
87
+
88
+ class TestApp(App):
89
+ def build_config(self, config):
90
+ config.setdefaults('section1', {
91
+ 'key1': 'value1',
92
+ 'key2': '42'
93
+ })
94
+
95
+ def build(self):
96
+ config = self.config
97
+ return Label(text='key1 is %s and key2 is %d' % (
98
+ config.get('section1', 'key1'),
99
+ config.getint('section1', 'key2')))
100
+
101
+ Create a settings panel
102
+ ~~~~~~~~~~~~~~~~~~~~~~~
103
+
104
+ Your application can have a settings panel to let your user configure some of
105
+ your config tokens. Here is an example done in the KinectViewer example
106
+ (available in the examples directory):
107
+
108
+ .. image:: images/app-settings.jpg
109
+ :align: center
110
+
111
+ You can add your own panels of settings by extending
112
+ the :meth:`App.build_settings` method.
113
+ Check the :class:`~kivy.uix.settings.Settings` about how to create a panel,
114
+ because you need a JSON file / data first.
115
+
116
+ Let's take as an example the previous snippet of TestApp with custom
117
+ config. We could create a JSON like this::
118
+
119
+ [
120
+ { "type": "title",
121
+ "title": "Test application" },
122
+
123
+ { "type": "options",
124
+ "title": "My first key",
125
+ "desc": "Description of my first key",
126
+ "section": "section1",
127
+ "key": "key1",
128
+ "options": ["value1", "value2", "another value"] },
129
+
130
+ { "type": "numeric",
131
+ "title": "My second key",
132
+ "desc": "Description of my second key",
133
+ "section": "section1",
134
+ "key": "key2" }
135
+ ]
136
+
137
+ Then, we can create a panel using this JSON to automatically create all the
138
+ options and link them to our :attr:`App.config` ConfigParser instance::
139
+
140
+ class TestApp(App):
141
+ # ...
142
+ def build_settings(self, settings):
143
+ jsondata = """... put the json data here ..."""
144
+ settings.add_json_panel('Test application',
145
+ self.config, data=jsondata)
146
+
147
+ That's all! Now you can press F1 (default keystroke) to toggle the
148
+ settings panel or press the "settings" key on your android device. You
149
+ can manually call :meth:`App.open_settings` and
150
+ :meth:`App.close_settings` if you want to handle this manually. Every
151
+ change in the panel is automatically saved in the config file.
152
+
153
+ You can also use :meth:`App.build_settings` to modify properties of
154
+ the settings panel. For instance, the default panel has a sidebar for
155
+ switching between json panels whose width defaults to 200dp. If you'd
156
+ prefer this to be narrower, you could add::
157
+
158
+ settings.interface.menu.width = dp(100)
159
+
160
+ to your :meth:`build_settings` method.
161
+
162
+ You might want to know when a config value has been changed by the
163
+ user in order to adapt or reload your UI. You can then overload the
164
+ :meth:`on_config_change` method::
165
+
166
+ class TestApp(App):
167
+ # ...
168
+ def on_config_change(self, config, section, key, value):
169
+ if config is self.config:
170
+ token = (section, key)
171
+ if token == ('section1', 'key1'):
172
+ print('Our key1 has been changed to', value)
173
+ elif token == ('section1', 'key2'):
174
+ print('Our key2 has been changed to', value)
175
+
176
+ The Kivy configuration panel is added by default to the settings
177
+ instance. If you don't want this panel, you can declare your Application as
178
+ follows::
179
+
180
+ class TestApp(App):
181
+ use_kivy_settings = False
182
+ # ...
183
+
184
+ This only removes the Kivy panel but does not stop the settings instance
185
+ from appearing. If you want to prevent the settings instance from appearing
186
+ altogether, you can do this::
187
+
188
+ class TestApp(App):
189
+ def open_settings(self, *largs):
190
+ pass
191
+
192
+ .. versionadded:: 1.0.7
193
+
194
+ Profiling with on_start and on_stop
195
+ -----------------------------------
196
+
197
+ It is often useful to profile python code in order to discover locations to
198
+ optimise. The standard library profilers
199
+ (http://docs.python.org/2/library/profile.html) provides multiple options for
200
+ profiling code. For profiling the entire program, the natural
201
+ approaches of using profile as a module or profile's run method does not work
202
+ with Kivy. It is however, possible to use :meth:`App.on_start` and
203
+ :meth:`App.on_stop` methods::
204
+
205
+ import cProfile
206
+
207
+ class MyApp(App):
208
+ def on_start(self):
209
+ self.profile = cProfile.Profile()
210
+ self.profile.enable()
211
+
212
+ def on_stop(self):
213
+ self.profile.disable()
214
+ self.profile.dump_stats('myapp.profile')
215
+
216
+ This will create a file called `myapp.profile` when you exit your app.
217
+
218
+ Customising layout
219
+ ------------------
220
+
221
+ You can choose different settings widget layouts by setting
222
+ :attr:`App.settings_cls`. By default, this is a
223
+ :class:`~kivy.uix.settings.Settings` class which provides the pictured
224
+ sidebar layout, but you could set it to any of the other layouts
225
+ provided in :mod:`kivy.uix.settings` or create your own. See the
226
+ module documentation for :mod:`kivy.uix.settings` for more
227
+ information.
228
+
229
+ You can customise how the settings panel is displayed by
230
+ overriding :meth:`App.display_settings` which is called before
231
+ displaying the settings panel on the screen. By default, it
232
+ simply draws the panel on top of the window, but you could modify it
233
+ to (for instance) show the settings in a
234
+ :class:`~kivy.uix.popup.Popup` or add it to your app's
235
+ :class:`~kivy.uix.screenmanager.ScreenManager` if you are using
236
+ one. If you do so, you should also modify :meth:`App.close_settings`
237
+ to exit the panel appropriately. For instance, to have the settings
238
+ panel appear in a popup you can do::
239
+
240
+ def display_settings(self, settings):
241
+ try:
242
+ p = self.settings_popup
243
+ except AttributeError:
244
+ self.settings_popup = Popup(content=settings,
245
+ title='Settings',
246
+ size_hint=(0.8, 0.8))
247
+ p = self.settings_popup
248
+ if p.content is not settings:
249
+ p.content = settings
250
+ p.open()
251
+
252
+ def close_settings(self, *args):
253
+ try:
254
+ p = self.settings_popup
255
+ p.dismiss()
256
+ except AttributeError:
257
+ pass # Settings popup doesn't exist
258
+
259
+ Finally, if you want to replace the current settings panel widget, you
260
+ can remove the internal references to it using
261
+ :meth:`App.destroy_settings`. If you have modified
262
+ :meth:`App.display_settings`, you should be careful to detect if the
263
+ settings panel has been replaced.
264
+
265
+ Pause mode
266
+ ----------
267
+
268
+ .. versionadded:: 1.1.0
269
+
270
+ On tablets and phones, the user can switch at any moment to another
271
+ application. By default, your application will close and the
272
+ :meth:`App.on_stop` event will be fired.
273
+
274
+ If you support Pause mode, when switching to another application, your
275
+ application will wait indefinitely until the user
276
+ switches back to your application. There is an issue with OpenGL on Android
277
+ devices: it is not guaranteed that the OpenGL ES Context will be restored when
278
+ your app resumes. The mechanism for restoring all the OpenGL data is not yet
279
+ implemented in Kivy.
280
+
281
+ The currently implemented Pause mechanism is:
282
+
283
+ #. Kivy checks every frame if Pause mode is activated by the Operating
284
+ System due to the user switching to another application, a phone
285
+ shutdown or any other reason.
286
+ #. :meth:`App.on_pause` is called:
287
+ #. If False is returned or :meth:`App.on_pause` has no return statement,
288
+ then :meth:`App.on_stop` is called.
289
+ #. If True is returned or :meth:`App.on_pause` is not defined, the
290
+ application will sleep until the OS resumes our App.
291
+ #. When the app is resumed, :meth:`App.on_resume` is called.
292
+ #. If our app memory has been reclaimed by the OS, then nothing will be
293
+ called.
294
+
295
+ Here is a simple example of how on_pause() should be used::
296
+
297
+ class TestApp(App):
298
+
299
+ def on_pause(self):
300
+ # Here you can save data if needed
301
+ return True
302
+
303
+ def on_resume(self):
304
+ # Here you can check if any data needs replacing (usually nothing)
305
+ pass
306
+
307
+ .. warning::
308
+
309
+ Both `on_pause` and `on_stop` must save important data because after
310
+ `on_pause` is called, `on_resume` may not be called at all.
311
+
312
+ Asynchronous app
313
+ ----------------
314
+
315
+ In addition to running an app normally,
316
+ Kivy can be run within an async event loop such as provided by the standard
317
+ library asyncio package or the trio package (highly recommended).
318
+
319
+ Background
320
+ ~~~~~~~~~~
321
+
322
+ Normally, when a Kivy app is run, it blocks the thread that runs it until the
323
+ app exits. Internally, at each clock iteration it executes all the app
324
+ callbacks, handles graphics and input, and idles by sleeping for any remaining
325
+ time.
326
+
327
+ To be able to run asynchronously, the Kivy app may not sleep, but instead must
328
+ release control of the running context to the asynchronous event loop running
329
+ the Kivy app. We do this when idling by calling the appropriate functions of
330
+ the async package being used instead of sleeping.
331
+
332
+ Async configuration
333
+ ~~~~~~~~~~~~~~~~~~~
334
+
335
+ To run a Kivy app asynchronously, either the :func:`async_runTouchApp` or
336
+ :meth:`App.async_run` coroutine must be scheduled to run in the event loop of
337
+ the async library being used.
338
+
339
+ The environmental variable ``KIVY_EVENTLOOP`` or the ``async_lib`` parameter in
340
+ :func:`async_runTouchApp` and :meth:`App.async_run` set the async
341
+ library that Kivy uses internally when the app is run with
342
+ :func:`async_runTouchApp` and :meth:`App.async_run`. It can be set to one of
343
+ `"asyncio"` when the standard library `asyncio` is used, or `"trio"` if the
344
+ trio library is used. If the environment variable is not set and ``async_lib``
345
+ is not provided, the stdlib ``asyncio`` is used.
346
+
347
+ :meth:`~kivy.clock.ClockBaseBehavior.init_async_lib` can also be directly
348
+ called to set the async library to use, but it may only be called before the
349
+ app has begun running with :func:`async_runTouchApp` or :meth:`App.async_run`.
350
+
351
+ To run the app asynchronously, one schedules :func:`async_runTouchApp`
352
+ or :meth:`App.async_run` to run within the given library's async event loop as
353
+ in the examples shown below. Kivy is then treated as just another coroutine
354
+ that the given library runs in its event loop. Internally, Kivy will use the
355
+ specified async library's API, so ``KIVY_EVENTLOOP`` or ``async_lib`` must
356
+ match the async library that is running Kivy.
357
+
358
+
359
+ For a fuller basic and more advanced examples, see the demo apps in
360
+ ``examples/async``.
361
+
362
+ Asyncio example
363
+ ~~~~~~~~~~~~~--
364
+
365
+ .. code-block:: python
366
+
367
+ import asyncio
368
+
369
+ from kivy.app import async_runTouchApp
370
+ from kivy.uix.label import Label
371
+
372
+
373
+ loop = asyncio.get_event_loop()
374
+ loop.run_until_complete(
375
+ async_runTouchApp(Label(text='Hello, World!'), async_lib='asyncio'))
376
+ loop.close()
377
+
378
+ Trio example
379
+ ~~~~~~~~~~--
380
+
381
+ .. code-block:: python
382
+
383
+ import trio
384
+
385
+ from kivy.app import async_runTouchApp
386
+ from kivy.uix.label import Label
387
+
388
+ from functools import partial
389
+
390
+ # use functools.partial() to pass keyword arguments:
391
+ async_runTouchApp_func = partial(async_runTouchApp, async_lib='trio')
392
+
393
+ trio.run(async_runTouchApp_func, Label(text='Hello, World!'))
394
+
395
+ Interacting with Kivy app from other coroutines
396
+ -----------------------------------------------
397
+
398
+ It is fully safe to interact with any kivy object from other coroutines
399
+ running within the same async event loop. This is because they are all running
400
+ from the same thread and the other coroutines are only executed when Kivy
401
+ is idling.
402
+
403
+ Similarly, the kivy callbacks may safely interact with objects from other
404
+ coroutines running in the same event loop. Normal single threaded rules apply
405
+ to both case.
406
+
407
+ .. versionadded:: 2.0.0
408
+
409
+ '''
410
+
411
+ __all__ = ('App', 'runTouchApp', 'async_runTouchApp', 'stopTouchApp')
412
+
413
+ import os
414
+ from inspect import getfile
415
+ from os.path import dirname, join, exists, sep, expanduser, isfile
416
+ from kivy.config import ConfigParser
417
+ from kivy.base import runTouchApp, async_runTouchApp, stopTouchApp
418
+ from kivy.compat import string_types
419
+ from kivy.factory import Factory
420
+ from kivy.logger import Logger
421
+ from kivy.event import EventDispatcher
422
+ from kivy.lang import Builder
423
+ from kivy.resources import resource_find
424
+ from kivy.utils import platform
425
+ from kivy.uix.widget import Widget
426
+ from kivy.properties import ObjectProperty, StringProperty
427
+ from kivy.setupconfig import USE_SDL2
428
+
429
+
430
+ class App(EventDispatcher):
431
+ ''' Application class, see module documentation for more information.
432
+
433
+ :Events:
434
+ `on_start`:
435
+ Fired when the application is being started (before the
436
+ :func:`~kivy.base.runTouchApp` call.
437
+ `on_stop`:
438
+ Fired when the application stops.
439
+ `on_pause`:
440
+ Fired when the application is paused by the OS.
441
+ `on_resume`:
442
+ Fired when the application is resumed from pause by the OS. Beware:
443
+ you have no guarantee that this event will be fired after the
444
+ `on_pause` event has been called.
445
+
446
+ .. versionchanged:: 1.7.0
447
+ Parameter `kv_file` added.
448
+
449
+ .. versionchanged:: 1.8.0
450
+ Parameters `kv_file` and `kv_directory` are now properties of App.
451
+ '''
452
+
453
+ title = StringProperty(None)
454
+ '''
455
+ Title of your application. You can set this as follows::
456
+
457
+ class MyApp(App):
458
+ def build(self):
459
+ self.title = 'Hello world'
460
+
461
+ .. versionadded:: 1.0.5
462
+
463
+ .. versionchanged:: 1.8.0
464
+ `title` is now a :class:`~kivy.properties.StringProperty`. Don't
465
+ set the title in the class as previously stated in the documentation.
466
+
467
+ .. note::
468
+
469
+ For Kivy < 1.8.0, you can set this as follows::
470
+
471
+ class MyApp(App):
472
+ title = 'Custom title'
473
+
474
+ If you want to dynamically change the title, you can do::
475
+
476
+ from kivy.base import EventLoop
477
+ EventLoop.window.title = 'New title'
478
+
479
+ '''
480
+
481
+ icon = StringProperty(None)
482
+ '''Icon of your application.
483
+ The icon can be located in the same directory as your main file. You can
484
+ set this as follows::
485
+
486
+ class MyApp(App):
487
+ def build(self):
488
+ self.icon = 'myicon.png'
489
+
490
+ .. versionadded:: 1.0.5
491
+
492
+ .. versionchanged:: 1.8.0
493
+ `icon` is now a :class:`~kivy.properties.StringProperty`. Don't set the
494
+ icon in the class as previously stated in the documentation.
495
+
496
+ .. note::
497
+
498
+ For Kivy prior to 1.8.0, you need to set this as follows::
499
+
500
+ class MyApp(App):
501
+ icon = 'customicon.png'
502
+
503
+ Recommended 256x256 or 1024x1024? for GNU/Linux and Mac OSX
504
+ 32x32 for Windows7 or less. <= 256x256 for windows 8
505
+ 256x256 does work (on Windows 8 at least), but is scaled
506
+ down and doesn't look as good as a 32x32 icon.
507
+ '''
508
+
509
+ use_kivy_settings = True
510
+ '''.. versionadded:: 1.0.7
511
+
512
+ If True, the application settings will also include the Kivy settings. If
513
+ you don't want the user to change any kivy settings from your settings UI,
514
+ change this to False.
515
+ '''
516
+
517
+ settings_cls = ObjectProperty(None)
518
+ '''.. versionadded:: 1.8.0
519
+
520
+ The class used to construct the settings panel and
521
+ the instance passed to :meth:`build_config`. You should
522
+ use either :class:`~kivy.uix.settings.Settings` or one of the provided
523
+ subclasses with different layouts
524
+ (:class:`~kivy.uix.settings.SettingsWithSidebar`,
525
+ :class:`~kivy.uix.settings.SettingsWithSpinner`,
526
+ :class:`~kivy.uix.settings.SettingsWithTabbedPanel`,
527
+ :class:`~kivy.uix.settings.SettingsWithNoMenu`). You can also create your
528
+ own Settings subclass. See the documentation
529
+ of :mod:`~kivy.uix.settings.Settings` for more information.
530
+
531
+ :attr:`~App.settings_cls` is an :class:`~kivy.properties.ObjectProperty`
532
+ and defaults to :class:`~kivy.uix.settings.SettingsWithSpinner` which
533
+ displays settings panels with a spinner to switch between them. If you set
534
+ a string, the :class:`~kivy.factory.Factory` will be used to resolve the
535
+ class.
536
+
537
+ '''
538
+
539
+ kv_directory = StringProperty(None)
540
+ '''Path of the directory where application kv is stored, defaults to None
541
+
542
+ .. versionadded:: 1.8.0
543
+
544
+ If a kv_directory is set, it will be used to get the initial kv file. By
545
+ default, the file is assumed to be in the same directory as the current App
546
+ definition file.
547
+ '''
548
+
549
+ kv_file = StringProperty(None)
550
+ '''Filename of the Kv file to load, defaults to None.
551
+
552
+ .. versionadded:: 1.8.0
553
+
554
+ If a kv_file is set, it will be loaded when the application starts. The
555
+ loading of the "default" kv file will be prevented.
556
+ '''
557
+
558
+ # Return the current running App instance
559
+ _running_app = None
560
+
561
+ __events__ = ('on_start', 'on_stop', 'on_pause', 'on_resume',
562
+ 'on_config_change', )
563
+
564
+ # Stored so that we only need to determine this once
565
+ _user_data_dir = ""
566
+
567
+ def __init__(self, **kwargs):
568
+ App._running_app = self
569
+ self._app_directory = None
570
+ self._app_name = None
571
+ self._app_settings = None
572
+ self._app_window = None
573
+ super(App, self).__init__(**kwargs)
574
+ self.built = False
575
+
576
+ #: Options passed to the __init__ of the App
577
+ self.options = kwargs
578
+
579
+ #: Returns an instance of the :class:`~kivy.config.ConfigParser` for
580
+ #: the application configuration. You can use this to query some config
581
+ #: tokens in the :meth:`build` method.
582
+ self.config = None
583
+
584
+ #: The *root* widget returned by the :meth:`build` method or by the
585
+ #: :meth:`load_kv` method if the kv file contains a root widget.
586
+ self.root = None
587
+
588
+ def build(self):
589
+ '''Initializes the application; it will be called only once.
590
+ If this method returns a widget (tree), it will be used as the root
591
+ widget and added to the window.
592
+
593
+ :return:
594
+ None or a root :class:`~kivy.uix.widget.Widget` instance
595
+ if no self.root exists.'''
596
+
597
+ if not self.root:
598
+ return Widget()
599
+
600
+ def build_config(self, config):
601
+ '''.. versionadded:: 1.0.7
602
+
603
+ This method is called before the application is initialized to
604
+ construct your :class:`~kivy.config.ConfigParser` object. This
605
+ is where you can put any default section / key / value for your
606
+ config. If anything is set, the configuration will be
607
+ automatically saved in the file returned by
608
+ :meth:`get_application_config`.
609
+
610
+ :Parameters:
611
+ `config`: :class:`~kivy.config.ConfigParser`
612
+ Use this to add default section / key / value items
613
+
614
+ '''
615
+
616
+ def build_settings(self, settings):
617
+ '''.. versionadded:: 1.0.7
618
+
619
+ This method is called when the user (or you) want to show the
620
+ application settings. It is called once when the settings panel
621
+ is first opened, after which the panel is cached. It may be
622
+ called again if the cached settings panel is removed by
623
+ :meth:`destroy_settings`.
624
+
625
+ You can use this method to add settings panels and to
626
+ customise the settings widget e.g. by changing the sidebar
627
+ width. See the module documentation for full details.
628
+
629
+ :Parameters:
630
+ `settings`: :class:`~kivy.uix.settings.Settings`
631
+ Settings instance for adding panels
632
+
633
+ '''
634
+
635
+ def load_kv(self, filename=None):
636
+ '''This method is invoked the first time the app is being run if no
637
+ widget tree has been constructed before for this app.
638
+ This method then looks for a matching kv file in the same directory as
639
+ the file that contains the application class.
640
+
641
+ For example, say you have a file named main.py that contains::
642
+
643
+ class ShowcaseApp(App):
644
+ pass
645
+
646
+ This method will search for a file named `showcase.kv` in
647
+ the directory that contains main.py. The name of the kv file has to be
648
+ the lowercase name of the class, without the 'App' postfix at the end
649
+ if it exists.
650
+
651
+ You can define rules and a root widget in your kv file::
652
+
653
+ <ClassName>: # this is a rule
654
+ ...
655
+
656
+ ClassName: # this is a root widget
657
+ ...
658
+
659
+ There must be only one root widget. See the :doc:`api-kivy.lang`
660
+ documentation for more information on how to create kv files. If your
661
+ kv file contains a root widget, it will be used as self.root, the root
662
+ widget for the application.
663
+
664
+ .. note::
665
+
666
+ This function is called from :meth:`run`, therefore, any widget
667
+ whose styling is defined in this kv file and is created before
668
+ :meth:`run` is called (e.g. in `__init__`), won't have its styling
669
+ applied. Note that :meth:`build` is called after :attr:`load_kv`
670
+ has been called.
671
+ '''
672
+ # Detect filename automatically if it was not specified.
673
+ if filename:
674
+ filename = resource_find(filename)
675
+ else:
676
+ try:
677
+ default_kv_directory = dirname(getfile(self.__class__))
678
+ if default_kv_directory == '':
679
+ default_kv_directory = '.'
680
+ except TypeError:
681
+ # if it's a builtin module.. use the current dir.
682
+ default_kv_directory = '.'
683
+
684
+ kv_directory = self.kv_directory or default_kv_directory
685
+ clsname = self.__class__.__name__.lower()
686
+ if (clsname.endswith('app') and
687
+ not isfile(join(kv_directory, '%s.kv' % clsname))):
688
+ clsname = clsname[:-3]
689
+ filename = join(kv_directory, '%s.kv' % clsname)
690
+
691
+ # Load KV file
692
+ Logger.debug('App: Loading kv <{0}>'.format(filename))
693
+ rfilename = resource_find(filename)
694
+ if rfilename is None or not exists(rfilename):
695
+ Logger.debug('App: kv <%s> not found' % filename)
696
+ return False
697
+ root = Builder.load_file(rfilename)
698
+ if root:
699
+ self.root = root
700
+ return True
701
+
702
+ def get_application_name(self):
703
+ '''Return the name of the application.
704
+ '''
705
+ if self.title is not None:
706
+ return self.title
707
+ clsname = self.__class__.__name__
708
+ if clsname.endswith('App'):
709
+ clsname = clsname[:-3]
710
+ return clsname
711
+
712
+ def get_application_icon(self):
713
+ '''Return the icon of the application.
714
+ '''
715
+ if not resource_find(self.icon):
716
+ return ''
717
+ else:
718
+ return resource_find(self.icon)
719
+
720
+ def get_application_config(self, defaultpath='%(appdir)s/%(appname)s.ini'):
721
+ '''
722
+ Return the filename of your application configuration. Depending
723
+ on the platform, the application file will be stored in
724
+ different locations:
725
+
726
+ - on iOS: <appdir>/Documents/.<appname>.ini
727
+ - on Android: <user_data_dir>/.<appname>.ini
728
+ - otherwise: <appdir>/<appname>.ini
729
+
730
+ When you are distributing your application on Desktops, please
731
+ note that if the application is meant to be installed
732
+ system-wide, the user might not have write-access to the
733
+ application directory. If you want to store user settings, you
734
+ should overload this method and change the default behavior to
735
+ save the configuration file in the user directory. ::
736
+
737
+ class TestApp(App):
738
+ def get_application_config(self):
739
+ return super(TestApp, self).get_application_config(
740
+ '~/.%(appname)s.ini')
741
+
742
+ Some notes:
743
+
744
+ - The tilda '~' will be expanded to the user directory.
745
+ - %(appdir)s will be replaced with the application :attr:`directory`
746
+ - %(appname)s will be replaced with the application :attr:`name`
747
+
748
+ .. versionadded:: 1.0.7
749
+
750
+ .. versionchanged:: 1.4.0
751
+ Customized the defaultpath for iOS and Android platforms. Added a
752
+ defaultpath parameter for desktop OS's (not applicable to iOS
753
+ and Android.)
754
+
755
+ .. versionchanged:: 1.11.0
756
+ Changed the Android version to make use of the
757
+ :attr:`~App.user_data_dir` and added a missing dot to the iOS
758
+ config file name.
759
+ '''
760
+
761
+ if platform == 'android':
762
+ return join(self.user_data_dir, '.{0}.ini'.format(self.name))
763
+ elif platform == 'ios':
764
+ defaultpath = '~/Documents/.%(appname)s.ini'
765
+ elif platform == 'win':
766
+ defaultpath = defaultpath.replace('/', sep)
767
+ return expanduser(defaultpath) % {
768
+ 'appname': self.name, 'appdir': self.directory}
769
+
770
+ @property
771
+ def root_window(self):
772
+ '''.. versionadded:: 1.9.0
773
+
774
+ Returns the root window instance used by :meth:`run`.
775
+ '''
776
+ return self._app_window
777
+
778
+ def load_config(self):
779
+ '''(internal) This function is used for returning a ConfigParser with
780
+ the application configuration. It's doing 3 things:
781
+
782
+ #. Creating an instance of a ConfigParser
783
+ #. Loading the default configuration by calling
784
+ :meth:`build_config`, then
785
+ #. If it exists, it loads the application configuration file,
786
+ otherwise it creates one.
787
+
788
+ :return:
789
+ :class:`~kivy.config.ConfigParser` instance
790
+ '''
791
+ try:
792
+ config = ConfigParser.get_configparser('app')
793
+ except KeyError:
794
+ config = None
795
+ if config is None:
796
+ config = ConfigParser(name='app')
797
+ self.config = config
798
+ self.build_config(config)
799
+ # if no sections are created, that's mean the user don't have
800
+ # configuration.
801
+ if len(config.sections()) == 0:
802
+ return
803
+ # ok, the user have some sections, read the default file if exist
804
+ # or write it !
805
+ filename = self.get_application_config()
806
+ if filename is None:
807
+ return config
808
+ Logger.debug('App: Loading configuration <{0}>'.format(filename))
809
+ if exists(filename):
810
+ try:
811
+ config.read(filename)
812
+ except:
813
+ Logger.error('App: Corrupted config file, ignored.')
814
+ config.name = ''
815
+ try:
816
+ config = ConfigParser.get_configparser('app')
817
+ except KeyError:
818
+ config = None
819
+ if config is None:
820
+ config = ConfigParser(name='app')
821
+ self.config = config
822
+ self.build_config(config)
823
+ pass
824
+ else:
825
+ Logger.debug('App: First configuration, create <{0}>'.format(
826
+ filename))
827
+ config.filename = filename
828
+ config.write()
829
+ return config
830
+
831
+ @property
832
+ def directory(self):
833
+ '''.. versionadded:: 1.0.7
834
+
835
+ Return the directory where the application lives.
836
+ '''
837
+ if self._app_directory is None:
838
+ try:
839
+ self._app_directory = dirname(getfile(self.__class__))
840
+ if self._app_directory == '':
841
+ self._app_directory = '.'
842
+ except TypeError:
843
+ # if it's a builtin module.. use the current dir.
844
+ self._app_directory = '.'
845
+ return self._app_directory
846
+
847
+ def _get_user_data_dir(self):
848
+ # Determine and return the user_data_dir.
849
+ data_dir = ""
850
+ if platform == 'ios':
851
+ data_dir = expanduser(join('~/Documents', self.name))
852
+ elif platform == 'android':
853
+ from jnius import autoclass, cast
854
+ PythonActivity = autoclass('org.kivy.android.PythonActivity')
855
+ context = cast('android.content.Context', PythonActivity.mActivity)
856
+ file_p = cast('java.io.File', context.getFilesDir())
857
+ data_dir = file_p.getAbsolutePath()
858
+ elif platform == 'win':
859
+ data_dir = os.path.join(os.environ['APPDATA'], self.name)
860
+ elif platform == 'macosx':
861
+ data_dir = '~/Library/Application Support/{}'.format(self.name)
862
+ data_dir = expanduser(data_dir)
863
+ else: # _platform == 'linux' or anything else...:
864
+ data_dir = os.environ.get('XDG_CONFIG_HOME', '~/.config')
865
+ data_dir = expanduser(join(data_dir, self.name))
866
+ if not exists(data_dir):
867
+ os.mkdir(data_dir)
868
+ return data_dir
869
+
870
+ @property
871
+ def user_data_dir(self):
872
+ '''
873
+ .. versionadded:: 1.7.0
874
+
875
+ Returns the path to the directory in the users file system which the
876
+ application can use to store additional data.
877
+
878
+ Different platforms have different conventions with regards to where
879
+ the user can store data such as preferences, saved games and settings.
880
+ This function implements these conventions. The <app_name> directory
881
+ is created when the property is called, unless it already exists.
882
+
883
+ On iOS, `~/Documents/<app_name>` is returned (which is inside the
884
+ app's sandbox).
885
+
886
+ On Windows, `%APPDATA%/<app_name>` is returned.
887
+
888
+ On OS X, `~/Library/Application Support/<app_name>` is returned.
889
+
890
+ On Linux, `$XDG_CONFIG_HOME/<app_name>` is returned.
891
+
892
+ On Android, `Context.GetFilesDir
893
+ <https://developer.android.com/reference/android/content/\
894
+ Context.html#getFilesDir()>`_ is returned.
895
+
896
+ .. versionchanged:: 1.11.0
897
+
898
+ On Android, this function previously returned
899
+ `/sdcard/<app_name>`. This folder became read-only by default
900
+ in Android API 26 and the user_data_dir has therefore been moved
901
+ to a writeable location.
902
+
903
+ '''
904
+ if self._user_data_dir == "":
905
+ self._user_data_dir = self._get_user_data_dir()
906
+ return self._user_data_dir
907
+
908
+ @property
909
+ def name(self):
910
+ '''.. versionadded:: 1.0.7
911
+
912
+ Return the name of the application based on the class name.
913
+ '''
914
+ if self._app_name is None:
915
+ clsname = self.__class__.__name__
916
+ if clsname.endswith('App'):
917
+ clsname = clsname[:-3]
918
+ self._app_name = clsname.lower()
919
+ return self._app_name
920
+
921
+ def _run_prepare(self):
922
+ if not self.built:
923
+ self.load_config()
924
+ self.load_kv(filename=self.kv_file)
925
+ root = self.build()
926
+ if root:
927
+ self.root = root
928
+ if self.root:
929
+ if not isinstance(self.root, Widget):
930
+ Logger.critical('App.root must be an _instance_ of Widget')
931
+ raise Exception('Invalid instance in App.root')
932
+ from kivy.core.window import Window
933
+ Window.add_widget(self.root)
934
+
935
+ # Check if the window is already created
936
+ from kivy.base import EventLoop
937
+ window = EventLoop.window
938
+ if window:
939
+ self._app_window = window
940
+ window.set_title(self.get_application_name())
941
+ icon = self.get_application_icon()
942
+ if icon:
943
+ window.set_icon(icon)
944
+ self._install_settings_keys(window)
945
+ else:
946
+ Logger.critical("Application: No window is created."
947
+ " Terminating application run.")
948
+ return
949
+
950
+ self.dispatch('on_start')
951
+
952
+ def run(self):
953
+ '''Launches the app in standalone mode.
954
+ '''
955
+ self._run_prepare()
956
+ runTouchApp()
957
+ self._stop()
958
+
959
+ async def async_run(self, async_lib=None):
960
+ '''Identical to :meth:`run`, but is a coroutine and can be
961
+ scheduled in a running async event loop.
962
+
963
+ See :mod:`kivy.app` for example usage.
964
+
965
+ .. versionadded:: 2.0.0
966
+ '''
967
+ self._run_prepare()
968
+ await async_runTouchApp(async_lib=async_lib)
969
+ self._stop()
970
+
971
+ def stop(self, *largs):
972
+ '''Stop the application.
973
+
974
+ If you use this method, the whole application will stop by issuing
975
+ a call to :func:`~kivy.base.stopTouchApp`.
976
+ Except on Android, set Android state to stop, Kivy state then follows.
977
+ '''
978
+ if platform == 'android':
979
+ from android import mActivity
980
+ mActivity.finishAndRemoveTask()
981
+ else:
982
+ self._stop()
983
+
984
+ def _stop(self, *largs):
985
+ self.dispatch('on_stop')
986
+ stopTouchApp()
987
+
988
+ # Clear the window children
989
+ if self._app_window:
990
+ for child in self._app_window.children:
991
+ self._app_window.remove_widget(child)
992
+ App._running_app = None
993
+
994
+ def pause(self, *largs):
995
+ '''Pause the application.
996
+
997
+ On Android set OS state to pause, Kivy app state follows.
998
+ No functionality on other OS.
999
+ .. versionadded:: 2.2.0
1000
+ '''
1001
+ if platform == 'android':
1002
+ from android import mActivity
1003
+ mActivity.moveTaskToBack(True)
1004
+ else:
1005
+ Logger.info('App.pause() is not available on this OS.')
1006
+
1007
+ def on_start(self):
1008
+ '''Event handler for the `on_start` event which is fired after
1009
+ initialization (after build() has been called) but before the
1010
+ application has started running.
1011
+ '''
1012
+ pass
1013
+
1014
+ def on_stop(self):
1015
+ '''Event handler for the `on_stop` event which is fired when the
1016
+ application has finished running (i.e. the window is about to be
1017
+ closed).
1018
+ '''
1019
+ pass
1020
+
1021
+ def on_pause(self):
1022
+ '''Event handler called when Pause mode is requested. You should
1023
+ return True if your app can go into Pause mode, otherwise
1024
+ return False and your application will be stopped.
1025
+
1026
+ You cannot control when the application is going to go into this mode.
1027
+ It's determined by the Operating System and mostly used for mobile
1028
+ devices (android/ios) and for resizing.
1029
+
1030
+ The default return value is True.
1031
+
1032
+ .. versionadded:: 1.1.0
1033
+ .. versionchanged:: 1.10.0
1034
+ The default return value is now True.
1035
+ '''
1036
+ return True
1037
+
1038
+ def on_resume(self):
1039
+ '''Event handler called when your application is resuming from
1040
+ the Pause mode.
1041
+
1042
+ .. versionadded:: 1.1.0
1043
+
1044
+ .. warning::
1045
+
1046
+ When resuming, the OpenGL Context might have been damaged / freed.
1047
+ This is where you can reconstruct some of your OpenGL state
1048
+ e.g. FBO content.
1049
+ '''
1050
+ pass
1051
+
1052
+ @staticmethod
1053
+ def get_running_app():
1054
+ '''Return the currently running application instance.
1055
+
1056
+ .. versionadded:: 1.1.0
1057
+ '''
1058
+ return App._running_app
1059
+
1060
+ def on_config_change(self, config, section, key, value):
1061
+ '''Event handler fired when a configuration token has been changed by
1062
+ the settings page.
1063
+
1064
+ .. versionchanged:: 1.10.1
1065
+ Added corresponding ``on_config_change`` event.
1066
+ '''
1067
+ pass
1068
+
1069
+ def open_settings(self, *largs):
1070
+ '''Open the application settings panel. It will be created the very
1071
+ first time, or recreated if the previously cached panel has been
1072
+ removed by :meth:`destroy_settings`. The settings panel will be
1073
+ displayed with the
1074
+ :meth:`display_settings` method, which by default adds the
1075
+ settings panel to the Window attached to your application. You
1076
+ should override that method if you want to display the
1077
+ settings panel differently.
1078
+
1079
+ :return:
1080
+ True if the settings has been opened.
1081
+
1082
+ '''
1083
+ if self._app_settings is None:
1084
+ self._app_settings = self.create_settings()
1085
+ displayed = self.display_settings(self._app_settings)
1086
+ if displayed:
1087
+ return True
1088
+ return False
1089
+
1090
+ def display_settings(self, settings):
1091
+ '''.. versionadded:: 1.8.0
1092
+
1093
+ Display the settings panel. By default, the panel is drawn directly
1094
+ on top of the window. You can define other behavior by overriding
1095
+ this method, such as adding it to a ScreenManager or Popup.
1096
+
1097
+ You should return True if the display is successful, otherwise False.
1098
+
1099
+ :Parameters:
1100
+ `settings`: :class:`~kivy.uix.settings.Settings`
1101
+ You can modify this object in order to modify the settings
1102
+ display.
1103
+
1104
+ '''
1105
+ win = self._app_window
1106
+ if not win:
1107
+ raise Exception('No windows are set on the application, you cannot'
1108
+ ' open settings yet.')
1109
+ if settings not in win.children:
1110
+ win.add_widget(settings)
1111
+ return True
1112
+ return False
1113
+
1114
+ def close_settings(self, *largs):
1115
+ '''Close the previously opened settings panel.
1116
+
1117
+ :return:
1118
+ True if the settings has been closed.
1119
+ '''
1120
+ win = self._app_window
1121
+ settings = self._app_settings
1122
+ if win is None or settings is None:
1123
+ return
1124
+ if settings in win.children:
1125
+ win.remove_widget(settings)
1126
+ return True
1127
+ return False
1128
+
1129
+ def create_settings(self):
1130
+ '''Create the settings panel. This method will normally
1131
+ be called only one time per
1132
+ application life-time and the result is cached internally,
1133
+ but it may be called again if the cached panel is removed
1134
+ by :meth:`destroy_settings`.
1135
+
1136
+ By default, it will build a settings panel according to
1137
+ :attr:`settings_cls`, call :meth:`build_settings`, add a Kivy panel if
1138
+ :attr:`use_kivy_settings` is True, and bind to
1139
+ on_close/on_config_change.
1140
+
1141
+ If you want to plug your own way of doing settings, without the Kivy
1142
+ panel or close/config change events, this is the method you want to
1143
+ overload.
1144
+
1145
+ .. versionadded:: 1.8.0
1146
+ '''
1147
+ if self.settings_cls is None:
1148
+ from kivy.uix.settings import SettingsWithSpinner
1149
+ self.settings_cls = SettingsWithSpinner
1150
+ elif isinstance(self.settings_cls, string_types):
1151
+ self.settings_cls = Factory.get(self.settings_cls)
1152
+ s = self.settings_cls()
1153
+ self.build_settings(s)
1154
+ if self.use_kivy_settings:
1155
+ s.add_kivy_panel()
1156
+ s.bind(on_close=self.close_settings,
1157
+ on_config_change=self._on_config_change)
1158
+ return s
1159
+
1160
+ def destroy_settings(self):
1161
+ '''.. versionadded:: 1.8.0
1162
+
1163
+ Dereferences the current settings panel if one
1164
+ exists. This means that when :meth:`App.open_settings` is next
1165
+ run, a new panel will be created and displayed. It doesn't
1166
+ affect any of the contents of the panel, but lets you (for
1167
+ instance) refresh the settings panel layout if you have
1168
+ changed the settings widget in response to a screen size
1169
+ change.
1170
+
1171
+ If you have modified :meth:`~App.open_settings` or
1172
+ :meth:`~App.display_settings`, you should be careful to
1173
+ correctly detect if the previous settings widget has been
1174
+ destroyed.
1175
+
1176
+ '''
1177
+ if self._app_settings is not None:
1178
+ self._app_settings = None
1179
+
1180
+ #
1181
+ # privates
1182
+ #
1183
+
1184
+ def _on_config_change(self, *largs):
1185
+ self.dispatch('on_config_change', *largs[1:])
1186
+
1187
+ def _install_settings_keys(self, window):
1188
+ window.bind(on_keyboard=self._on_keyboard_settings)
1189
+
1190
+ def _on_keyboard_settings(self, window, *largs):
1191
+ key = largs[0]
1192
+ setting_key = 282 # F1
1193
+
1194
+ # android hack, if settings key is pygame K_MENU
1195
+ if platform == 'android' and not USE_SDL2:
1196
+ import pygame
1197
+ setting_key = pygame.K_MENU
1198
+
1199
+ if key == setting_key:
1200
+ # toggle settings panel
1201
+ if not self.open_settings():
1202
+ self.close_settings()
1203
+ return True
1204
+ if key == 27:
1205
+ return self.close_settings()
1206
+
1207
+ def on_title(self, instance, title):
1208
+ if self._app_window:
1209
+ self._app_window.set_title(title)
1210
+
1211
+ def on_icon(self, instance, icon):
1212
+ if self._app_window:
1213
+ self._app_window.set_icon(self.get_application_icon())