首页 > 解决方案 > 橙色小部件开发:如何遍历 gui 小部件标签以显示计算输出

问题描述

我正在尝试使用 Orange 创建一个简单的小部件。它计算给定数据输入的平均值,但我不确定如何遍历 gui 小部件标签以在小部件框中显示每个实例,当它上传到 Orange 时。

import Orange
import Orange.data
from Orange.widgets.widget import OWWidget, Input, Output
from Orange.widgets import gui

class OWtest(OWWidget):
name = "Mean Data"
description = "Mean of data attributes"
#icon = ".svg"
priority = 20

class Inputs:
    data = Input("Data", Orange.data.Table)

class Outputs:
    infoData = Output("Info Data", Orange.data.Table)

want_main_area = False

def __init__(self):
    super().__init__()
    box = gui.widgetBox(self.controlArea, "Info")
    self.line_a = gui.widgetLabel(box, 'No data present')

@Inputs.data
def set_data(self, dataset):
    if dataset is not None:
        for d in dataset:
            print(d)        
        average = lambda x: sum(x)/len(x)
        for x in dataset.domain.attributes:
            self.line_a.setText("%s %.2f" % (x.name, average([d[x] for d in dataset]))) 
            print("%s %.2f" % (x.name, average([d[x] for d in dataset]))) 

目前它只在小部件框中显示一行,我只定义了self.line_a。

我将如何循环创建和显示多个小部件标签以适应平均计算产生的输出?我不确定循环适合的位置,还是我缺少一个简单的步骤?我一直在查看文档并尝试解决问题,但似乎无法使其正常工作。

标签: pythonpython-3.xloopsorange

解决方案


首先构造完整的字符串,然后将其设置为line_a文本应该可以解决问题:

        text = '\n'.join("%s %.2f" % (x.name, average([d[x] for d in dataset]))
                         for x in dataset.domain.attributes)
        self.line_a.setText(text)

推荐阅读