このプロジェクトは実質的な更新が行われていないため、今後このプロジェクトに費やす時間は限られています。最新リリースでは、プロジェクトはまさに私が望んでいたもの、つまり Python でのフローベースのビジュアル スクリプティングのユースケースを探索するための簡単で柔軟なエディターとフレームワークになりました。質問やさらなるアイデアがある場合は、遠慮なく問題をオープンするか、プロジェクトをフォークして自分で試してみてください。
Ryven は、Python で書かれた実験的なノード エディタです。 Python でのフローベースのビジュアル スクリプティングのための Qt ベースのビジュアル インターフェイスを実装します。 Python コードを実行するノードを開発するための強力なシステムと、それらのノードを使用してグラフを構築するためのエディターを提供します。 Ryven は、GUI なしでグラフを実行するための多数の構成オプションとヘッドレス モードを備えています。関連する GitHub リポジトリのいくつか:
ryvencore-qt
ライブラリは、ryvencore 用の Qt ベースの GUI クラス ( ./ryvencore-qt/
) を追加し、Ryven エディターはそれらを完全な機能を備えたクロスプラットフォーム アプリケーション ( ./ryven-editor/
) にアセンブルします。
Python と pip をインストールすると、PyPI で Ryven を使用できるようになります。
pip install ryven
conda-forge パッケージ ( conda install -c conda-forge ryven
) もあります。
Ryven は、コマンド ラインからryven
と入力して起動できます。 Ryven を Python 仮想環境 (または conda 環境) にインストールした場合は、最初に環境をアクティブ化する必要があります。
Ryven 自体には、いくつかの小さなサンプル ノードのみが付属しています。 Ryven を使用してノードを開発するか、ユースケースに応じてサードパーティのノード パッケージを使用する必要があります (存在する場合)。実際、サンプル ノードは単なる例であり、決して安定しているわけではないため、依存すべきではありません。
ryven をインストールすると、ユーザー ホームに次の構造のディレクトリ~/.ryven/
が作成されます。
~/.ryven
├── nodes
│ ├── your_nodes_pkg_1
│ ├── nodes.py
│ └── gui.py
│ └── ...
├── saves
│ ├── your_project_1.json
│ └── ...
└── ryven.cfg
ryven.cfg
ファイルには、Ryven のグローバル構成が含まれています。
Ryven は 4 つの方法で設定できます。
ryven --nodes your_nodes_pkg_1 --no-animations
~/.ryven/ryven.cfg
などの構成ファイルから: nodes = your_nodes_pkg_1 no_animations = True
import ryven ryven . run_ryven ( nodes = [ 'your_nodes_pkg_1' ], no_animations = True )
利用可能なオプションのリストを表示するには、 ryven --help
と入力します。
Ryven プロジェクトをヘッドレス (GUI なし) でデプロイするには、 ryven-console
コマンドを使用します。
> ryven-console /home/leon/.ryven/saves/basics.json
Welcome to the Ryven Console ! Your project has been loaded.
You can access the ryvencore session by typing ` session ` .
For more information, visit https://leon-thomm.github.io/ryvencore/
>>> f = session.flows[0]
>>> ctr_var_result_node = f.nodes[2]
>>> ctr_set_var_node = f.nodes[8]
>>> ctr_var_result_node.val
3738
>>> ctr_set_var_node.update(0)
>>> ctr_var_result_node.val
3739
ryven
実行してRyvenを開きますFile -> Import Example Nodes
選択し、 <installation_dir>/example_nodes/std/nodes.py
を選択します。val
ノードをシーンにドラッグします+
ノードを使用してそれらを接続しますresult
ノードに結果を表示するctrl + scroll
でズームRyven ノード パッケージは、少なくともnodes.py
ファイルを含む典型的な Python パッケージであり、Ryven ノード API を呼び出してノード定義を公開します。
~/.ryven/nodes/
に移動し、次の構造のサブディレクトリを作成します。
~/.ryven/nodes
└── your_nodes_pkg_1
├── __init__.py
├── nodes.py
└── gui.py
以下の内容で:
nodes.py
:
from ryven . node_env import *
# your node definitions go here
export_nodes ([
# list your node classes here
])
@ on_gui_load
def load_gui ():
# import gui sources here only
from . import gui
とgui.py
:
from ryven . gui_env import *
from . import nodes
# your node gui definitions go here
これで、独自のノードの定義を開始できるようになりました。 2 つの基本ノードを定義しましょう。乱数を生成するもの...
from random import random
class RandNode ( Node ):
"""Generates scaled random float values"""
title = 'Rand'
tags = [ 'random' , 'numbers' ]
init_inputs = [ NodeInputType ()]
init_outputs = [ NodeOutputType ()]
def update_event ( self , inp = - 1 ):
self . set_output_val ( 0 ,
Data ( random () * self . input ( 0 ). payload )
)
...そしてそれらを印刷する別のもの
class PrintNode ( Node ):
title = 'Print'
init_inputs = [ NodeInputType ()]
def update_event ( self , inp = - 1 ):
print ( self . input ( 0 ))
そしてそれらをRyvenに暴露します
export_nodes ([
RandNode ,
PrintNode ,
])
それでおしまい! Ryven にノード パッケージをインポートし ( File -> Import Nodes
)、グラフにノードを配置して、それらを接続することができます。 val
ノードを追加し、 Rand
ノードに接続して、その入力にデータを供給します。 val
ノードのウィジェットに数値を入力して Enter キーを押すと、その数値がRand
ノードがスケーリングされた乱数をPrint
ノードに送信し、標準出力に出力されます。
デフォルトでは、標準出力はエディタ内コンソールであることに注意してください。エディタ内コンソールには、エディタ ウィンドウの最下部からアクセスできます (青いハンドルを上にドラッグすると表示されます)。
GUI を使用してノードにスパイスを加えることができるようになりました。 Ryven は、PySide2 または PySide6 (qtpy ライブラリ経由) を使用して、Qt 上で実行されます。ノードの GUI を別のファイルで構成し、カスタム Qt ウィジェットをノードに追加できます。ノード ロジックを GUI コンポーネントから常に明確に分離するようにしてください。 Ryven の中心的な機能の 1 つは、GUI に依存せずにプロジェクトをヘッドレス (ryvencore 上で) 実行することです。これを機能させるには、 nodes.py
ファイルが Qt に直接依存しないようにしてください。代わりに、以下に示すように、GUI ファイルからカスタム GUI をノードに接続できます。
gui.py
で色を付けて、 Rand
ノードにスライダーを追加しましょう。
from qtpy . QtWidgets import QSlider
from qtpy . QtCore import Qt
from ryven . gui_env import *
from . import nodes
class RandSliderWidget ( NodeInputWidget , QSlider ):
"""a standard Qt slider widget, which updates the node
input it is attached to, every time the slider value changes"""
def __init__ ( self , params ):
NodeInputWidget . __init__ ( self , params )
QSlider . __init__ ( self )
self . setOrientation ( Qt . Horizontal )
self . setMinimumWidth ( 100 )
self . setMinimum ( 0 )
self . setMaximum ( 100 )
self . setValue ( 50 )
self . valueChanged . connect ( self . value_changed )
def value_changed ( self , val ):
# updates the node input this widget is attached to
self . update_node_input ( Data ( val ))
def get_state ( self ) -> dict :
# return the state of the widget
return { 'value' : self . value ()}
def set_state ( self , state : dict ):
# set the state of the widget
self . setValue ( state [ 'value' ])
@ node_gui ( nodes . RandNode )
class RandNodeGui ( NodeGUI ):
color = '#fcba03'
# register the input widget class
input_widget_classes = { 'slider' : RandSliderWidget }
# attach the slider widget to the first node input
# display it _below_ the input pin
init_input_widgets = {
0 : { 'name' : 'slider' , 'pos' : 'below' }
}
そしてこれです! Ryven は、 RandNodeGui
RandNode
クラスの「GUI クラス」として登録します。これは、すべての UI のコンテナーとして機能します。カスタムのプライマリ (「メイン」) ウィジェットをノードや入力ウィジェットに追加し、ノードの外観をさらにカスタマイズできます。
入力ウィジェット (例: 上記のself.update_node_input(val)
) によって提供された値は、 input()
(例: RandNode
のself.input(0)
を呼び出すときにノードに返されますが、対応する入力がそうでない場合に限られます。接続されました。それ以外の場合は、接続された出力の値が返されます。
このリポジトリの GitHub wiki ページで詳細なリソースを見つけてください。
あなたが明示的に別段の定めをしない限り、あなたが作品に含めるために意図的に提出した投稿は、追加の条件なしで上記のようにライセンスされるものとします。
貢献を高く評価します。このプロジェクトは、オープンソース コミュニティなしでは存在しません。 CREDITS.md
ファイルに記載されている人々に特に感謝したいと思います。