PythonのGUIライブラリ"kivy"でiOSアプリを作る!-1-
▼はじめに
こんにちは、キタグニと言います。
普段はPythonを書いたりしています。
2021年は「マイクロアプリ(小さなアプリ)開発」の年にしたい、と思っていますので、iOSアプリ開発をしようと思いました。
もちろん、普通ならswiftを選択します。
ですが、僕はPythonが好きです。
なので、PythonでもiOSアプリ開発ができるkivyというライブラリを、学んでいきたいと思います。
皆さんも、ぜひ一緒にiOSアプリを開発して、個人開発で生きていく、とまでは行かなくても、お小遣い稼ぎができるような年にしませんか?
▼なぜやるのか?
・iOSアプリを開発したい
・Pythonで開発したい
・個人開発を手軽にしていきたい
・小さなシステムを継続的にリリースしていきたい
▼なにをやるのか?
・kivyを使ってiOSアプリを開発
・とにかくシンプルに
・1アプリ1機能
・もし喜びのお声が聞こえたら機能を付け足していく
▼どうやるのか?
・Anacondaで開発
・kivyのチュートリアルをやる
▼実装
Anacondaで仮想環境を作成
conda create -n kivy python=3.9
結果
----
Solving environment: done
## Package Plan ##
environment location: /Users/rw-mbp/opt/anaconda3/envs/kivy
added / updated specs:
- python=3.9
The following packages will be downloaded:
package | build
---------------------------|-----------------
certifi-2020.12.5 | py39hecd8cb5_0 141 KB
pip-20.3.3 | py39hecd8cb5_0 1.8 MB
python-3.9.1 | h88f2d9e_2 9.9 MB
setuptools-51.0.0 | py39hecd8cb5_2 713 KB
tzdata-2020d | h14c3975_0 110 KB
wheel-0.36.2 | pyhd3eb1b0_0 33 KB
------------------------------------------------------------
Total: 12.6 MB
The following NEW packages will be INSTALLED:
ca-certificates pkgs/main/osx-64::ca-certificates-2020.12.8-hecd8cb5_0
certifi pkgs/main/osx-64::certifi-2020.12.5-py39hecd8cb5_0
libcxx pkgs/main/osx-64::libcxx-10.0.0-1
libedit pkgs/main/osx-64::libedit-3.1.20191231-h1de35cc_1
libffi pkgs/main/osx-64::libffi-3.3-hb1e8313_2
ncurses pkgs/main/osx-64::ncurses-6.2-h0a44026_1
openssl pkgs/main/osx-64::openssl-1.1.1i-h9ed2024_0
pip pkgs/main/osx-64::pip-20.3.3-py39hecd8cb5_0
python pkgs/main/osx-64::python-3.9.1-h88f2d9e_2
readline pkgs/main/osx-64::readline-8.0-h1de35cc_0
setuptools pkgs/main/osx-64::setuptools-51.0.0-py39hecd8cb5_2
sqlite pkgs/main/osx-64::sqlite-3.33.0-hffcf06c_0
tk pkgs/main/osx-64::tk-8.6.10-hb0a8c7a_0
tzdata pkgs/main/noarch::tzdata-2020d-h14c3975_0
wheel pkgs/main/noarch::wheel-0.36.2-pyhd3eb1b0_0
xz pkgs/main/osx-64::xz-5.2.5-h1de35cc_0
zlib pkgs/main/osx-64::zlib-1.2.11-h1de35cc_3
Proceed ([y]/n)? y
Downloading and Extracting Packages
setuptools-51.0.0 | 713 KB | ####################################################################################### | 100%
pip-20.3.3 | 1.8 MB | ####################################################################################### | 100%
certifi-2020.12.5 | 141 KB | ####################################################################################### | 100%
python-3.9.1 | 9.9 MB | ####################################################################################### | 100%
wheel-0.36.2 | 33 KB | ####################################################################################### | 100%
tzdata-2020d | 110 KB | ####################################################################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate kivy
#
# To deactivate an active environment, use
#
# $ conda deactivate
仮想環境に入る
conda activate kivy
結果
----
(kivy) [kitaguni kivy %]
kivyをインストール
conda install kivy
結果
----
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
PackagesNotFoundError: The following packages are not available from current channels:
- kivy
Current channels:
- https://repo.anaconda.com/pkgs/main/osx-64
- https://repo.anaconda.com/pkgs/main/noarch
- https://repo.anaconda.com/pkgs/r/osx-64
- https://repo.anaconda.com/pkgs/r/noarch
To search for alternate channels that may provide the conda package you're
looking for, navigate to
https://anaconda.org
and use the search bar at the top of the page.
(kivy) [kitaguni kivy %] conda install -c conda-forge kivy
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /Users/rw-mbp/opt/anaconda3/envs/kivy
added / updated specs:
- kivy
The following packages will be downloaded:
package | build
---------------------------|-----------------
ca-certificates-2020.12.5 | h033912b_0 138 KB conda-forge
certifi-2020.12.5 | py39h6e9494a_0 143 KB conda-forge
docutils-0.16 | py39h6e9494a_2 743 KB conda-forge
freetype-2.10.4 | h3f75d11_0 897 KB conda-forge
gettext-0.19.8.1 | h7937167_1005 3.3 MB conda-forge
glib-2.66.4 | h22858aa_1 483 KB conda-forge
gst-plugins-base-1.14.5 | hb4a159a_2 2.0 MB conda-forge
gstreamer-1.18.2 | h93d527e_0 1.8 MB conda-forge
jpeg-9d | hbcb3906_0 250 KB conda-forge
kivy-2.0.0 | py39hbe86cf0_1 20.3 MB conda-forge
lcms2-2.11 | h11f7e16_1 387 KB conda-forge
libcxx-11.0.0 | h4c3b8ed_1 1.0 MB conda-forge
libglib-2.66.4 | h7424822_1 2.8 MB conda-forge
libiconv-1.16 | haf1e3a3_0 1.3 MB conda-forge
libpng-1.6.37 | h7cec526_2 313 KB conda-forge
libtiff-4.2.0 | h355d032_0 639 KB conda-forge
libwebp-base-1.1.0 | hbcb3906_3 757 KB conda-forge
lz4-c-1.9.2 | hb1e8313_3 152 KB conda-forge
olefile-0.46 | pyh9f0ad1d_1 32 KB conda-forge
openssl-1.1.1i | h35c211d_0 1.9 MB conda-forge
pcre-8.44 | hb1e8313_0 220 KB conda-forge
pillow-8.0.1 | py39h38d7768_0 649 KB conda-forge
pygments-2.7.3 | pyhd8ed1ab_0 708 KB conda-forge
python_abi-3.9 | 1_cp39 4 KB conda-forge
sdl2-2.0.12 | h2e338ed_1 1.2 MB conda-forge
sdl2_image-2.0.5 | h7fada4f_0 123 KB conda-forge
sdl2_mixer-2.0.4 | h6de7cb9_0 113 KB conda-forge
sdl2_ttf-2.0.15 | hc42bb53_0 29 KB conda-forge
smpeg2-2.0.0 | hfc679d8_1 158 KB conda-forge
zstd-1.4.5 | h289c70a_2 778 KB conda-forge
------------------------------------------------------------
Total: 43.2 MB
The following NEW packages will be INSTALLED:
docutils conda-forge/osx-64::docutils-0.16-py39h6e9494a_2
freetype conda-forge/osx-64::freetype-2.10.4-h3f75d11_0
gettext conda-forge/osx-64::gettext-0.19.8.1-h7937167_1005
glib conda-forge/osx-64::glib-2.66.4-h22858aa_1
gst-plugins-base conda-forge/osx-64::gst-plugins-base-1.14.5-hb4a159a_2
gstreamer conda-forge/osx-64::gstreamer-1.18.2-h93d527e_0
jpeg conda-forge/osx-64::jpeg-9d-hbcb3906_0
kivy conda-forge/osx-64::kivy-2.0.0-py39hbe86cf0_1
lcms2 conda-forge/osx-64::lcms2-2.11-h11f7e16_1
libglib conda-forge/osx-64::libglib-2.66.4-h7424822_1
libiconv conda-forge/osx-64::libiconv-1.16-haf1e3a3_0
libpng conda-forge/osx-64::libpng-1.6.37-h7cec526_2
libtiff conda-forge/osx-64::libtiff-4.2.0-h355d032_0
libwebp-base conda-forge/osx-64::libwebp-base-1.1.0-hbcb3906_3
lz4-c conda-forge/osx-64::lz4-c-1.9.2-hb1e8313_3
olefile conda-forge/noarch::olefile-0.46-pyh9f0ad1d_1
pcre conda-forge/osx-64::pcre-8.44-hb1e8313_0
pillow conda-forge/osx-64::pillow-8.0.1-py39h38d7768_0
pygments conda-forge/noarch::pygments-2.7.3-pyhd8ed1ab_0
python_abi conda-forge/osx-64::python_abi-3.9-1_cp39
sdl2 conda-forge/osx-64::sdl2-2.0.12-h2e338ed_1
sdl2_image conda-forge/osx-64::sdl2_image-2.0.5-h7fada4f_0
sdl2_mixer conda-forge/osx-64::sdl2_mixer-2.0.4-h6de7cb9_0
sdl2_ttf conda-forge/osx-64::sdl2_ttf-2.0.15-hc42bb53_0
smpeg2 conda-forge/osx-64::smpeg2-2.0.0-hfc679d8_1
zstd conda-forge/osx-64::zstd-1.4.5-h289c70a_2
The following packages will be UPDATED:
libcxx pkgs/main::libcxx-10.0.0-1 --> conda-forge::libcxx-11.0.0-h4c3b8ed_1
The following packages will be SUPERSEDED by a higher-priority channel:
ca-certificates pkgs/main::ca-certificates-2020.12.8-~ --> conda-forge::ca-certificates-2020.12.5-h033912b_0
certifi pkgs/main::certifi-2020.12.5-py39hecd~ --> conda-forge::certifi-2020.12.5-py39h6e9494a_0
openssl pkgs/main::openssl-1.1.1i-h9ed2024_0 --> conda-forge::openssl-1.1.1i-h35c211d_0
Proceed ([y]/n)? y
Downloading and Extracting Packages
lcms2-2.11 | 387 KB | ####################################################################################### | 100%
lz4-c-1.9.2 | 152 KB | ####################################################################################### | 100%
kivy-2.0.0 | 20.3 MB | ####################################################################################### | 100%
sdl2_mixer-2.0.4 | 113 KB | ####################################################################################### | 100%
sdl2_image-2.0.5 | 123 KB | ####################################################################################### | 100%
gstreamer-1.18.2 | 1.8 MB | ####################################################################################### | 100%
zstd-1.4.5 | 778 KB | ####################################################################################### | 100%
pcre-8.44 | 220 KB | ####################################################################################### | 100%
libtiff-4.2.0 | 639 KB | ####################################################################################### | 100%
freetype-2.10.4 | 897 KB | ####################################################################################### | 100%
python_abi-3.9 | 4 KB | ####################################################################################### | 100%
openssl-1.1.1i | 1.9 MB | ####################################################################################### | 100%
libiconv-1.16 | 1.3 MB | ####################################################################################### | 100%
pillow-8.0.1 | 649 KB | ####################################################################################### | 100%
libglib-2.66.4 | 2.8 MB | ####################################################################################### | 100%
libcxx-11.0.0 | 1.0 MB | ####################################################################################### | 100%
pygments-2.7.3 | 708 KB | ####################################################################################### | 100%
sdl2_ttf-2.0.15 | 29 KB | ####################################################################################### | 100%
gst-plugins-base-1.1 | 2.0 MB | ####################################################################################### | 100%
certifi-2020.12.5 | 143 KB | ####################################################################################### | 100%
smpeg2-2.0.0 | 158 KB | ####################################################################################### | 100%
ca-certificates-2020 | 138 KB | ####################################################################################### | 100%
olefile-0.46 | 32 KB | ####################################################################################### | 100%
libpng-1.6.37 | 313 KB | ####################################################################################### | 100%
libwebp-base-1.1.0 | 757 KB | ####################################################################################### | 100%
glib-2.66.4 | 483 KB | ####################################################################################### | 100%
docutils-0.16 | 743 KB | ####################################################################################### | 100%
jpeg-9d | 250 KB | ####################################################################################### | 100%
gettext-0.19.8.1 | 3.3 MB | ####################################################################################### | 100%
sdl2-2.0.12 | 1.2 MB | ####################################################################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
kivyのpongゲームチュートリアルをみる
しかし、
You know how to run a basic Kivy application. See Create an application if you don’t.
基本的なKivyアプリケーションの実行方法は知っていますね。分からない場合は、アプリケーションを作成するを参照してください。
とあったので、今回はこれをやる。
シンプルなkivyアプリを作る
kivyというディレクトリを作り、app.pyファイルを作成。
touch main.py
チュートリアルのコードをコピペ
import kivy
kivy.require('1.0.6') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text='Hello world')
if __name__ == '__main__':
MyApp().run()
実行
python main.py
結果
----
[WARNING] [Config ] Older configuration version detected (0 instead of 21)
[WARNING] [Config ] Upgrading configuration in progress.
[INFO ] [Logger ] Record log in /Users/rw-mbp/.kivy/logs/kivy_20-12-28_0.txt
[INFO ] [Kivy ] v2.0.0
[INFO ] [Kivy ] Installed at "/Users/rw-mbp/opt/anaconda3/envs/kivy/lib/python3.9/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.9.1 (default, Dec 11 2020, 06:28:49)
[Clang 10.0.0 ]
[INFO ] [Python ] Interpreter at "/Users/rw-mbp/opt/anaconda3/envs/kivy/bin/python"
[INFO ] [Factory ] 186 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_imageio, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO ] [Text ] Provider: sdl2
[INFO ] [Window ] Provider: sdl2
[INFO ] [GL ] Using the "OpenGL ES 2" graphics system
[INFO ] [GL ] Backend used <sdl2>
[INFO ] [GL ] OpenGL version <b'2.1 INTEL-16.0.49'>
[INFO ] [GL ] OpenGL vendor <b'Intel Inc.'>
[INFO ] [GL ] OpenGL renderer <b'Intel(R) Iris(TM) Plus Graphics 645'>
[INFO ] [GL ] OpenGL parsed version: 2, 1
[INFO ] [GL ] Shading version <b'1.20'>
[INFO ] [GL ] Texture max size <16384>
[INFO ] [GL ] Texture max units <16>
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
なにやら、warningとかinfoとか出てきた。
が、
続けて、ハローワールド画面が表示された! わーい!
コード分解(なんとなくの解説)
# kivyライブラリをインポートして使えるようにする
import kivy
# kivyのバージョン指定?
kivy.require('1.0.6') # replace with your current kivy version !
replace with your current kivy version !
現在のkivyのバージョンに置き換えてください!
とある。。
(実行前にちゃんと読もうね。)
kivyのバージョンを確認しておく。
conda list
結果
----
# Name Version Build Channel
ca-certificates 2020.12.5 h033912b_0 conda-forge
certifi 2020.12.5 py39h6e9494a_0 conda-forge
docutils 0.16 py39h6e9494a_2 conda-forge
freetype 2.10.4 h3f75d11_0 conda-forge
gettext 0.19.8.1 h7937167_1005 conda-forge
glib 2.66.4 h22858aa_1 conda-forge
gst-plugins-base 1.14.5 hb4a159a_2 conda-forge
gstreamer 1.18.2 h93d527e_0 conda-forge
jpeg 9d hbcb3906_0 conda-forge
kivy 2.0.0 py39hbe86cf0_1 conda-forge
lcms2 2.11 h11f7e16_1 conda-forge
libcxx 11.0.0 h4c3b8ed_1 conda-forge
libedit 3.1.20191231 h1de35cc_1
libffi 3.3 hb1e8313_2
libglib 2.66.4 h7424822_1 conda-forge
libiconv 1.16 haf1e3a3_0 conda-forge
libpng 1.6.37 h7cec526_2 conda-forge
libtiff 4.2.0 h355d032_0 conda-forge
libwebp-base 1.1.0 hbcb3906_3 conda-forge
lz4-c 1.9.2 hb1e8313_3 conda-forge
ncurses 6.2 h0a44026_1
olefile 0.46 pyh9f0ad1d_1 conda-forge
openssl 1.1.1i h35c211d_0 conda-forge
pcre 8.44 hb1e8313_0 conda-forge
pillow 8.0.1 py39h38d7768_0 conda-forge
pip 20.3.3 py39hecd8cb5_0
pygments 2.7.3 pyhd8ed1ab_0 conda-forge
python 3.9.1 h88f2d9e_2
python_abi 3.9 1_cp39 conda-forge
readline 8.0 h1de35cc_0
sdl2 2.0.12 h2e338ed_1 conda-forge
sdl2_image 2.0.5 h7fada4f_0 conda-forge
sdl2_mixer 2.0.4 h6de7cb9_0 conda-forge
sdl2_ttf 2.0.15 hc42bb53_0 conda-forge
setuptools 51.0.0 py39hecd8cb5_2
smpeg2 2.0.0 hfc679d8_1 conda-forge
sqlite 3.33.0 hffcf06c_0
tk 8.6.10 hb0a8c7a_0
tzdata 2020d h14c3975_0
wheel 0.36.2 pyhd3eb1b0_0
xz 5.2.5 h1de35cc_0
zlib 1.2.11 h1de35cc_3
zstd 1.4.5 h289c70a_2 conda-forge
kivyは2.0.0。。。
全然ちがう!!
ということで、修正して改めて実行しておく。
何か変わるのだろうか?
python main.py
結果
----
[INFO ] [Logger ] Record log in /Users/rw-mbp/.kivy/logs/kivy_20-12-28_1.txt
[INFO ] [Kivy ] v2.0.0
[INFO ] [Kivy ] Installed at "/Users/rw-mbp/opt/anaconda3/envs/kivy/lib/python3.9/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.9.1 (default, Dec 11 2020, 06:28:49)
[Clang 10.0.0 ]
[INFO ] [Python ] Interpreter at "/Users/rw-mbp/opt/anaconda3/envs/kivy/bin/python"
[INFO ] [Factory ] 186 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_imageio, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO ] [Text ] Provider: sdl2
[INFO ] [Window ] Provider: sdl2
[INFO ] [GL ] Using the "OpenGL ES 2" graphics system
[INFO ] [GL ] Backend used <sdl2>
[INFO ] [GL ] OpenGL version <b'2.1 INTEL-16.0.49'>
[INFO ] [GL ] OpenGL vendor <b'Intel Inc.'>
[INFO ] [GL ] OpenGL renderer <b'Intel(R) Iris(TM) Plus Graphics 645'>
[INFO ] [GL ] OpenGL parsed version: 2, 1
[INFO ] [GL ] Shading version <b'1.20'>
[INFO ] [GL ] Texture max size <16384>
[INFO ] [GL ] Texture max units <16>
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
warning消えた!!!!
表示された画面は、どうやら変わりないよう。
# kivyのappのAppクラスを取り込んでいるみたい。
# Appクラスを継承することで、さまざまなGUIアプリが簡単に作れるようになる、と思われる。
from kivy.app import App
# kivyのuixのlabelのLabelを取り込んでいる。
# おそらく、文字を表示させるパーツを担当するメソッドか何かだろう。
from kivy.uix.label import Label
# importで取り込んだAppクラスを継承するMyAppクラスを作成。
# ここにさまざまなパーツなどを書いていく、と予想する。
# 今回であれば、簡単なHello worldテキストを返すbuildメソッドが定義されている。
class MyApp(App):
def build(self):
return Label(text='Hello world')
# まいどおなじみ、おまじない。
# コマンドラインから呼び出されたかどうかを判定している。
# 他のファイルから呼び出された場合は、実行しない。
# MyAppクラスが継承しているAppクラスのrun()メソッドが実行されている。
if __name__ == '__main__':
MyApp().run()
おまけ
文字を変えてみる。
import kivy
kivy.require('2.0.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text='日本語表示できるかな?')
if __name__ == '__main__':
MyApp().run()
日本語は文字化けする。
日本語フォントをインストールすれば回避できると思われる?
ラベルを増やしてみる。
import kivy
kivy.require('2.0.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text='world')
def make(self):
return Label(text='hello')
if __name__ == '__main__':
MyApp().run()
まあ、走らんでしょう。。。
実行。
走った!
しかし、make()メソッドは、無視されている、もしくは、隠れてしまっている。
(ちゃんと調べてから実行しようね。。。)
ボタン、とかないかな? と思って適当にやってみる。(コラ)
import kivy
kivy.require('2.0.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
class MyApp(App):
def build(self):
return Label(text='world')
def make(self):
return Button(text='hello')
if __name__ == '__main__':
MyApp().run()
お、エラーにはならなかったぞ!!!(コラ)
Buttonメソッドはあるけれど、どうやらアプリ本体のMyAppクラスの書き方が間違っているっぽい。
と、ここまでやって、チュートリアルを読んでいったら、カスタマイズされたコードが載っていた。(ちゃんと読め)
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
class LoginScreen(GridLayout):
def __init__(self, **kwargs):
super(LoginScreen, self).__init__(**kwargs)
self.cols = 2
self.add_widget(Label(text='User Name'))
self.username = TextInput(multiline=False)
self.add_widget(self.username)
self.add_widget(Label(text='password'))
self.password = TextInput(password=True, multiline=False)
self.add_widget(self.password)
class MyApp(App):
def build(self):
return LoginScreen()
if __name__ == '__main__':
MyApp().run()
おおお! こんなに簡単にGUIアプリが作れるのかー!!!
テキスト入力と、パスワード表示でテキスト入力できるフォームが現れた!!
テンション上がりますねー!!
(しかし、日本語は文字化けする。。)
▼結果
・kivyは簡単にGUIアプリが作れる
・メソッドを調べれば、やりたいことはほとんどできそう
▼終わりに
楽しかったです。
次回以降は、もっときちんとマニュアルを読んで、ウィジェットを並べていきたいと思います!