从函数返回值,其中ipython小部件用于获取输入参数

时间:2016-05-26 13:47:59

标签: ipython ipywidgets

我正在尝试“widgetize”我的IPython笔记本,并遇到事件和从函数返回值的麻烦。这是我认为最好的工作流程:

  • 使用小部件获取任意函数的输入值
  • 在事件触发器上调用该函数
  • 从函数返回值

我首先尝试使用“interact”方法来调用函数,但这似乎很难关联事件和返回值。通过阅读其他交互式示例,创建课程似乎是要走的路。我不经常写课;所以希望我的错误很简单。

以下是两个小部件,当用户按下“Enter”时,应调用一个函数并将其返回值存储在类中以备将来使用。

实际上,在我输入任何文本之前它会触发该函数两次,并在我更改值时抛出'unicode对象不可调用'。



    import ipywidgets as widgets
    from IPython.display import display

    def any_function_returning_value(word1,word2):
        new_word = 'Combining words is easy: %s %s'%(word1,word2)
        print new_word
        return new_word

    class learn_classes_and_widgets():
        def __init__(self, param1 = 'a word', param2 = 'another word'):
            self.p1_text = widgets.Text(description = 'Word #1',value = param1)
            self.p2_text = widgets.Text(description = 'Word #2',value = param2)
            self.p1_text.on_submit(self.handle_submit())
            self.p2_text.on_submit(self.handle_submit())
            display(self.p1_text, self.p2_text)

        def handle_submit(self):
            print "Submitting"
            self.w = any_function_returning_value(self.p1_text.value,self.p2_text.value)
            return self.w

    f = learn_classes_and_widgets(param1 = 'try this word')
    #f.w should contain the combined words when this is all working

1 个答案:

答案 0 :(得分:2)

Oliver Ruebel通过电子邮件回答。以下是他对我的问题的修正。

on_submit的分配错误

当您调用on.submit函数时,您需要将其调用为您要调用的函数。在您的代码中,这看起来像这样。

self.p1_text.on_submit(self.handle_submit())
self.p2_text.on_submit(self.handle_submit())

但是,你所代码的是它调用self.handle_submit(因为你在函数后面包含"()"括号)然后分配返回值 该函数的值对您的提交句柄。这解释了您所看到的行为。即,在 init ()中调用该函数两次,然后调用 当事件发生时,它试图对函数返回的字符串进行操作。解决这个问题很简单,只需删除"()",即:

self.p1_text.on_submit(self.handle_submit)
self.p2_text.on_submit(self.handle_submit)

handle_submit函数签名错误

句柄提交功能必须接受窗口小部件的文本对象作为输入。即,您将获得self.p1_text或self.p2_text作为输入, 取决于哪个小部件调用它。即,你的功能应如下所示:

def handle_submit(self, text):
...

通过上述更改,一切都应该按预期工作。但是,如果您想为不同的小部件实现不同的行为 应该为不同的小部件使用不同的句柄函数,并将任何共享行为放入由句柄调用的其他函数中 功能

import ipywidgets as widgets
from IPython.display import display

def any_function_returning_value(word1,word2):
    new_word = 'Combining words is easy: %s %s'%(word1,word2)
    print new_word
    return new_word

class learn_classes_and_widgets():
    def __init__(self, param1 = 'a word', param2 = 'another word'):
        self.p1_text = widgets.Text(description = 'Word #1',value = param1)
        self.p2_text = widgets.Text(description = 'Word #2',value = param2)
        self.p1_text.on_submit(self.handle_submit)
        self.p2_text.on_submit(self.handle_submit)
        display(self.p1_text, self.p2_text)

    def handle_submit(self, text):
        print "Submitting"
        print "Text " + str(text.value)
        self.w = any_function_returning_value(self.p1_text.value,self.p2_text.value)
        return self.w

f = learn_classes_and_widgets(param1 = 'try this word')