v y . a p p i m p o r t A p p f r o m k i v y . u i x . b u t t o n i m p o r t B u t t o n c l a s s H e l l o K i v y ( A p p ) : d e f b u i l d ( s e l f ) : r e t u r n B u t t o n ( t e x t = ' H e l l o ' , f o n t _ s i z e = ' 2 0 d p ' ) H e l l o K i v y ( ) . r u n ( ) ➔ P Y T H O N 11/56
v y . a p p i m p o r t A p p f r o m k i v y . u i x . b u t t o n i m p o r t B u t t o n c l a s s H e l l o K i v y ( A p p ) : d e f b u i l d ( s e l f ) : s e l f . c o u n t = 0 b t n = B u t t o n ( t e x t = ' H e l l o ' , f o n t _ s i z e = ' 2 0 d p ' ) b t n . b i n d ( o n _ p r e s s = s e l f . i n c r e m e n t ) r e t u r n b t n d e f i n c r e m e n t ( s e l f , b u t t o n ) : s e l f . c o u n t + = 1 b t n . t e x t = ' H e l l o { } ' . f o r m a t ( s e l f . c o u n t ) H e l l o K i v y ( ) . r u n ( ) ➔ P Y T H O N 12/56
v y . a p p i m p o r t A p p f r o m k i v y . u i x . b u t t o n i m p o r t B u t t o n f r o m k i v y . u i x . s w i t c h i m p o r t S w i t c h f r o m k i v y . u i x . b o x l a y o u t i m p o r t B o x L a y o u t c l a s s H e l l o K i v y ( A p p ) : d e f b u i l d ( s e l f ) : r o o t = B o x L a y o u t ( ) r o o t . a d d _ w i d g e t ( B u t t o n ( t e x t = ' H e l l o ' ) ) r o o t . a d d _ w i d g e t ( S w i t c h ( ) ) r o o t . a d d _ w i d g e t ( B u t t o n ( t e x t = ' W o r l d ' ) ) r e t u r n r o o t H e l l o K i v y ( ) . r u n ( ) ➔ P Y T H O N 13/56
v y . a p p i m p o r t A p p f r o m k i v y . u i x . b u t t o n i m p o r t B u t t o n f r o m k i v y . u i x . s w i t c h i m p o r t S w i t c h f r o m k i v y . u i x . b o x l a y o u t i m p o r t B o x L a y o u t c l a s s H e l l o K i v y ( A p p ) : d e f b u i l d ( s e l f ) : r o o t = B o x L a y o u t ( p a d d i n g = ' 2 0 d p ' , s p a c i n g = ' 2 0 d p ' ) r o o t . a d d _ w i d g e t ( B u t t o n ( t e x t = ' H e l l o ' ) ) r o o t . a d d _ w i d g e t ( S w i t c h ( ) ) r o o t . a d d _ w i d g e t ( B u t t o n ( t e x t = ' W o r l d ' ) ) r e t u r n r o o t H e l l o K i v y ( ) . r u n ( ) ➔ P Y T H O N 14/56
o b i m p o r t g l o b f r o m k i v y . a p p i m p o r t A p p f r o m k i v y . u i x . c a r o u s e l i m p o r t C a r o u s e l f r o m k i v y . u i x . i m a g e i m p o r t I m a g e c l a s s H e l l o K i v y ( A p p ) : d e f b u i l d ( s e l f ) : r o o t = C a r o u s e l ( d i r e c t i o n = ' r i g h t ' , l o o p = T r u e ) f o r f n i n g l o b ( ' i m a g e s / * . j p g ' ) : r o o t . a d d _ w i d g e t ( I m a g e ( s o u r c e = f n ) ) r e t u r n r o o t H e l l o K i v y ( ) . r u n ( ) ➔ P Y T H O N 15/56
· EventDispatcher or Widget classes d i s p a t c h e r . b i n d ( p r o p e r t y = c a l l b a c k ) d i s p a t c h e r . u n b i n d ( p r o p e r t y = c a l l b a c k ) - - - · b n p = B o u n d e d N u m e r i c P r o p e r t y ( 0 , m i n = - 5 0 0 , m a x = 5 0 0 ) Will raise a Exception if the value if out of the bounds - - · b n p = B o u n d e d N u m e r i c P r o p e r t y ( 0 , m i n = - 5 0 0 , m a x = 5 0 0 , e r r o r v a l u e = 0 ) b n p = B o u n d e d N u m e r i c P r o p e r t y ( 0 , m i n = - 5 0 0 , m a x = 5 0 0 , e r r o r h a n d l e r = l a m b d a x : 5 0 0 i f x > 5 0 0 e l s e - 5 0 0 ) - - 16/56
v y . a p p i m p o r t A p p f r o m k i v y . u i x . b u t t o n i m p o r t B u t t o n f r o m k i v y . p r o p e r t i e s i m p o r t N u m e r i c P r o p e r t y c l a s s H e l l o K i v y ( A p p ) : c o u n t = N u m e r i c P r o p e r t y ( 0 ) d e f b u i l d ( s e l f ) : s e l f . c o u n t = 0 b t n = B u t t o n ( t e x t = ' H e l l o ' , f o n t _ s i z e = ' 2 0 d p ' ) b t n . b i n d ( o n _ p r e s s = s e l f . i n c r e m e n t ) r e t u r n b t n d e f i n c r e m e n t ( s e l f , b u t t o n ) : s e l f . c o u n t + = 1 H e l l o K i v y ( ) . r u n ( ) ➔ P Y T H O N 17/56
e l l o K i v y ( A p p ) : c o u n t = N u m e r i c P r o p e r t y ( 0 ) d e f b u i l d ( s e l f ) : s e l f . b i n d ( c o u n t = s e l f . u p d a t e _ w i d g e t s ) s e l f . b t n = B u t t o n ( t e x t = ' H e l l o ' , f o n t _ s i z e = ' 2 0 d p ' ) s e l f . b t n . b i n d ( o n _ p r e s s = s e l f . i n c r e m e n t ) r e t u r n s e l f . b t n d e f i n c r e m e n t ( s e l f , b u t t o n ) : s e l f . c o u n t + = 1 d e f u p d a t e _ w i d g e t s ( s e l f , a p p , v a l u e ) : s e l f . b t n . t e x t = ' H e l l o { } ' . f o r m a t ( s e l f . c o u n t ) ➔ P Y T H O N 18/56
components 3 types of constructions #kivy Kv rule: "style" that apply to a widget class Root widget: instanciate a widget for you Dynamic classes: create widget class on-the-fly · · · 19/56
v y . a p p i m p o r t A p p f r o m k i v y . u i x . b o x l a y o u t i m p o r t B o x L a y o u t f r o m k i v y . p r o p e r t i e s i m p o r t N u m e r i c P r o p e r t y c l a s s M a i n U I ( B o x L a y o u t ) : p a s s c l a s s D e m o K v ( A p p ) : c o u n t = N u m e r i c P r o p e r t y ( 0 ) d e f b u i l d ( s e l f ) : r e t u r n M a i n U I ( ) D e m o K v ( ) . r u n ( ) ➔ P Y T H O N 20/56
1 . 7 . 1 < M a i n U I > : o r i e n t a t i o n : ' h o r i z o n t a l ' L a b e l : t e x t : ' C o u n t : { } ' . f o r m a t ( a p p . c o u n t ) B u t t o n : t e x t : ' P r e s s m e ' o n _ p r e s s : a p p . c o u n t + = 1 ➔ K V 21/56
self: represent the current widget in the tree root: represent the top widget in the kv rule app: instance of the current running application · · · < M a i n U I > : L a b e l : x : r o o t . x + r o o t . w i d t h / 2 . y : r o o t . c e n t e r _ y P Y T H O N 22/56
1 . 7 . 1 < M a i n U I > : o r i e n t a t i o n : ' h o r i z o n t a l ' i f s e l f . w i d t h > s e l f . h e i g h t e l s e ' v e r t i c a l ' L a b e l : t e x t : ' V a l u e : { : 2 f } ' . f o r m a t ( s l i d e r . v a l u e ) f o n t _ s i z e : ' 2 0 d p ' S l i d e r : i d : s l i d e r ➔ K V 23/56
1 . 7 . 1 < N u m b e r e d S l i d e r @ S l i d e r > : L a b e l : t e x t : s t r ( i n t ( r o o t . v a l u e ) ) f o n t _ s i z e : ' 2 0 d p ' w i d t h : s e l f . t e x t u r e _ s i z e [ 0 ] x : r o o t . v a l u e _ p o s [ 0 ] - s e l f . w i d t h / 2 . c e n t e r _ y : r o o t . c e n t e r _ y + d p ( 3 0 ) < M a i n U I > : N u m b e r e d S l i d e r : v a l u e : 5 0 m i n : 1 0 m a x : 9 0 ➔ K V 24/56
and Shaders (if you know what you're doing... power!) Optimized rendering using Cython/C Graphics Instructions for sequential programming & "JIT graphics compiler" Also eases porting, if there is a GPU, GLES isn't far away... · · · · · 25/56
1 . 7 . 1 < - N u m b e r e d S l i d e r @ S l i d e r > : c a n v a s : C o l o r : r g b : 1 , 0 , 0 R e c t a n g l e : p o s : s e l f . p o s s i z e : s e l f . w i d t h * s e l f . v a l u e _ n o r m a l i z e d , s e l f . h e i g h t ➔ K V 26/56
1 . 7 . 1 < - N u m b e r e d S l i d e r @ S l i d e r > : s i z e _ h i n t _ y : N o n e h e i g h t : ' 4 8 d p ' c a n v a s : C o l o r : r g b : . 2 , . 2 , . 2 R e c t a n g l e : p o s : s e l f . p o s s i z e : s e l f . s i z e C o l o r : r g b : s e l f . v a l u e _ n o r m a l i z e d , 1 - s e l f . v a l u e _ n o r m a l i z e d , 0 R e c t a n g l e : p o s : s e l f . p o s s i z e : s e l f . w i d t h * s e l f . v a l u e _ n o r m a l i z e d , s e l f . h e i g h t ➔ K V 27/56
1 . 7 . 1 < - N u m b e r e d S l i d e r @ S l i d e r > : s i z e _ h i n t _ y : N o n e h e i g h t : ' 4 8 d p ' c a n v a s : C o l o r : r g b : 1 - s e l f . v a l u e _ n o r m a l i z e d , 1 - s e l f . v a l u e _ n o r m a l i z e d , 0 R e c t a n g l e : p o s : s e l f . p o s s i z e : s e l f . w i d t h * s e l f . v a l u e _ n o r m a l i z e d , s e l f . h e i g h t s o u r c e : ' a t l a s : / / d a t a / i m a g e s / d e f a u l t t h e m e / s l i d e r _ c u r s o r ' ➔ K V 28/56
1 . 7 . 1 < - N u m b e r e d S l i d e r @ S l i d e r > : s i z e _ h i n t _ y : N o n e h e i g h t : ' 4 8 d p ' c a n v a s : C o l o r : r g b : 1 - s e l f . v a l u e _ n o r m a l i z e d , 1 - s e l f . v a l u e _ n o r m a l i z e d , 0 B o r d e r I m a g e : b o r d e r : 2 4 , 2 4 , 2 4 , 2 4 p o s : s e l f . p o s s i z e : s e l f . w i d t h * s e l f . v a l u e _ n o r m a l i z e d , s e l f . h e i g h t s o u r c e : ' a t l a s : / / d a t a / i m a g e s / d e f a u l t t h e m e / s l i d e r _ c u r s o r ' ➔ K V 29/56
Android SDK Android NDK · · s u d o a p t - g e t i n s t a l l b u i l d - e s s e n t i a l g i t - c o r e c c a c h e a n t p y t h o n - p i p p y t h o n - d e v p i p i n s t a l l - - u p g r a d e c y t h o n e x p o r t A N D R O I D S D K = " / h o m e / t i t o / c o d e / a n d r o i d / a n d r o i d - s d k - l i n u x " e x p o r t A N D R O I D N D K = " / h o m e / t i t o / c o d e / a n d r o i d / a n d r o i d - n d k - r 8 e " e x p o r t A N D R O I D N D K V E R = r 8 e e x p o r t A N D R O I D A P I = 2 1 e x p o r t P A T H = $ A N D R O I D N D K : $ A N D R O I D S D K / t o o l s : $ A N D R O I D S D K / p l a t f o r m - t o o l s / : $ P A T H B A S H 35/56
t c l o n e g i t : / / g i t h u b . c o m / k i v y / p y t h o n - f o r - a n d r o i d $ c d p y t h o n - f o r - a n d r o i d $ . / d i s t r i b u t e . s h - m ' k i v y ' . . . l o t o f s t u f f h a p p e n . . . m a y b e a n e r r o r b e c a u s e y o u m i s s e d s o m e p r e r e q u i s i t e s A l l d o n e ! B A S H 36/56
d i s t / d e f a u l t $ . / b u i l d . p y - - n a m e ' T o u c h t r a c e r ' - - p a c k a g e o r g . t e s t . t o u c h t r a c e r \ - - v e r s i o n 1 . 0 - - p r i v a t e ~ / c o d e / k i v y / e x a m p l e s / d e m o / t o u c h t r a c e r / \ d e b u g $ a d b i n s t a l l - r b i n / T o u c h t r a c e r - 1 . 0 - d e b u g . a p k $ a d b l o g c a t . . . d e m o t i m e . B A S H 37/56
o o l s / c r e a t e - x c o d e - p r o j e c t . s h t o u c h t r a c e r \ ~ / c o d e / k i v y / e x a m p l e s / d e m o / t o u c h t r a c e r $ o p e n a p p - t o u c h t r a c e r / t o u c h t r a c e r . x c o d e p r o j B A S H 41/56
prerequisites (Android NDK, SDK, Cython...) Compile the toolchain Install the pure-python module in a virtualenv Copy the virtualenv into your application Patch your main.py to include the virtualenv Create the package (APK, IPA...) Deploy on 1 or multiple devices Run the application on the device Tail the logs from the device to your console · · · · · · · · · · 44/56
e r i n i t $ b u i l d o z e r a n d r o i d d e b u g d e p l o y r u n l o g c a t # o r s e t a d e f a u l t $ b u i l d o z e r s e t d e f a u l t a n d r o i d d e b u g d e p l o y r u n l o g c a t $ b u i l d o z e r # o r e x e c u t e i n a r e m o t e s s h d e v i c e $ b u i l d o z e r - r e m o t e 1 9 2 . 1 6 8 . x . x i o s d e b u g d e p l o y r u n B A S H 45/56
PyOBJus - Access Objective-C from Python #kivy Works on Desktop and Android It uses JNI / Java reflection · · It uses Objective C reflection (Still in progress, doesn't work) · · 47/56
"Hello World" #kivy f r o m j n i u s i m p o r t a u t o c l a s s L o c a l e = a u t o c l a s s ( ' j a v a . u t i l . L o c a l e ' ) P y t h o n A c t i v i t y = a u t o c l a s s ( ' o r g . r e n p y . a n d r o i d . P y t h o n A c t i v i t y ' ) T e x t T o S p e e c h = a u t o c l a s s ( ' a n d r o i d . s p e e c h . t t s . T e x t T o S p e e c h ' ) t t s = T e x t T o S p e e c h ( P y t h o n A c t i v i t y . m A c t i v i t y , N o n e ) t t s . s e t L a n g u a g e ( L o c a l e . U S ) t t s . s p e a k ( ' H e l l o W o r l d . ' , T e x t T o S p e e c h . Q U E U E _ F L U S H , N o n e ) t t s . s e t L a n g u a g e ( L o c a l e . I T A L Y ) t t s . s p e a k ( ' B u o n g i o r n o s i g n o r e ' , T e x t T o S p e e c h . Q U E U E _ F L U S H , N o n e ) P Y T H O N 48/56
in Python! (wip). #kivy c l a s s G p s L i s t e n e r ( P y t h o n J a v a C l a s s ) : _ _ j a v a i n t e r f a c e s _ _ = [ ' a n d r o i d / l o c a t i o n / L o c a t i o n L i s t e n e r ' ] @ j a v a _ m e t h o d ( ' ( L a n d r o i d / l o c a t i o n / L o c a t i o n ; ) ' ) d e f o n L o c a t i o n C h a n g e d ( s e l f , l o c a t i o n ) : p r i n t ' l a t ' , l o c a t i o n . g e t L a t i t u d e ( ) p r i n t ' l o n ' , l o c a t i o n . g e t L o n g i t u d e ( ) L o c a t i o n M a n a g e r = a u t o c l a s s ( ' a n d r o i d . l o c a t i o n . L o c a t i o n M a n a g e r ' ) P y t h o n A c t i v i t y = a u t o c l a s s ( ' o r g . r e n p y . a n d r o i d . P y t h o n A c t i v i t y ' ) C o n t e x t = a u t o c l a s s ( ' a n d r o i d . c o n t e n t . C o n t e x t ' ) l o c a t i o n M a n a g e r = P y t h o n A c t i v i t y . m A c t i v i t y . g e t S y s t e m S e r v i c e ( C o n t e x t . L O C A T I O N _ S E R V I C E ) l o c a t i o n M a n a g e r . r e q u e s t L o c a t i o n U p d a t e s ( L o c a t i o n M a n a g e r . G P S _ P R O V I D E R , 1 0 0 0 0 , 1 0 , G p s L i s t e n e r ( ) ) P Y T H O N 49/56
platform-dependant apis Accessing easily to accelerometer, gps, camera, etc. Started this week! #kivy f r o m p l y e r i m p o r t n o t i f i c a t i o n n o t i f i c a t i o n . n o t i f y ( t i t l e = ' H e l l o ' , m e s s a g e = ' W o r l d ' ) P Y T H O N 50/56
Kivy and all the subprojects to Python 3.3 ➔ Done in master, same basecode for 2.7 and 3.3 ➔ Next version will be Python 3.3 ready :) Thank you PSF! #kivy 52/56
Pi from Bounty Source We got funded in 5 days ! ➔ POC done and released in 1.7.0 The next step was $1,000 USD for doing a POC with ANGLE on Windows. It's still under progress. Thank you backers! #kivy 53/56