Kivy 超入門(1):インストールからHello, World! まで

Python + Kivy で開発をしようを思ったときに,一番最初何から手を付ければいいかわからなかった.なぜかって,参考資料が少ないんだもん(本を買う金はない).ということで,もし自分みたいな人がいたら助けになるかもしれないと思い,自分がたどった道で余計な部分を削ぎ落した上で,殴り書きしてみようと思います.環境は Windows10 に Anaconda4.1.1(64bit) で Python3.5.2 をインストールした状態です.IDE として PyCharm を用いております.

2016.10.1追加:こちらの投稿を見てくださってる方が割といらっしゃるようだったので,紹介だけでなく読みやすいように日本語のチュートリアル的なのを書いてみようかと思い,大幅に改変しています.







Kivy のインストール

2016/09/15 時点で Windows10(64bit) に Kivy をインストールするのはここの方法通りにすることで成功しました.

Kivy の公式ホームページにあるとおりにインストールしようと思ったら,なぜかエラーをはかれてインストールできませんでした.理由を調べてみると,2016/09/15 現在 Kivy は Python3 に公式対応はしていないということでした.しかしもう少し調べてみると次の記事を見つけました.

Python3.4 + Visual StudioでKivyの開発環境を作成する by @dario_okazaki on @Qiita

要するに,

  1. http://www.lfd.uci.edu/~gohlke/pythonlibs/にアクセスして,「Kivy-1.9.1+sdl2-cp35-none-win_amd64.whl」をダウンロード(cp35の部分がpythonのバージョン).
  2. ダウンロードしたディレクトリでコマンドプロンプトを開く.
  3. コマンドプロンプトに「python -m pip install Kivy-1.9.1+sdl2-cp35-none-win_amd64.whl」と打つ.

の3段階でインストールは完了しました.

ウィンドウを表示させ,”Hello, World!” を表示

Python なんてちょっとしか触ったことのないザコの私にもわかるKivy を初めて学ぶ人にとっては素晴らしい動画が Youtube にあったので,皆さんも最初からそちらに従うのがいいのではないかと思います.次に紹介しておきます.6:15までは「kivyとは何か」,「インストールの方法」を扱っていますが,私はこの部分は飛ばしました.パッと見た感じだと上のインストール方法と同じようだったので問題ないでしょう.6:15からはkivyの初歩的な使い方について説明してくれてます.

とまぁ,「書くのめんどいしこれを見ろ」っていうのがつい前までの投稿だったのですが,見てる人に失礼だと思うような被害妄想がはたらきい,主に上の動画の内容で習う内容についてを,パーツごとに細かく砕いてから日本語にして書き連ねていこうと思います.

Kivy を使う宣言

Kivy のすべての機能を使えるようにする

Kivy を使いたいときにはプログラムの行頭あたりに次の一行を加えましょう.

import kivy

「import hoge」は python の言葉で「hoge という機能を使います」という宣言でしたね.kivyを使うからという宣言をしましょう.
ちなみに,この一行しか書いていないプログラムを自分のパソコンで実行させたところ,次のように表示されました.

[INFO              ] [Logger      ] Record log in C:\Users\(自分のユーザー名)\.kivy\logs\kivy_16-10-01_0.txt
[INFO              ] [Kivy        ] v1.9.1
[INFO              ] [Python      ] v3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]

Kivy のバージョンが表示されていますね.これでインストールが正しく行われていることが確認されました.

必要な機能だけ持ってくる

しばらくはkivyのすべての機能を使う必要はないので,kivyの機能(クラス)のうち一部だけを使うような宣言に書き換えましょう.

from kivy.app import App

kivy.app の App という機能の集り(クラス)を使う宣言になっています.大文字のAに気を付けましょう.ここでの kivy.app とは(Anacondaでpythonをインストールした自分の場合)

C:\Users\(自分のユーザー名)\Anaconda3\Lib\site-packages\kivy\app.py

というpythonファイルになります.後ろの App は,このpythonファイルの335行目から始まる「class App(EventDispatcher)」というクラスのことです.つまりちょっと詳しく言うと,この一行は日本語で言うところの「C:\Users\(自分のユーザー名)\Anaconda3\Lib\site-packages\kivy\app.py というファイルの中の App という機能群を使います.」という宣言です.App の中の機能には具体的にどのようなものがあるのかは正直把握できていないのですが,いろんなkivyのチュートリアルの記事を見ているとこの機能は使っているようなので,おそらくkivyの機能の中心になるものが入っているのではないかと思っています.ちなみに,ファイルには次の様に書いてあります

The :class:`App` class is the base for creating Kivy applications.
Think of it as your main entry point into the Kivy run loop. In most
cases, you subclass this class and make your own app. You create an
instance of your specific app class and then, when you are ready to
start the application’s life cycle, you call your instance’s
:meth:`App.run` method.

ちなみに,kivyはclass(機能)の説明などを上のpythonファイルの中に直接書き込んであるため,新しいことをやる際に困ったらまずは使いたい機能のpythonファイルの中身を読んでみるとよいのではないのでしょうか(自分への戒め).ただ,いちいちファイルを読むのもあれなので,まず困ったら公式ドキュメントで調べてみるべきでしょう(戒め).

ボタンなどの機能を使えるようにする

GUIアプリを作成するためにkivyを用いている以上,ボタンなどの機能も必要になってくるかと思います.そのような機能も使えるように次の行を足しましょう.

from kivy.uix.label import Label

kivy.uix.label の Label という機能(class)を使うことを宣言します.先ほどと同様,kivy.uix.label とは

C:\Users\(自分のユーザー名)\Anaconda3\Lib\site-packages\kivy\uix\label.py

のことで,Label はそのpythonファイルの247行目から始まる「class Label(Widget)」というクラスのことです.Label というクラスにはボタンの機能などがあります.

Hello, World!

from kivy.app import App
from kivy.uix.label import Label

class IntroKivy(App):
    def build(self):
        return Label(text="Hello, World!")

if __name__ == "__main__":
    IntroKivy().run()

これを実行すると,次のように画面にウィンドウが現れ”Hello, World!”という文字が中に書かれます.
kivy1_1
2行目までは先ほど説明した通りなので,それ以降を説明します.

実行するアプリ(クラス)の定義

まずは次の3行に注目しましょう.

class IntroKivy(App):
    def build(self):
        return Label(text="Hello, World!")

この最初の2行はkivyを初めて習う方はおまじないと考えてもよいでしょう.「クラスと継承」ということを勉強すると理解できると思います.念のため少しだけ説明すると,ここでは「IntroKivy」という名前のクラスを定義しています.クラスの名前の次のかっこ「(App)」というところは「継承(Inheritance)」というもので,「Appという機能群にあった機能を,このIntroKivyにも引き継ぎます(継承します)」といった感じになります(雑すぎ).その次の「build」についてですが,通常のpythonの文法で考えると「build」という関数を定義しているようですが,ただの定義ではなく,継承した App の中のbuildを書き換えているようです.申し訳ないのですが,筆者も調べてみましたが正確には理解できませんでした.ただ何度か試行錯誤してみたところ,ウィンドウを作る(build)して表示し続ける機能を果たしているようだということだけはわかりました.どなたか正確にわかる方がいらっしゃいましたらコメントなどで教えていただけると幸いです.

2016.10.02追記:app.py の中にbuildというクラスを見つけました.これは次のような説明がついています.

def build(self):
”’Initializes the application; it will be called only once.
If this method returns a widget (tree), it will be used as the root
widget and added to the window.

アプリの初期化をしてくれるようですね.つまり,kivyのアプリを動かすとき一番最初にこれをしてくださいということのようですね...

「(self)」はpythonでクラスを使うときの定型句のようなものですね.そして3行目の「Label」というのは元のプログラムの2行目で持ってきた機能ですね.これがボックス(今はウィンドウ)に文字を表示するという機能をしています.オプションの「text=”Hello, World!”」が,ウィンドウに表示する文字列を表しています.Label の詳しい使い方については「C:\Users\(自分のユーザー名)\Anaconda3\Lib\site-packages\kivy\uix\label.py」の中にあるLabelの説明を見てみましょう.

(強引に)まとめると,こちらのクラスによって「ウィンドウを作成し,そこに”Hello, World!”を書く」という機能が,ひとまずできたわけです.

作ったアプリ(クラス)の実行

if __name__ == "__main__":
    IntroKivy().run()

最初の一行については「このファイルがメインプログラムとして実行されたのであれば,」という条件文になっています.これについては文章をそのままコピペして調べてくるとたくさん出てきます.大雑把には(今の場合は当たり前ですが)「このプログラムをコマンドラインで実行したときにだけ,以下からインデントされた文の処理をしなさい」ということです.「IntroKivy().run()」では,先ほど作成したIntroKivyという機能を実行しています.「run」は「App.run」という機能のことで,kivyを実行させる機能のようです.

余談

以上,やや強引にKivyをインストールしてからHellow,World!を表示させるまでを説明してみました.自分が完全に理解していないためあいまいな部分もあるのは悔しいですし,読んでくださった方にも少し申し訳ないですね...後々あいまいな部分が解消しましたらこちらの投稿も修正したいと思います.

今後時間があれば,引き続きこのような形で上の Youtube で行っている説明を続きを日本語の形で書いていきたいと思います.自分の説明がじれったいと感じる方は,先ほどの Youtube の動画を Part 順に聞いていくことで自然と実力が付くのではないかと思います(少し無責任な発言ですね…).ちなみにpartの序盤は Kivy の公式スタートガイドの内容をやってくれます.

Getting Started – Kivy

動画のシリーズの最終回ではペイントプログラムを作れるようになります.動画投稿者のお気に入りのプログラムだそうです.私の場合,この方のチュートリアルで kivy のいじり方の勘がつかめました.あとは必要な機能が class として搭載されているか調べながら作っていく形になるのかと思っています.

Harrison Kinsley

上の方の Youtube チャンネルを見てみるとかなりプログラミングに詳しい模様.調べてみるとこの方のお名前は “Harrison Kinsley”.Python 教育に力を入れているみたいですね.

勉強会行ってみたい...

Python + Kivy の勉強会があるみたいだけど,残念ながら直近には行う予定ないのか...残念.次の機会があったら是非行ってみたい.


Creating Apps in Kivy

このブログについて

IAtLeX です.ブログをはじめてさほど時間がたっていないので,未熟な内容が多々あるかと思いますが,それも時間が解決してくれるはず...Python系の記事を着々と充実させていきたいです.投稿主についてはこちらを参照してください.

このブログについて - http://iatlex.com/about_blog/

コメントを残す

*