2016-05-26 4 views
2

私は自分のIPythonノートブックを「ウィジェット化」しようとしています。これは私が考えているワークフローは、行くための最善の方法です。ipythonウィジェットが入力パラメータを取得するために使用される関数からの戻り値

機能 からイベントトリガ上の任意の関数の入力値
  • コール機能
  • 戻り値を取得するには、ウィジェットを使用して

    私は最初に "interact"メソッドを使って関数を呼び出そうとしましたが、イベントと戻り値を関連付けるのは難しいようでした。他のインタラクティブな例を読んでから、クラスを作ることはやり方のように思えました。私は非常に頻繁にクラスを書くことはありません。だからうまくいけば私のエラーはそこに単純なものです。

    次の2つのウィジェットを作成します。ユーザーが「Enter」を押すと、関数が呼び出され、その戻り値がクラスに格納され、後で使用できるようになります。

    実際には、テキストを入力する前に関数を2回実行し、値を変更すると 'unicode object is 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 
    
    
  • 答えて

    1

    電子メールで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を呼び出すです。これはあなたが見ている動作を説明しています。つまり、関数は、()で2回呼び出され、次に というイベントが発生したときに関数によって返された文字列を処理しようとすると、2回呼び出されます。このため修正は簡単です、単に「()」は、すなわち削除:

    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') 
    
    関連する問題