Return 来自函数的值,其中 ipython 小部件用于获取输入参数

Return value from function where ipython widgets are used to obtain input parameters

我正在尝试 "widgetize" 我的 IPython 笔记本,但 运行 遇到了事件和 return 从函数获取值的问题。这是我认为最好的工作流程:

我首先尝试使用 "interact" 方法调用函数,但似乎很难将事件和 return 值关联起来。通过阅读其他交互式示例,制作 class 似乎是可行的方法。我不经常写 classes;所以希望我的错误很简单。

下面制作两个小部件,当用户按下 "Enter" 时应该调用一个函数并将其 return 值存储在 class 中以备将来使用。

实际上,它会在我输入任何文本之前触发该函数两次,并在我更改值时抛出 'unicode object is not callable'。



    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

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(因为您在函数后包含了“()”括号)然后分配给 return 该功能对您的提交句柄的价值。这解释了您所看到的行为。即,该函数在 init() 中被调用两次,然后 当事件发生时,它会尝试对函数 returned 的字符串进行操作。解决这个问题很简单,只需删除“()”,即:

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')