日本脱出系ホームレスのマルチリンガルな日々

フルリモート引きこもりが外国語からプログラミング言語を使った海外生活を垂れ流す

pythonでスマホアプリを軽く作ってみた

f:id:humuhimi:20190114213911p:plain

kivyウェブページ

 

どうも!ホームレスエンジニアのhumuです

 

今日は、pythonで用意されているGUIアプリを開発するためのマルチプラットフォーム用のオープンソースライブラリの「kivy」について紹介したいと思います。

 

 

kivy.org

 

 

iphoneやandoridのスマホアプリやmacOSやwindowsOS上で動く動作するマルチプラットフォームアプリについて紹介します。

 

特徴として、macOS、windowsOS,Linux上で同一のプログラムを動かすことができます。

 

また、raspbbery pi上でも動かすことができ、タッチ機能をサポートしているためタブレット利用も可能です。

 

オープンソースで提供され、商用利用も可能です。

 

コードを書く際はpythonコードとUIのコードをわけて書きます。

 

UIはkivy独自のkv言語を使用していきます。

 

まずkivyをインストールしましょう!

 

 

pythonのパッケージ管理コマンドのpipでインストールしてみよう↓

 

 

早速"hello world"してみましょう!

 

以下のコードを書き込んでみてください ↓

 

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
def build(self):
return Button(text='Hello World')

TestApp().run()

 

Appクラスはアプリを作る上で必須のクラスで継承した上で、必要なボタンなどを追加していき走らせます。

 

そうするとちゃんと、hello worldと出力されましたね!

 

デスクトップではこんな感じです↓

 

f:id:humuhimi:20190114221427p:plain

hello world with kivy

次は、kv言語を使っていきましょう!

pythonファイルを↓

from kivy.app import App
 
class TestApp(App):
pass
 
TestApp().run()

 

kvファイルを

BoxLayout:
orientation: 'vertical'
 
Button:
text: "Hello World"
Label:
text: "Hello World2"
TextInput:
text: "Hello World3"

 にしてください。 

 

そうすると、このようになります↓

 

f:id:humuhimi:20190114223458p:plain

kivy with .kvファイル

 

kvファイルはUIを担当しています

また、orientationでverticalを指定しているので、縦に並んだ形になります。

ちなみに、horizontalで横並びになります。

*orientation指定はウィジェットの並び方なので注意してください

*kivyではUIパーツのことをwidgetと呼びます。

 

 

最後に、ボールが跳ね回るアプリを作ってみた

 

main.py

#:kivy 1.0.9
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.clock import Clock
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.vector import Vector
from random import randint


class PongGame(Widget):
ball = ObjectProperty(None)

def serve_ball(self): #review
self.ball.center = self.center
self.ball.velocity = Vector(4, 0).rotate(randint(0, 360))

def update(self, dt):
# dt means delta-time
# call ball.move and other stuff
self.ball.move()

# bounce off top and bottom
if (self.ball.y < 0) or (self.ball.top > self.height):
self.ball.velocity_y *= -1 #review
 
# bounce off left and right
if (self.ball.x < 0) or (self.ball.right > self.width):
self.ball.velocity_x *= -1


class PongBall(Widget):
# Validation for a NumericProperty will check that your value is a numeric type
velocity_x = NumericProperty(50)
velocity_y = NumericProperty(50)
velocity = ReferenceListProperty(velocity_x, velocity_y)

def move(self):
self.pos = Vector(*self.velocity) + self.pos



class PongApp(App):
def build(self):
game = PongGame()
Clock.schedule_interval(game.update, 1.0/60.0)
return game



if __name__ == '__main__':
PongApp().run()

 

test.kv

 

<PongBall>:
size: 50, 50
Ellipse:
pos:self.pos
size:self.size

<PongGame>:
ball:pong_ball
Rectangle:
pos: self.center_x - 0,5
size:10, self.height
 
Label:
font_size: 70
center_x: root.width / 4
top: root.top - 50
text: "0"
 
Label:
font_size: 70
center_x: root.width * 3 / 4
top: root.top - 50
text: "0"

PongBall:
id: pong_ball
center: self.parent.center

 

 結果このようになりました!

f:id:humuhimi:20190114231255g:plain

kivyアプリPong game

 

ここから、作れるのでよかったらドキュメントをみてくださいね!

kivy.org

 

では、いい1日を!

ありがとうございました!