Return 来自函数的值,其中 ipython 小部件用于获取输入参数
Return value from function where ipython widgets are used to obtain input parameters
我正在尝试 "widgetize" 我的 IPython 笔记本,但 运行 遇到了事件和 return 从函数获取值的问题。这是我认为最好的工作流程:
- 使用小部件获取任意函数的输入值
- 在事件触发时调用函数
- 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')
我正在尝试 "widgetize" 我的 IPython 笔记本,但 运行 遇到了事件和 return 从函数获取值的问题。这是我认为最好的工作流程:
- 使用小部件获取任意函数的输入值
- 在事件触发时调用函数
- 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')