Python 实现基于节点的图形界面?

Python 实现基于节点的图形界面?,python,user-interface,directed-graph,Python,User Interface,Directed Graph,我想实现一个节点接口,基本上是一个节点接口,其中每个节点对其输入连接执行一个操作,并输出一些东西(可以连接到另一个节点) 一些示例应用程序: - - - - - 作为第一个目标,我希望有一个只有2个节点的图形应用程序。一个“数字”简单地输出一个固定的数字,一个“加法”节点接受两个输入并输出两个输入的总和 到目前为止,人们已经回答了这个问题,我大致了解了如何在代码中表示数据,例如在Python外观的伪代码中: class Number: def __init__(self, valu

我想实现一个节点接口,基本上是一个节点接口,其中每个节点对其输入连接执行一个操作,并输出一些东西(可以连接到另一个节点)

一些示例应用程序:

  • -
  • -
  • -
  • -
  • -

作为第一个目标,我希望有一个只有2个节点的图形应用程序。一个“数字”简单地输出一个固定的数字,一个“加法”节点接受两个输入并输出两个输入的总和

到目前为止,人们已经回答了这个问题,我大致了解了如何在代码中表示数据,例如在Python外观的伪代码中:

class Number:
    def __init__(self, value):
        self.value = value

    def eval(self):
        return self.value

class Add:
    def __init__(self, input1, input2):
        self.input1 = input1
        self.input2 = input2

    def eval(self):
        return self.input1.eval() + self.input2.eval()


a = Number(20)
b = Number(72)

adder = Add(a, b)
print adder.eval()
我该如何包装一个定制的GUI呢?类似于下面的内容,但稍微少一点手绘


我从哪里开始?我目前计划用Objective-C/Cocoa编写它,尽管我非常愿意接受其他语言的建议。

我将从建模一些基本界面开始(在OOP意义上,而不是GUI意义上)。在我看来,您将有一个节点,它将接受一组输入和一个输出。您没有指出数据类型的范围有多广,但是您需要一些合适的方法来表示输入/输出。对于第一个目标,这可以是一个整数

在一些通用C风格的OOP语言中(希望有意义):

类节点{
节点[]输入;
T eval();
}
类AdderNode扩展节点{
int eval(){
int accum=0;
用于(输入:i)
累计+=i.评估();
返回i;
}
}
类ConstNode扩展节点{
int eval(){return I;}
}
加法节点a;
a、 add(ConstNode());
a、 add(ConstNode());
a、 eval();

您可以通过将int替换为一些抽象类、泛型或接口来扩展它。当然,实际的实现将根据实际语言的不同而有所不同。

我将首先对有趣的操作进行建模。最终,您将把它们连接到一个用户界面,但这是方向盘和油门踏板,而不是发动机

您试图构建的内容与编程语言有很多共同之处:变量、值、类型、表达式、求值等。许多隐喻都是适用的,可能会提供一些指导

如果您使用的是.NET 3.5,则可以选择,它允许您在运行时表示和编译代码表达式

例如,要建模您的第一个目标:

using System.Linq.Expressions;

ConstantExpression theNumber2 = Expression.Constant(2);
ConstantExpression theNumber3 = Expression.Constant(3);

BinaryExpression add2And3 = Expression.Add(theNumber2, theNumber3);
要调用表达式,我们需要使用方法包装
add2And3
。这是通过lambda表达式完成的:

Expression<Func<int>> add2And3Lambda = Expression.Lambda<Func<int>>(add2And3);
所以我们有一个表达式树,它的根是一个方法。因为方法是可调用的,所以我们可以将树编译为基础委托类型的实例:

Func<int> add2And3Func = add2And3Lambda.Compile();
支持.NET语言可用的所有表达式


假设图形中的每个节点都有一个与其关联的
表达式。这可能会让您了解表达式树的功能,以及它们如何帮助您完成这项任务。

所有节点系统的共同点都是它们描述函数式编程语言。一个函数接受多个参数并返回一个结果,不管它是出于什么目的设计的。一些例子:

  • 图形:模糊(图像、内核、半径)->图像

  • 数学:添加(数字,数字)->数字

  • 关系:过滤器(表,谓词)->表

基本上可以归结为一个函数签名,如
Func
(C#)

您将面临如何使节点系统持久化的问题。是否要使节点的结果仅由一个其他节点(树)或多个节点(图形)用作参数

树的示例,直接具有子节点的参数:

Add(
  Multiply(
    Constant(5),
    Constant(4)
  ),
  Multiply(
    Constant(5),
    Constant(3)
  )
)
以图形为例,将所有节点存储在列表中并仅使用引用:

A := Constant(5)
B := Constant(4)
C := Constant(3)

D := Func(Multiply, A, B)
E := Func(Multiply, A, C)

F := Func(Add, D, E)
也许有什么有趣的事


图的下半部分显示了一个使用bwise创建乘法块的示例,该乘法块以两个数字作为输入。

我在Cocoa中找到了一些关于实现此类接口的有用信息:

  • 和-在NSView中描述基本图形
  • 在Cocoadev上——这正是我想要的,Quartz Composer接口的实现

我实现了一个执行图,如您在本项目中所述:

可以找到源代码

目前,我正在项目中发布一个更好、更干净的系统版本。
你可能也会感兴趣


还有谷歌的TensorFlow库,它实现了一个类似的系统

我在研究类似的解决方案时偶然发现了这个线程。 最近我在github上发现了一个不错的项目 这似乎正是你要找的。至少可以从项目中提取并采用编辑器组件

问候,,
Stephan

欢迎来到StackOverflow,感谢您的贡献,但不鼓励只提供链接的答案。请复习一下。一个好的经验法则是在没有链接的情况下看你的答案,如果它没有什么价值,考虑扩展。
int theNumber5 = add2And3Func();
Add(
  Multiply(
    Constant(5),
    Constant(4)
  ),
  Multiply(
    Constant(5),
    Constant(3)
  )
)
A := Constant(5)
B := Constant(4)
C := Constant(3)

D := Func(Multiply, A, B)
E := Func(Multiply, A, C)

F := Func(Add, D, E)