2018年7月28日開催の「長野Python会 with NSEG」の資料です。
長野Python会 with NSEGPythonのGUI@20182018/07/29 オカザキ
View Slide
自己紹介• オカザキ• 職業:プログラマー• http://twitter.com/dario_okazaki• Kivyの公式マニュアルの翻訳を有志でしてました(https://pyky.github.io/kivy-doc-ja/)• PyconJP2017 トーク「Kivyによるアプリケーション開発のすすめ」
今日のアジェンダ• なぜGUIは初心向けでないといわれるか?• 個人的に今後PythonのGUIで注目しているもの• 実演• tkinter• wxPython• Eel• Kivy• Pythonが使えるゲームエンジンについて• exe化について• まとめ
GUIは今時必要か?• Webアプリでよくないか?• Webアプリだと困るもの• ネット環境が悪いところ• ネットが使えない場所• wav等の音声データを遅延なく動かしたい
PythonのGUIのシェアについて• https://www.jetbrains.com/research/devecosystem-2018/python/• JetBrainsの2018の資料• Pythonで何のフレームワークを使用していますかの質問の答え• GUIは以下• PyQT/PyGTK/wxPython:11%• TkInter : 7%• Kivy :2%• 参考:NumPy / matplotlib / SciPy / Pandas and similar : 47%Django:39%、Flask:39%
Pythonの主要なGUI• tkiner• wxPython• pySide2• Kivy• flexx• cefpython• Eel• Toga• FLTK• PyGObject• pyQt• Pyglet• PyGUi• libavg• Pyformsetc・・・
問題なぜGUIは初心向けでないといわれるか?
なぜGUIは初心向けでないといわれるか?(1/2)• ローカルのPC環境に依存している• インストールが難しい• windowsだと同じOSなのにインストールできてたりできなかったり• webは仮想化が進みインストールが簡単になった• デフォルトだと見た目がいまいちなものが多い• カスタマイズすると画像が必要とか面倒
なぜGUIは初心向けでないといわれるか?(2/2)• Pythonの場合以下の問題もある• どれが一番いい(簡単、将来性がある)のかよくわからない• 定番がない:例:WebフレームワークならDjango• GUIの実装方法が色々でてきた• 昔ながらのOSのAPIを操作• Web系• 配布が難しい• PyInstllerでexe化が可能だが問題多し
個人的にGUIで注目しているライブラリを紹介します
個人的にPythonのGUIで注目しているもの• tkinter• wxPython• Eel• Kivy• PySide2• UnrealEngine(ゲームエンジン)• godot engine(ゲームエンジン)
コードで説明するライブリー• 以下のライブラリについては簡単なコードをもとに傾向を説明します。• tkinter• wxPython• Eel• Kivy
説明するコードについて• 定期的にセンサーから取得した値をラベルで表示する• USBで始めるハードウェアモジュール• 温度/湿度/気圧を計測する 室内環境計測モジュール• @nonNoise さんが作ったキット、Pythonでセンサーからの値を取得できる• 技術書典4で購入• PCにUSBで接続すると使用可能(ドライバーの手動インストール不要!)
tkinter• 読み方:ティーキンター, ティーケーインター• Pythonに標準で付属している• インストールが簡単• 配布も簡単• 見た目がいまいち• Python3.4以降から改善• 機能面がいまいち• キャンバスの使い方などで学習コストが意外に高い
tkinter(学習の参考になるもの)• 12歳からはじめる ゼロからの Pythonゲームプログラミング教室• 書籍のタイトルにTkinterと記載がないがTinkerのcanvasを使用したサンプルコードが載っている• TkDocs(https://tkdocs.com/index.html)• 英語のサイトだが情報量多し
tkinter(実演)• https://github.com/nonNoise/USB_StartUpModule/blob/master/AN-USB-BME280/example/BME280_GUI.py
wxPython• wxWidgets のPythonバインディング• 元はC++• 公式サイト: https://www.wxpython.org/• Phoenixバージョンという3系対応のプロジェクトあり• 3系対応時に仕様の変更が結構あったらしい• PyPlに対応したのでpipでインストールできるようになった• 使用実績は一時期多かった• Dropbox、Google Drive、BitTorrent など• wxGlade/ WxFormBuilderという、GUIツールキットがある• WindowsOSだと見た目が・・
wxPython (学習の参考になるもの)• wxPython GUIプログラミング• 絶版で価格はプレミアがついている。洋書だと定期的に出版されている• 日本語だと体系だった情報があまりない状態
wxPython(実演)• https://github.com/okajun35/AN-USB-BME280/tree/master/wxPython
Eel• https://github.com/ChrisKnott/Eel/tree/master• Eelはナマズの意味• 2017年11月ごろにGitHubに登録• Starの数は2106• Electron をシンプルにしたもの。• 一時期はやった、Python(flask) + Electronよりも簡単
Eel(仕組み)• サーバー: Bottle(Python)• フロントエンド:html+js (Chrom/Chromium上で動作)• webhockで連携• PORT:8080で連携PC内サーバーサイドフロントエンド
Eel(実演)• https://github.com/okajun35/AN-USB-BME280/tree/master/eel
Eel(使い方)• インストールはpipでできるpip install eel
Eel(使い方)• 今回使用するアプリの構造│ eel_label.py││─PyMCP2221A ※センサーを動かすためのドライバー││ ─webeel_test.htmlfavicon.ico
Eel(使い方)• Python側での起動に関する設定import eeleel.init('web') #htmlが入っているフォルダのパスeel.start('eel_test.html', size=(300, 200)) # 開始する
Eel(使い方)• Python側の関数をjavascriptに公開する設定@eel.expose # この関数をJavascriptに公開するdef read_BME280():
Eel(使い方)• html側でPython側に関数を公開する
Eel(使い方)• html側でPython側に関数を公開する@eel.exposedef read_BME280():eel.output_temperature(temp , hum ,preessure)
Eel(メリット)• UI をhtml Javascript で作れる• Javascript系の豊富なライブラリが使用できる• グラフなどが簡単に作れる• 業務でWeb系の仕事を作る人なら開発のハードルが低い• JSは自分で書く必要がある• 余談 JSを書きたくない人のためのライブラリ(Pythonからjsに変換する)• flexx (GUI)• Brython• pyinstller でexe化が可能
Eel(デメリット)• Pythonだけで成立しない・・・• html,css,javascript書きたくない・・・
Kivy• https://github.com/kivy/kivy• Kevyはキウイを食べる鳥の事• Starの数は7863• 最新は1.10.1(2018年7月リリース)• Raspberry Pi ,android , iosを含めたクロスプラットフォーム
Kivy(仕組み)• GraphicはOpenGL ESで描画• 入力などはSDLで制御• ※Windowsはver1.10でANGLE(OpenGl ESのDirectX実装)が選択できるようになった
Kivy(学習の参考になるもの)• 日本語の本は3冊出版されている• 最近出た本 Kivyプログラミング ―Pythonで作るマルチタッチアプリ― (実践Pythonライブラリー• https://www.amazon.co.jp/dp/4254128967/• 国内で出たKivy関係の本では最もよい• 公式ドキュメントの翻訳(https://github.com/pyKy/kivy-doc-ja)• 最新に追従していないので参考にする際は英語の公式ドキュメントと読み比べてください• Python Kivyの使い方① ~Kv Languageの基本~(https://qiita.com/dario_okazaki/items/7892b24fcfa787faface)
Kivy(実績)• 仕事で使っている案件が数例あり• キュウリの仕分け3号機• TensorFlowでキュウリの仕分けを自動化する• 学習の際のUIにKivyとRaspberryPyを使用• https://news.mynavi.jp/article/20180606-642208/• http://workpiles.com/2017/05/ccb9-proto3-introduction/• https://www.youtube.com/watch?v=XOjwWlSpLME
Kivy(実演)• https://github.com/okajun35/AN-USB-BME280/tree/master/Kivy
Kivy(構造)• Pythonファイル(機能部分)とKVファイル(UI)の2つ• Pythonファイルのみ• KV言語が内部で記載されている• Pythonのみで構成
Kivy(KV言語)• KV Languageともいう• UI用のメタ言語• Widget(UI)を簡単に記述できる• CSSとBootstrap(グリッド)の概念にちかい• ※KVを使用しなくてもUIは作れるが使用したほうがコードが簡潔にかける
Kivy• どうしてメジャーになれないか?• インストールについて• 動作速度について• 日本語の入力について• Kv Languageについて• マルチプラットフォームについて
Kivy(インストールについて)• OSによってインストール方法が違う• 依存関係をユーザーが手動でインストールする必要がある• pip install kivyだけだと上手く動かない・・・• 公式ドキュメントのインストールー(https://kivy.org/docs/installation/installation.html) を読んでください。
Kivy(動作速度について)• 描画にOpenGLを使っているのでPCによっては起動時間が遅い• Raspberry Piだと特に遅い
Kivy(日本語入力について)• 日本語表記についてはフォントの指定が必要• IME(変換候補)は1.10.1からOSによっては出るようになった• Webや書籍に書いてある日本語が出ない不具合はある程度解消された• IMEの部分はSDLに依存しているので、OSによってでない状況は不明OS IMEの対応状況 詳細windows △ IMEは開くMacOS 〇 IMEは開く、変換候補も複数開くLinux × 他の人の情報だとUbunutuでは開かないそうですAndroid 〇 Nexus5、複数の機種で試したところ日本語入力は問題なくできますiOS × IMEは開かないそうです。
Kivy(Kv Languageについて)• サンプルコードが少ないので学習コストが高い• Kvファイルでエラーを吐くと原因がよくわからない場合がある• widgetへの参照がデフォルトでは弱い参照• デザインをKv、ロジックをPythonで行うようになっているが、その部分がきれいに分離できていない
Kivy(マルチプラットフォームについて)• iOSは開発に力が入っていないので最新の状況にあまり追随できていないように感じる。• まだ公式だと2系しかサポートしていない• AndoridはPython3系対応が不完全• Kivy Lancher は3系対応中(https://github.com/kivy/kivy-launcher)• apkを作成するのは環境設定などが大変• Numpyなど3dライブラリを入れる場合はBootstrapという手法があるが変換が大変
PySide2• Qt for Pythonともいう• ライセンスフリーなQT系のライブラリ• 開発は盛んにおこなわれている• https://wiki.qt.io/Qt_for_Python• http://blog.qt.io/blog/2018/05/04/hello-qt-for-python/• https://www.qoosky.io/techs/3eccbf937d• https://dftalk.jp/?p=20768
UnrealEngine4• Epic Gamesより開発されたゲームエンジン• 「ドラゴンクエストXI 」(ゲーム)や「ローグ・ワン/スター・ウォーズ・ストーリー」(映画)に使用• ゲーム会社がPythonで動かせるものを開発• https://github.com/20tab/UnrealEnginePython• EuroPython 2017 でもトークがある• AAA Games with Unreal Engine 4 and Python(https://www.youtube.com/watch?v=_38csFR5Hrw)• 公式でもPythonで動かせるように開発が進んでいるSetting up Collisions with Static Meshes in Blueprints and Python
Godot Engine• MITライセンスなOSSのゲームエンジンPythonで動かそうと開発している人がいる• https://github.com/touilleMan/godot-python• EuroPython 2017 でもトークがある• Bringing Python to Godot gameengine(https://www.youtube.com/watch?v=SK0BtxHROdg)
pyinstller• https://github.com/pyinstaller/pyinstaller• 使い方の参考• https://pythonhosted.org/PyInstaller/usage.html• https://www.pyinstaller.org/https://www.lisz• works.com/entry/pyinstall• オプション• --onefile :1ファイルにまとめる場合• -noconsole :起動時にログ出力などのコンソール画面を出さないようする場合• specファイル• ライブラリの依存関係などを記述してexeにする際に取り込む
pyinstller(デメリット)• 起動が重い• ファイルの容量が大きい• spacファイルを作るのに手間がかかる
Nuitka• https://github.com/kayhayen/Nuitka• http://nuitka.net/• 参考• https://githubja.com/kayhayen/nuitka• https://qiita.com/junichi2/items/e7f2d899d1014167f8bc• Cコンパイラでバイナリ化しているらしい• 起動速度が早い• exe化した場合の容量が小さい• 情報がまだまだ少ない• ライブラリを多く含むもののexe化が難しい
まとめ• PythonのGUIはライブラリが多いがどれがいいかを紹介した。• Web系の開発の人はEelがお勧め• 見た目がそこそこいいものをデフォルトでつくる場合はKivyがお勧め• 配布時のexe化に課題があり