Proyek ini tidak menerima pembaruan besar, dan waktu saya terbatas untuk mengerjakannya di masa mendatang. Dengan rilis terbaru, proyek ini menjadi sesuai dengan apa yang saya inginkan: editor dan kerangka kerja yang mudah dan fleksibel untuk mengeksplorasi kasus penggunaan skrip visual berbasis aliran dengan Python. Jika Anda memiliki pertanyaan atau ide lebih lanjut, silakan membuka terbitan atau membagi proyek dan mencobanya sendiri.
Ryven adalah editor simpul eksperimental yang ditulis dengan Python. Ini mengimplementasikan antarmuka visual berbasis Qt untuk skrip visual berbasis aliran dengan Python. Ini menyediakan sistem yang kuat untuk mengembangkan node yang mengeksekusi kode Python apa pun, dan editor untuk membuat grafik menggunakan node tersebut. Ryven menampilkan banyak opsi konfigurasi dan mode tanpa kepala untuk menjalankan grafik tanpa GUI apa pun. Beberapa repo GitHub yang relevan:
Pustaka ryvencore-qt
menambahkan kelas GUI berbasis Qt untuk ryvencore ( ./ryvencore-qt/
), dan editor Ryven merakitnya menjadi aplikasi lintas platform berfitur lengkap ( ./ryven-editor/
).
Setelah Anda menginstal Python dan pip, Ryven tersedia di PyPI melalui
pip install ryven
Ada juga paket conda-forge ( conda install -c conda-forge ryven
).
Ryven dapat diluncurkan dari baris perintah dengan mengetik ryven
. Jika Anda menginstal Ryven ke lingkungan virtual Python (atau lingkungan conda), lingkungan tersebut harus diaktifkan terlebih dahulu.
Ryven sendiri hanya hadir dengan beberapa contoh node kecil. Anda harus menggunakan Ryven untuk mengembangkan node, atau menggunakan paket node pihak ketiga untuk kasus penggunaan Anda jika ada. Node contoh - memang - hanyalah contoh, dan tidak stabil dalam hal apa pun, jadi Anda tidak boleh bergantung padanya.
Saat diinstal, ryven akan membuat direktori ~/.ryven/
di beranda pengguna Anda dengan struktur berikut:
~/.ryven
├── nodes
│ ├── your_nodes_pkg_1
│ ├── nodes.py
│ └── gui.py
│ └── ...
├── saves
│ ├── your_project_1.json
│ └── ...
└── ryven.cfg
File ryven.cfg
berisi konfigurasi global untuk Ryven.
Ryven dapat dikonfigurasi dalam empat cara:
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 )
Ketik ryven --help
untuk daftar opsi yang tersedia.
Untuk menerapkan proyek Ryven tanpa kepala (tanpa GUI apa pun) gunakan perintah 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
dari baris perintahFile -> Import Example Nodes
dan pilih <installation_dir>/example_nodes/std/nodes.py
val
ke dalam TKP+
result
ctrl + scroll
Paket node Ryven hanyalah paket Python biasa yang berisi setidaknya file nodes.py
, dan memanggil API node Ryven untuk mengekspos definisi node.
Navigasi ke ~/.ryven/nodes/
dan buat subdirektori dengan struktur berikut
~/.ryven/nodes
└── your_nodes_pkg_1
├── __init__.py
├── nodes.py
└── gui.py
dengan isi sebagai berikut:
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
dan gui.py
:
from ryven . gui_env import *
from . import nodes
# your node gui definitions go here
Anda sekarang dapat mulai menentukan node Anda sendiri. Mari kita definisikan dua node dasar. Salah satu yang menghasilkan angka acak...
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 )
)
...dan satu lagi yang mencetaknya
class PrintNode ( Node ):
title = 'Print'
init_inputs = [ NodeInputType ()]
def update_event ( self , inp = - 1 ):
print ( self . input ( 0 ))
dan memaparkannya pada Ryven
export_nodes ([
RandNode ,
PrintNode ,
])
Itu saja! Anda dapat mengimpor paket node Anda di Ryven ( File -> Import Nodes
), menempatkan node dalam grafik, dan menyambungkannya. Tambahkan node val
dan sambungkan ke node Rand
, untuk memasukkan inputnya dengan data. Jika Anda mengetikkan angka ke dalam widget node val
dan menekan enter, nomor tersebut akan dikirim ke node Rand
, yang akan mengirimkan nomor acak berskala ke node Print
, yang akan mencetaknya ke output standar.
Perhatikan bahwa output standar secara default adalah konsol dalam editor, yang dapat Anda akses di bagian paling bawah jendela editor (seret pengendali biru ke atas untuk membuatnya terlihat).
Anda sekarang dapat membumbui node Anda dengan beberapa GUI. Ryven berjalan di Qt, menggunakan PySide2 atau PySide6 (melalui perpustakaan qtpy). Anda dapat mengonfigurasi GUI node Anda dalam file terpisah, dan menambahkan widget Qt khusus ke node Anda. Pastikan untuk selalu memisahkan logika node dengan jelas dari komponen GUI. Salah satu fitur utama Ryven adalah menjalankan proyek tanpa kepala (di ryvencore) tanpa ketergantungan GUI apa pun. Agar ini berfungsi, file nodes.py
Anda tidak boleh bergantung pada Qt secara langsung. Sebagai gantinya, Anda dapat melampirkan GUI khusus ke node Anda dari file GUI seperti yang ditunjukkan di bawah ini.
Mari beri mereka beberapa warna dan tambahkan penggeser ke node Rand
, di gui.py
:
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' }
}
dan ini dia! Ryven sekarang akan mendaftarkan RandNodeGui
sebagai "kelas GUI" dari kelas RandNode
, yang berfungsi sebagai wadah untuk semua hal UI. Anda dapat menambahkan widget utama ("utama") khusus ke node Anda, memasukkan widget, dan menyesuaikan lebih lanjut tampilan node.
Nilai yang diberikan oleh widget input (misalnya self.update_node_input(val)
di atas) akan dikembalikan dalam node, ketika memanggil input()
(misalnya self.input(0)
di RandNode
), tetapi hanya jika input yang sesuai tidak terhubung . Jika tidak, nilai output yang terhubung akan dikembalikan.
Silakan temukan sumber daya lebih lanjut di halaman wiki GitHub di repositori ini.
Kecuali jika Anda secara eksplisit menyatakan sebaliknya, setiap kontribusi yang dengan sengaja Anda kirimkan untuk dimasukkan ke dalam karya Anda akan dilisensikan seperti di atas, tanpa syarat atau ketentuan tambahan apa pun.
Kontribusi sangat dihargai. Proyek ini tidak akan ada tanpa komunitas sumber terbuka. Saya ingin mengucapkan terima kasih khusus kepada orang-orang yang tercantum dalam file CREDITS.md
.