Github: https://github.com/dddomodossola/remi
アプリケーションに対応したプラットフォームに依存しないPython GUIライブラリ
RemiはPythonアプリケーション用のGUIライブラリで、アプリケーションのインタフェースをHTMLに変換してWebブラウザに表示します。 これにより、プラットフォーム固有の依存関係が削除され、Pythonでクロスプラットフォームアプリケーションを簡単に開発できます!
サポートが必要ですか? Gitterチャットで私達に手をつける 。
入門
gitからRemiをダウンロードまたはチェックアウトしてインストールしてください
python setup.py install
またはpipを使用して直接インストールする
pip install git+https://github.com/dddomodossola/remi.git
次に、テストスクリプトを開始します。
python widgets_overview_app.py
レミ
プラットフォームに依存しないPython GUIライブラリ。 100Kバイト未満のソースコードで、あなたの食事に最適です。
Remiを使用すると、開発者はPythonでプラットフォームに依存しないGUIを作成できます。 GUI全体がHTMLに変換され、ブラウザに表示されます。 HTMLは必要ありません。Remiは自動的にPythonコードをHTMLに変換します。 あなたのアプリが起動すると、ネットワーク上でアクセス可能なウェブサーバーが起動します。
これらのウィジェットは利用可能です:
- ウィジェット:すべてのウィジェットの基本クラス。 ジェネリックコンテナとして使用できます
- HBox:水平コンテナ
- VBox:垂直コンテナ
- ボタン
- TextInput:編集可能なテキスト
- スピンボックス
- ラベル
- InputDialog
- リストビュー
- 落ちる
- 画像
- 表
- TableWidget
- スライダー
- カラーピッカー
- 日付
- FileSelectionDialog
- メニュー
- メニュー項目
- VideoPlayer
基本的なアプリケーションは次のようになります。
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
container = gui.VBox(width = 120, height = 100)
self.lbl = gui.Label('Hello world!')
self.bt = gui.Button('Press me!')
# setting the listener for the onclick event of the button
self.bt.set_on_click_listener(self.on_button_pressed)
# appending a widget to another, the first argument is a string key
container.append(self.lbl)
container.append(self.bt)
# returning the root widget
return container
# listener function
def on_button_pressed(self, widget):
self.lbl.set_text('Button pressed!')
self.bt.set_text('Hi!')
# starts the webserver
start(MyApp)
ユーザーインターフェイスを表示するには、希望するブラウザを開き、「 http://127.0.0.1:8081 」と入力します 。 関数のstart
** kwargsでURLアドレスを変更することができます。 これについては後述する。
Android、Linux、Windowsでテスト済み。 Pythonスクリプト開発用のRaspberry Piで便利です。 それはあなたのモバイルデバイスから離れてあなたのラズベリーパイと対話することができます。
よくある質問
-
なぜ別のGUIライブラリですか?
Kivy、PyQT、およびPyGObjectはすべて、ホストオペレーティングシステム用のネイティブコードを必要とします。これは、大きな依存関係をインストールまたはコンパイルすることを意味します。 RemiはあなたのGUIを表示するためにWebブラウザだけが必要です。 -
私はHTMLを知る必要がありますか?
いいえ、必須ではありません。Pythonでのみコードを記述する必要があります。 -
どのブラウザでこれを使用できますか?
私はこれをChrome(Windows、Linux、Android)で開発しており、他の場所ではテストしていません。 それはおそらく他の場所でうまく動作します! -
オープンソースですか?
確かに! RemiはApache Licenseの下でリリースされています。 詳細については、LICENSE
ファイルを参照してください。 -
何らかのウェブサーバーが必要ですか? いいえ、それは含まれています。
簡単なチュートリアル
インポートRemiライブラリといくつかの他の有用なもの。
import remi.gui as gui
from remi import start, App
App
クラスをサブクラス化し、 App
のエントリポイントとなるmain
関数を宣言します。 main関数の内部では、ルートウィジェットをreturn
なければなりません。
class MyApp( App ):
def __init__( self, *args ):
super( MyApp, self ).__init__( *args )
def main( self ):
lbl = gui.Label( "Hello world!", width=100, height=30 )
#return of the root widget
return lbl
メインクラスの外側では、関数を呼び出すアプリケーションを起動し、前に宣言したクラスの名前をパラメータとして渡します。
#starts the webserver
start( MyApp )
スクリプトを実行します。 すべてOKならば、ブラウザで自動的にguiが開きます。そうでなければ、アドレスバーに「 http://127.0.0.1:8081 」と入力する必要があります 。
あなたは、のようなstart
コールでオプションのパラメータをカスタマイズすることができます。
start(MyApp,address='127.0.0.1', port=8081, multiple_instance=False,enable_file_cache=True, update_interval=0.1, start_browser=True)
パラメーター:
- アドレス:ネットワークインターフェイスIP
- port:リスンポート
- multiple_instance:boolean、Trueの場合スクリプトに接続する複数のクライアントに異なるAppインスタンスがある
- enable_file_cache:ブール値。Trueの場合、リソースキャッシュを有効にする
- update_interval:GUIによる更新間隔(秒単位)
- start_browser:起動時にブラウザを自動的に開くかどうかを定義するboolean
- websocket_port:整数、ウェブソケット通信用のポート番号
- standalone:booleanは、アプリケーションを独自のウィンドウを持つ標準のデスクトップアプリケーションとして実行する場所を示します。 Falseの場合、インターフェイスはブラウザのWebページに表示されます。
すべてのウィジェットコンストラクタは、標準の2つのkwargを受け取ります。
- width:int(ピクセルとして解釈される)またはstr(’10% ‘のような小節単位を指定できます)
- height:int(ピクセルとして解釈される)またはstr(’10% ‘のような小節単位を指定できます)として表現できます
イベントとコールバック
ウィジェットは、ユーザーの操作中に発生するイベントのセットを公開します。 このようなイベントは、アプリケーションの動作を定義する便利な方法です。 各ウィジェットは、それが許すユーザインタラクションのタイプに応じて、独自のコールバックを持っています。 ウィジェットの具体的なコールバックについては後で説明します。
イベントリスナーとして関数を登録するには、set_on_xxx_listenerのような関数を呼び出して、イベントを管理するコールバックをパラメータとして渡す必要があります。 次の例に従います。
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
container = gui.VBox(width = 120, height = 100)
self.lbl = gui.Label('Hello world!')
self.bt = gui.Button('Press me!')
# setting the listener for the onclick event of the button
self.bt.set_on_click_listener(self.on_button_pressed)
# appending a widget to another, the first argument is a string key
container.append(self.lbl)
container.append(self.bt)
# returning the root widget
return container
# listener function
def on_button_pressed(self, widget):
self.lbl.set_text('Button pressed!')
self.bt.set_text('Hi!')
# starts the webserver
start(MyApp)
示された例では、 self.bt.set_on_click_listener(self.on_button_pressed)は、ボタンのウィジェットによって公開されるイベントonclickのリスナーとして、自分のon_button_pressed関数を登録します。 シンプルで簡単。
リスナのコールバックは最初にエミッタのインスタンスを受信し、次に特定のイベントによって提供される他のすべてのパラメータを受信します。
標準的なイベント登録(前述)のほかに、ユーザパラメータをリスナ関数に渡すことができます。 これにより、 set_on_xxx_listener関数呼び出しにパラメータを追加することができます。
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
container = gui.VBox(width = 120, height = 100)
self.lbl = gui.Label('Hello world!')
self.bt = gui.Button('Hello name!')
self.bt2 = gui.Button('Hello name surname!')
# setting the listener for the onclick event of the buttons
self.bt.set_on_click_listener(self.on_button_pressed, "Name")
self.bt2.set_on_click_listener(self.on_button_pressed, "Name", "Surname")
# appending a widget to another
container.append(self.lbl)
container.append(self.bt)
container.append(self.bt2)
# returning the root widget
return container
# listener function
def on_button_pressed(self, widget, name='', surname=''):
self.lbl.set_text('Button pressed!')
widget.set_text('Hello ' + name + ' ' + surname)
# starts the webserver
start(MyApp)
これにより、同じイベントリスナ定義で異なる動作を得ることができます。
HTML属性のアクセシビリティ
html属性を操作するために、ウィジェットのHTML表現にアクセスする必要があることがあります。 ライブラリはこれらの情報に簡単にアクセスできます。
簡単な例:ウィジェットにホバーテキストを追加したい場合です。 これは、htmlタグのtitle属性によって実現できます。 これを行うためには:
widget_instance.attributes['title'] = 'Your title content'
html属性の特別な場合はスタイルです。 スタイル属性は次のように変更できます。
widget_instance.style['color'] = 'red'
新しい属性の割り当てによって、自動的にそれが作成されます。
内部で使用される属性に注意してください。 これらは:
- class :スタイリング目的のウィジェットクラス名を格納するために使用されます。
- id :コールバック管理用のウィジェットのインスタンスIDを格納するために使用されます。
リモートアクセス
DNSを使用し、ファイアウォールの背後にリモートでREMIアプリケーションを使用している場合は、 start
呼び出しで特別なパラメータを指定できます。
- websocket_port : websocketが使用するポートの整数。 あなたのルータ上でこのポートをNATすることを忘れないでください。
- host_name :アプリケーションにアクセスできるようにするホスト名またはリモートIPアドレスを含む文字列。
start(MyApp, address='0.0.0.0', port=8081, websocket_port=8082, host_name='myhostname.net')
スタンドアロン実行
Remiはリモートインタフェースを構築するための効果的なソリューションですが、スタンドアロンの実行はどうですか? 確かにあなたのブラウザでそれを使うことができますが、リモートアクセスが必要ないアプリケーションの場合、ネイティブGUIが最適です。 これは、REMIとPyWebViewに参加するだけで簡単に取得できます。 次に、このstandalone_app.pyの例を示します。
認証
インターフェイスへのリモートアクセスを制限するために、ユーザ名とパスワードを定義することができます。 これは簡単な認証プロセスで構成されています。 開始コールでパラメータのユーザ名とパスワードを定義するだけです :
start(MyApp, username='myusername', password='mypassword')
スタイリング
あなたのアプリのための新しいスタイルを定義するためには、以下を行う必要があります。 resフォルダを作成し、Appクラスのコンストラクタに渡します:
class MyApp(App):
def __init__(self, *args):
res_path = os.path.join(os.path.dirname(__file__), 'res')
super(MyApp, self).__init__(*args, static_file_path=res_path)
remiフォルダから標準のstyle.cssをコピーして、 resフォルダに貼り付けます。 カスタマイズするために編集します。 このようにして、標準のstyle.cssファイルは、作成したstyle.cssファイルによって上書きされます。
互換性
RemiはPython2.7からPython3.Xに互換性があるように作られています。 互換性の問題を通知してください。
セキュリティ
Remiは、標準的なデスクトップGUIフレームワークとして意図されるべきです。 ライブラリ自体はセキュリティ戦略を実装していないため、安全でないパブリックネットワークへのアクセスを公開しないことをお勧めします。
外部ソースからデータを読み込む際には、コンテンツを直接表示する前に、潜在的なJavaScript注入からアプリケーションを保護することを検討してください。
プロジェクトの支援
Remiプロジェクトをサポートできますか?
レミはパトリオンにいると知っていますか? それはこのプロジェクトを支えるすばらしい方法です。
少量でも大歓迎です。
貢献者
Remiをより良くするために私たちと協力してくれてありがとう! opensourceの本当の力は貢献者です。 このプロジェクトを続行してください。次のリストに自分自身を追加することを検討してください。 はい、私はgithubがすでに寄稿者のリストを提供していることを知っていますが、私は誰が助けを述べる必要があると感じます。
Remiを使ったプロジェクト
その他の実装
このライブラリの他の実装を以下に示します:
- cremi :(WIP)あなたのC ++プロジェクトのためにClaudioCannatàによって開発されました。