我正在尝试“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
答案 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')