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)
四、安装与验证步骤
- 进入项目根目录(
setup.py所在目录) - 执行开发模式安装:
该命令会以可编辑模式安装组件,修改代码后无需重新安装。pip install -e . - 验证组件是否被识别:
执行以下命令查看所有已加载的Orange组件:
若能看到你的组件名称和分类,说明配置正确。orange-canvas --list-widgets
五、常见问题排查(针对你遇到的情况)
- pip安装成功但Canvas中找不到组件
- 检查项目结构:确保组件包在
orangecontrib目录下,命名空间正确。 - 核对
setup.py的entry_points:确保orange.widgets下的模块路径正确,且widgets目录存在__init__.py。 - 匹配分类名称:Widget类
@widget装饰器中的category必须与setup.py中定义的分类名完全一致(大小写、空格都要匹配)。 - 重启Orange Canvas:安装新组件后必须重启才能加载。
- 查看调试日志:启动Canvas时添加调试参数,排查加载报错:
日志会显示组件加载的详细过程,根据报错信息修复问题。orange-canvas --log-level debug
- 检查项目结构:确保组件包在
内容的提问来源于stack exchange,提问作者JohnP
相关产品推荐
相关产品推荐

