GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

dddomodossola

remi – Python REMoteインタフェースライブラリ。 プラットフォームに依存しない。 約100キロバイトで、あなたの食事に最適

投稿日:

Python REMoteインタフェースライブラリ。 プラットフォームに依存しない。 約100キロバイトで、あなたの食事に最適です。

アプリケーションに対応したプラットフォームに依存しない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_portwebsocketが使用するポートの整数。 あなたのルータ上でこのポートを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がすでに寄稿者のリストを提供していることを知っていますが、私は誰が助けを述べる必要があると感じます。

ダビド・ローザ

ジョンストワーズ

クラウディオカンナータ

サムファイファー

ケントンプソン

バース・タンドン

アリーウィアー

ティモシー・サイラス

ジョンハンターボーエン

マーティンスパソフ

ウェリントンカステッロ

PURPORC

タフト

クリスブラウン

アランYorinks

Bernhard E. Reiter

サウナム

Remiを使ったプロジェクト

ROSロボットのためのWebベースの動的再構成

razmq

エスプレッソ – ARM

PiPresents

Python Banyan Framework

その他の実装

このライブラリの他の実装を以下に示します:

  • cremi :(WIP)あなたのC ++プロジェクトのためにClaudioCannatàによって開発されました。







-dddomodossola
-, , , , ,

執筆者: