You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Orange自定义Python Widget导入Canvas的完整教程及问题求助

Orange Widget 完整创建与接入Orange Canvas教程

一、标准项目结构

Orange仅识别orangecontrib命名空间下的组件,必须遵循以下目录结构:

your-widget-package/
├── orangecontrib/
│   └── yourwidgetname/  # 自定义组件包名,前缀必须为orangecontrib
│       ├── __init__.py
│       ├── widgets/
│       │   ├── __init__.py  # 可空,但必须存在
│       │   └── owyourwidget.py  # Widget类文件,命名建议以ow开头
│       └── icons/  # 可选,存放组件图标
│           └── yourwidget.svg
└── setup.py

二、setup.py 核心配置

setup.py是Orange识别组件的关键,必须包含正确的入口配置:

from setuptools import setup, find_packages

setup(
    name="orangecontrib-yourwidgetname",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "Orange3>=3.30.0",  # 匹配你的Orange版本
    ],
    entry_points={
        "orange.widgets": [
            "数据处理 = orangecontrib.yourwidgetname.widgets",
        ],
        # 若有图标资源,添加以下配置
        "orange.canvas.resources": [
            "icons = orangecontrib.yourwidgetname.widgets:icons",
        ]
    },
    include_package_data=True,
)
  • orange.widgets下的数据处理是组件在Canvas中显示的分类名称,需与后续Widget类的分类参数一致;后面的路径指向存放Widget类的模块。

三、Widget代码规范

你的Widget类必须满足以下要求才能被识别:

from Orange.widgets.widget import OWWidget, widget
from Orange.widgets.settings import Setting
from Orange.data import Table

@widget(
    name="数据采样器",  # Canvas中显示的组件名称
    description="对输入数据集进行随机采样",
    category="数据处理",  # 必须与setup.py中定义的分类名称完全一致
    icon="icons/yourwidget.svg"  # 可选,图标路径
)
class OWDataSampler(OWWidget):
    # 可选:定义组件的可保存设置
    sample_size = Setting(10)

    # 定义输入端口
    class Inputs:
        data = widget.Input("数据集", Table)

    # 定义输出端口
    class Outputs:
        sampled_data = widget.Output("采样后数据集", Table)

    def __init__(self):
        super().__init__()
        # 初始化UI组件(如按钮、滑块等)
        self.init_ui()

    def init_ui(self):
        # 示例:添加采样大小设置滑块
        from PyQt5.QtWidgets import QSlider, QLabel
        self.slider = QSlider()
        self.slider.setRange(1, 100)
        self.slider.setValue(self.sample_size)
        self.slider.valueChanged.connect(self.on_slider_change)
        self.controlArea.layout().addWidget(QLabel("采样大小:"))
        self.controlArea.layout().addWidget(self.slider)

    def on_slider_change(self, value):
        self.sample_size = value
        # 若已有输入数据,重新采样
        if hasattr(self, "current_data"):
            self.process_data(self.current_data)

    @Inputs.data
    def set_data(self, data):
        self.current_data = data
        self.process_data(data)

    def process_data(self, data):
        if not data:
            self.Outputs.sampled_data.send(None)
            return
        # 执行采样逻辑
        sampled = data[:self.sample_size]
        self.Outputs.sampled_data.send(sampled)

四、安装与验证步骤

  1. 进入项目根目录(setup.py所在目录)
  2. 执行开发模式安装:
    pip install -e .
    
    该命令会以可编辑模式安装组件,修改代码后无需重新安装。
  3. 验证组件是否被识别:
    执行以下命令查看所有已加载的Orange组件:
    orange-canvas --list-widgets
    
    若能看到你的组件名称和分类,说明配置正确。

五、常见问题排查(针对你遇到的情况)

  • pip安装成功但Canvas中找不到组件
    1. 检查项目结构:确保组件包在orangecontrib目录下,命名空间正确。
    2. 核对setup.py的entry_points:确保orange.widgets下的模块路径正确,且widgets目录存在__init__.py。
    3. 匹配分类名称:Widget类@widget装饰器中的category必须与setup.py中定义的分类名完全一致(大小写、空格都要匹配)。
    4. 重启Orange Canvas:安装新组件后必须重启才能加载。
    5. 查看调试日志:启动Canvas时添加调试参数,排查加载报错:
      orange-canvas --log-level debug
      
      日志会显示组件加载的详细过程,根据报错信息修复问题。

内容的提问来源于stack exchange,提问作者JohnP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:05:50