如何在Python脚本中连接Orange-Widgets

时间:2018-08-24 12:30:06

标签: python orange

我想不在Orange画布中使用Orange小部件,而是在自己的程序中使用。在某些小部件的主要功能中,显示了如何将数据放入小部件。例如:

ow = OWScatterPlot()
ow.set_data(Orange.data.Table('iris'))

但是不幸的是,我无法找到如何连接两个小部件的输入和输出。我曾期待过这样的事情:

ow1 = OWSelectRows()
ow1.set_data(Table("iris"))
ow2 = OWScatterPlot()
ow2.Inputs.data=ow1.Outputs.matching_data

但是没有数据到达ow2。 在画布中,只需将链接从一个小部件拖动到另一个小部件即可。有人知道它是如何在Python脚本中完成的吗?

1 个答案:

答案 0 :(得分:0)

橙色在后台运行一个SignalManager,可处理小部件的输入和输出。因此,如果您希望将数据从一个小部件转移到另一个没有画布的小部件,则应执行以下操作:

from orangecanvas.application.canvasmain import *
from Orange.data import Table
from PyQt5.QtWidgets import QApplication
from orangewidget.tests.base import DummySignalManager
from Orange.widgets.data.owtable import OWDataTable
from WindowForWidgets import WindowForWidgets


def App():
    app = QApplication(sys.argv)

    signal_manager = DummySignalManager()
    window_for_widgets = WindowForWidgets

    data = Table('iris')

    ow1 = OWDataTable()
    ow1.signalManager = signal_manager
    getattr(ow1, ow1.Inputs.data.handler)(data) # you may replace this with: ow1.set_data(data)
    ow1.handleNewSignals()
    window_for_widgets = WindowForWidgets(ow1, data, signal_manager)
    sys.exit(app.exec_())

App()

我使用WindowForWidgets显示第一个窗口小部件并检测窗口小部件何时关闭(closeEvent方法)。然后,使用信号管理器将数据从第一个小部件传输到第二个小部件。这是WindowForWidgets的代码:

from Orange.widgets.visualize.owscatterplot import OWScatterPlot
from orangecanvas.application.canvasmain import *

class WindowForWidgets(QMainWindow):
    WINDOW_WIDTH = 400
    WINDOW_HEIGHT = 250

    def __init__(self, widget, data,  signal_manager):
        super(WindowForWidgets, self).__init__()
        self.widget = widget
        self.data = data
        self.signal_manager = signal_manager
        self.initUI()

    def initUI(self):
        self.setCentralWidget(self.widget)
        self.show()

    def closeEvent(self, event):
        ow2 = OWScatterPlot()
        getattr(ow2, ow2.Inputs.data.handler)(self.signal_manager.get_output(self.widget, "Selected Data"))
        ow2.show()

此代码会将所选数据从第一个小部件传输到第二个小部件。如果要传输所有数据,则需要从以下位置更改closeEvent方法中的行:

getattr(ow2, ow2.Inputs.data.handler)(self.signal_manager.get_output(self.widget, "Selected Data"))

收件人:

getattr(ow2, ow2.Inputs.data.handler)(self.signal_manager.get_output(self.widget, "Data"))