โครงการนี้ไม่ได้รับการอัปเดตที่สำคัญ และฉันจะมีเวลาจำกัดในอนาคต ด้วยการเปิดตัวล่าสุด โปรเจ็กต์กลายเป็นสิ่งที่ฉันต้องการได้อย่างแม่นยำ นั่นคือตัวแก้ไขและเฟรมเวิร์กที่ง่ายและยืดหยุ่นสำหรับสำรวจกรณีการใช้งานของการเขียนสคริปต์ภาพแบบโฟลว์ใน Python หากคุณมีคำถามหรือแนวคิดเพิ่มเติม โปรดเปิดประเด็นหรือแยกโครงการและลองทำด้วยตัวเอง
Ryven เป็นตัวแก้ไขโหนดทดลองที่เขียนด้วย Python ใช้อินเทอร์เฟซภาพแบบ Qt สำหรับการเขียนสคริปต์ภาพแบบโฟลว์ใน Python โดยมีระบบที่มีประสิทธิภาพสำหรับการพัฒนาโหนดที่รันโค้ด Python และตัวแก้ไขสำหรับการสร้างกราฟโดยใช้โหนดเหล่านั้น Ryven มีตัวเลือกการกำหนดค่ามากมายและโหมด headless สำหรับการรันกราฟโดยไม่ต้องใช้ GUI repos GitHub ที่เกี่ยวข้องบางส่วน:
ไลบรารี ryvencore-qt
เพิ่มคลาส GUI ที่ใช้ Qt สำหรับ ryvencore ( ./ryvencore-qt/
) และตัวแก้ไข Ryven จะรวบรวมคลาสเหล่านั้นเป็นแอปพลิเคชันข้ามแพลตฟอร์มที่มีคุณสมบัติครบถ้วน ( ./ryven-editor/
)
เมื่อคุณติดตั้ง Python และ pip แล้ว Ryven จะพร้อมใช้งานบน PyPI ผ่านทาง
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 สามารถกำหนดค่าได้สี่วิธี:
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
จากบรรทัดคำสั่งFile -> Import Example Nodes
และเลือก <installation_dir>/example_nodes/std/nodes.py
val
สองอันเข้าไปในฉาก+
result
ctrl + scroll
แพ็คเกจโหนด Ryven เป็นเพียงแพ็คเกจ Python ทั่วไปซึ่งมีไฟล์ nodes.py
เป็นอย่างน้อย และเรียก Ryven node 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
ตอนนี้คุณสามารถเริ่มกำหนดโหนดของคุณเองได้แล้ว เรามากำหนดโหนดพื้นฐานสองโหนดกัน หนึ่งที่สร้างตัวเลขสุ่ม...
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 ทำงานบน Qt โดยใช้ PySide2 หรือ PySide6 (ผ่านไลบรารี qtpy) คุณสามารถกำหนดค่า GUI ของโหนดของคุณในไฟล์แยกต่างหาก และเพิ่มวิดเจ็ต Qt แบบกำหนดเองให้กับโหนดของคุณได้ ตรวจสอบให้แน่ใจว่าได้แยกตรรกะของโหนดออกจากส่วนประกอบ GUI อย่างชัดเจนเสมอ หนึ่งในคุณสมบัติหลักของ Ryven คือการรันโปรเจ็กต์แบบไม่มีหัว (บน ryvencore) โดยไม่ต้องพึ่งพา GUI ใด ๆ เพื่อให้สิ่งนี้ได้ผล ไฟล์ nodes.py
ของคุณไม่ควรขึ้นอยู่กับ Qt โดยตรง แต่คุณสามารถแนบ GUI แบบกำหนดเองเข้ากับโหนดของคุณจากไฟล์ GUI ดังที่แสดงด้านล่างแทน
มาเพิ่มสีสันและเพิ่มแถบเลื่อนให้กับโหนด Rand
ใน 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' }
}
และนี่คือ! ตอนนี้ Ryven จะลงทะเบียน RandNodeGui
เป็น "คลาส GUI" ของคลาส RandNode
ซึ่งทำหน้าที่เป็นคอนเทนเนอร์สำหรับทุกสิ่งของ UI คุณสามารถเพิ่มวิดเจ็ตหลัก ("หลัก") แบบกำหนดเองให้กับโหนดของคุณ วิดเจ็ตอินพุต และปรับแต่งรูปลักษณ์ของโหนดเพิ่มเติมได้
ค่าที่จัดทำโดยวิดเจ็ตอินพุต (เช่น self.update_node_input(val)
ด้านบน) จะถูกส่งกลับในโหนดเมื่อเรียก input()
(เช่น self.input(0)
ใน RandNode
) แต่เฉพาะเมื่ออินพุตที่เกี่ยวข้อง ไม่ได้ เชื่อมต่อแล้ว มิฉะนั้นค่าของเอาต์พุตที่เชื่อมต่อจะถูกส่งกลับ
โปรดค้นหาแหล่งข้อมูลเพิ่มเติมในหน้าวิกิ GitHub ในพื้นที่เก็บข้อมูลนี้
เว้นแต่คุณจะระบุไว้เป็นอย่างอื่นอย่างชัดเจน การสนับสนุนใดๆ ที่ส่งโดยเจตนาเพื่อรวมไว้ในผลงานโดยคุณจะต้องได้รับอนุญาตตามที่กล่าวข้างต้น โดยไม่มีข้อกำหนดหรือเงื่อนไขเพิ่มเติมใดๆ
ผลงานได้รับการชื่นชมอย่างมาก โครงการนี้ไม่มีอยู่หากไม่มีชุมชนโอเพ่นซอร์ส ฉันอยากจะขอบคุณบุคคลที่มีรายชื่ออยู่ในไฟล์ CREDITS.md
เป็นพิเศษ