2019年11月19日

Kivy アプリの Windows 用実行ファイルを作成するまで (作製編)

1. PyInstaller を使用する場合

main.py

main.kv

上記の main.py, main.kv を例に説明します. 適当なディレクトリにこれらのファイルを作製します.

コマンドプロンプトを管理者として開き, main.py ファイルのあるディレクトリに移動し,

python -m PyInstaller --noconsole main.py

を入力します.

main.py のあるディレクトリに生成された main.spec を開き,

# -*- mode: python ; coding: utf-8 -*-

の次の行に,

from kivy_deps import sdl2, glew

を追加し, ('.' ではなく, '_' なので注意*1)

a.datas,

の次の行に,

*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],

を追加します. インデントは揃えます.

datas=[],

datas=[('main.kv', '.')],

にします. kv ファイルを使わない場合は, 必要ないはずです.

python -m PyInstaller main.spec

と入力し,

WARNING: The output directory "(main.py のあるディレクトリ)\dist\main" and ALL ITS CONTENTS wil l be REMOVED! Continue? (y/N)

と出たら y を入力します.

dist/main

に main.exe が作製されているので, 実行して画面が表示されたら成功です.

2. Nuitka を使用する場合

main.py

上記の main.py (main.kv は PyInstaller の項と同じもの) を例に説明します. 適当なディレクトリにこれらのファイルを作製します.

コマンドプロンプトを管理者として開き, main.py ファイルのあるディレクトリに移動し,

python -m nuitka --standalone --windows-disable-console --mingw64 --jobs=1 main.py

と入力します. jobs は, CPU コア数 * 2 にするといいのかもしれません. この作業は時間がかかります. 終了後, main.dist/ に main.exe が作製されます.

Python37-32\Lib\site-packages\kivy\

から data フォルダを main.dist/kivy にコピーし,

Python37-32\share\glew\bin\

から glew32.dll を,

Python37-32\share\sdl2\bin\

から全てのファイル*2を main.dist にコピーします. 最後に, main.kv を main.dist にコピーします.

main.exe を実行して画面が表示されたら成功です.

3. サンプル

以前, Python で迷路生成 で書いた kivy のコードを PyInstaller, Nuitka の両方で exe 化してみました.

PyInstaller

Nuitka

自分の環境では動作する, しないといった報告をしていただけると喜びます. 少なくとも, Linux Mint 18.3 の Wine では動きませんでした.

*1

Create a package for Windows(翻訳済み) − Kivy 1.10.0 ドキュメント:

では kivy.deps になっている. 以前はそうだったのかもしれない.

*2

少なくとも, libmpg123-0.dll は無くても動きます.

参考ページ

Create a package for Windows(翻訳済み) − Kivy 1.10.0 ドキュメント:
KivyのGUIアプリをNuitkaで簡単に小サイズ・高速に動く実行ファイル(exe)にする(Windows10)
Packaging Kivy apps written in Python 3, targeting Windows using Nuitka

posted by Takenoko at 13:40| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

Kivy アプリの Windows 用実行ファイルを作成するまで (準備編)

windows 8.1 Home 64bit で, Python がインストールされていない windows でも 実行できる Kivy アプリの exe を作製するまでの過程です.

長くなったので, Python, gcc 等をインストールする準備編, PyInstaller or Nuitka を使用する作製編に分割しました. 後日, ライセンス編も書く予定です.

私の場合, 作成したファイルをネットで公開するつもりなので, Python や gcc 等は 32bit を選択しています. ファイルのバージョンは, メモを書いていた時点での最新を選んでいます.

1. mingw-w64 32bit インストール

http://mingw-w64.org/doku.php/download/mingw-builds

で, Installation: Sourceforge をクリックするとページ遷移し, インストーラが自動的にダウンロードされます.

mingw-w64-install.exe

を実行し,

Ver 8.10
i686
posix
sjlj
0

を選択します.

デフォルトのインストールパスが長いので,

C:\mingw-w64\i686-8.1.0-posix-sjlj-rt_v6-rev0

に変更します.

環境変数の Path に

C:\mingw-w64\i686-8.1.0-posix-sjlj-rt_v6-rev0\mingw32\bin\

を追加します.

コマンドプロンプトを開き,

gcc -v

と入力し, いろいろと情報が出てきたら成功です.

2. Python3 32bit をインストール

https://www.python.org/downloads/windows/

から, Stable Releases の, Nuitka が対応している最新バージョン (現時点では 3.7.5) の Download Windows x86 executable installer をクリックしてインストーラをダウンロードします.

python-3.7.5.exe

を実行します.

Add Python 3.7 to PATH にチェックを入れ, Install Now をクリックします. Path は自動的に追加されるようです.

3. Kivy をインストール

コマンドプロンプトを管理者として開き, 以下の, '#' でコメントアウトしていない行を順に入力します.

python -m pip install --upgrade pip wheel setuptools
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
#python -m pip install kivy.deps.gstreamer
#python -m pip install kivy.deps.angle
python -m pip install kivy

インストールが終わったら,

pip list

と入力し, Kivy がインストールされていることを確認します.

*コメントアウトした行について

#python -m pip install kivy.deps.gstreamer

Kivyを使い始める

には, "Kivyには既にオーディオとビデオのプロバイダがありますが、より高度なものにはGStreamerが必要です。" と書いてあります. また, 動画プレイヤーも入っているらしいです. 私には必要なさそうなので入れませんでした.

#python -m pip install kivy.deps.angle

Kivy Windows Hello Worldへの道 真っ黒画面

には, "OpenGl ESのDirectX実装" と書いてあります. 必要かどうかわからないので, 必要になった時点で入れれば良いのだろうと思います.

4. Kivy のエラー対策

Windows で kv ファイルを読み込む際にエラーが出るようなので,

C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\kivy\lang\

の (環境やバージョンによって場所は違うはず) builder.py を変更します.

if __debug__:
trace('Lang: load file %s' % filename)
with open(filename, 'r') as fd:
kwargs['filename'] = filename
data = fd.read()

with open(filename, 'r') as fd:

with open(filename, 'r', encoding='utf8') as fd:

に書き換えます.

5. PyInstaller をインストール (使用する場合)

python -m pip install pyinstaller

と入力し, 終了後,

pip list

と入力し, インストールされていることを確認します.

6. Nuitka をインストール (使用する場合)

python -m pip install nuitka

と入力し, 終了後,

pip list

と入力し, インストールされていることを確認します.

作製編 へ続きます.

posted by Takenoko at 12:48| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2019年04月15日

kivy 一行TextInput の高さを font_size から計算して設定する

タイトルの通りです.



これで, 文字列が Left, Middle に表示されるはずです.
ラベル:Python kivy
posted by Takenoko at 15:27| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2019年04月12日

kivy ListView のアイテムが選択された時の処理を追加 続き


listadapter2.py


main.py


main.kv


ListAdapter を継承したクラス, ListAdapter2 を別ファイルに記述し, 引数を関数にして, 使い回せるようにしました. いいクラス名が浮かばなかった. SelectableListAdapter にしようかと思ったけど, 元々選択はできるわけだし. callback という単語はよく見るけど, 意味はよくわかっていません. こういう使い方でいいんだろうか.
ラベル:Python kivy
posted by Takenoko at 14:17| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2019年04月09日

kivy ListView のアイテムが選択された時の処理を追加

タイトルの通りです. アイテムの選択状態を Label に反映するサンプルです.

main.py


main.kv


19/04/12 追記: 続きを書きました.
ラベル:Python kivy
posted by Takenoko at 14:59| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2019年03月27日

kivy クラスルールと継承

クラスルールは, それを継承するクラスにも適用される.



この場合, Label を継承している Button の font_size も 24 になってしまう. ルールは上から順に適用され, 競合する場合は下のルールで上書きされるため, Label と Button の順序を逆にすれば問題ない. 当たり前の事かもしれないが, このことに気づかず, しばらく悩んだので.

19/04/02 追記: タイトル変更, 文章を少し修正.
ラベル:kivy
posted by Takenoko at 14:57| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2019年03月26日

python で迷路生成

maze256_2.png
毎回, 始点をランダムに選択した場合

0_2.png
可能な限り, 伸ばした先の点を次の始点にする

maze128_2.png
ランダム

以前に java で書いた迷路生成するコード を, 伸ばす度に始点を変更するかどうかの判定を追加し,  python に移植してみました. gui は kivy です. ソースファイル . linux と android(kivy launcher) で動作を確認しています. main.py が gui, test.py が cui です. test.py は kivy を使っておらず, python のみです.

kivy での画像生成やアニメーションの方法を覚えるために作ったので, 迷路の生成は重要ではないんですが, python2 と 3 で, 生成にかかる時間が数倍から十倍程度違うのが気になります. python2 の方が非常に遅い. 3 より 2 のが速いらしいんですが.

19/03/27 追記 : ソースファイルを差し替え. ループのネストを一つ減らしてみたり, 配列シャッフル用の配列を使いまわしたりしてみたが, 変わらず. python2 のサポート期限は 2020 年らしいので, まあいいか...
19/04/12 追記: ファイル名追加. 画像差し替え.

mazegenerator.py

xorshift128.py
ラベル:Python kivy 迷路
posted by Takenoko at 14:17| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2018年02月18日

java でコンポーネントを使わずにテキスト折り返し

タイトルの通りです。半角と全角を区別して、指定した幅で改行します。

WordWrapper.java


WordWrapCreater.java(json で設定するためのクラス)


wordwrap.json(WordWrapper のコンストラクタを使う場合は不要)


WordWrapTester.java(テスト用)


ソースコードとjarファイルのダウンロード

javadoc も頑張って書きました。
wordWrapToString で String が、wordWrapToArray で String の配列が得られます。引数については、getter/setter の javadoc で多分わかると思います。

インスタンス化の手段は二種類あります。json で設定を書く必要がなければ WordWrapper.java だけでいいです。json を使う場合は、jackson を使用しているため、Group: com.fasterxml.jackson.coreにある jackson-annotations-(バージョン).jar, jackson-core-(バージョン).jar, jackson-databind-(バージョン).jar をダウンロードし、外部ライブラリのインストールに書いてある方法などで参照できるようにする必要があります。WordWrapTester.java はテスト用とコンストラクタの設定例なので、実際に使う場合には必要ありません。

18/02/20 追記
trim部分を修正。ダウンロードを追加。

ラベル:java
posted by Takenoko at 22:37| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2018年02月05日

Processing 解像度を変更してフルスクリーンにする

タイトルの通りです。3.0 以降ではFullScreen API が使えないらしいので、なんとかしてみました。fullScreen() だと、解像度がそのままなので。バージョンは 3.3.6 です。



ESC キーで終了し、解像度が元に戻ります。レンダラがデフォルトの JAVA2D の場合のみですが、これで解像度を変更してフルスクリーンにすることができると思います。それ以外のレンダラだと、エラーが出るはずです。試してませんが。

参考ページ

ラベル:Processing
posted by Takenoko at 20:42| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする

2018年01月29日

Processing 起動時のFocus



レンダラがデフォルトの JAVA2D の時のみ確認できた現象なんですが、起動時にウィンドウがフォーカスを持っていたり失ったりと、安定しません。環境によるかもしれませんが、このコードを何度も実行すると、私の環境ではそうなりました。そこで、確実にフォーカスを持たせることにしました。



こうすると、(多分)確実にフォーカスを持ってくれると思います。

ラベル:Processing
posted by Takenoko at 19:49| Comment(0) | programming | このブログの読者になる | 更新情報をチェックする