2

だから私はkivyユーザーサポート(グーグルグループ)でこの質問をしましたが、まだ返事がないので、ここで試してみます。

検索ツールに基づいて作成されたボタンのセットがあります。基本的には、ユーザーがテキスト入力ボックスに検索語を入力し、入力されたテキストに基づいて、私のプログラムがデータベースで一致する結果を検索します。一致する結果がある場合は、ボタンが作成され(一致した結果のテキストとしてそれらのテキストを使用)、これは非常にうまく機能します。しかし、私の質問は、ボタンがループで作成される場合、どのようにして個々のon_pressをコールバックに割り当てるのですか?たとえば、私の場合、コードは次のようになります。

私の.kvファイルには、textinputウィジェットがあります。

<my rule>:
    ti: Ti
    TextInput:
        id: Ti
    on_text: root.function()

私の.pyファイルには次のものがあります(さらに他のコードもあります):

t1 = ObjectProperty()
function():
    layout = StackLayout(orientation = 'lr-tb', size_hint = (0.3, 0.8), pos_hint =   {'top' : 0.87})

    root.clear_widgets() #added this so that upon user input (i.e. on_text event of textinput) only matching results create new buttons

    list_1 = ['a', 'b', 'c'] #this is a list of matching results
    root.add_widget(layout)

    for item in list_1: #this is the loop which creates the buttons
        buttons = Button(text = str(item), size_hint = (1, 0.1), background_color = [255, 0, 0, 1])
        buttons.bind(on_press = self.t1.insert_text(str(item)))                   
        layout.add_widget(buttons)

(上記のように)コールバックに割り当てられたon_pressは実際には機能しません。ユーザーがそのボタンを押すと、textinputウィジェット(self.ti1)のテキストがボタンテキストに変わることになっています(つまり、ボタンは自動入力ウィジェットとして機能します)。私は何が間違っているのですか?上記はコードの一部にすぎないことに注意してください。メインコードは本来あるべき構造になっていますが、唯一の問題は上記のスニペットにあります。
ありがとう!

4

1 に答える 1

2

イベントタイプまたはプロパティコールバックにバインドします

self.bind(x=my_x_callback, width=my_width_callback,...)

したがってxイベントまたはプロパティである必要があり、コールバック/メソッドmy_x_callbackへの参照である必要があります

my_method()とmy_methodの違いは何ですか?

コンソールでこれを実行しましょうwhat_up。次のコードのメソッドを検討してください。

python<enter>
Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def what_up():
...     return 'nothing man, same old stuff' 
... 
>>> print what_up
<function what_up at 0x7f8df8a76a28>
>>> print what_up()
nothing man, same old stuff

上記の結果からわかるように、what_up直接印刷するとメソッドへの参照が取得されますが、メソッドを呼び出すとwhat_up()関数が返すものはすべて取得され、何も返さない場合はNoneが取得されます。

関数の参照を::などの任意の変数に渡すことができます。

>>>my_up = what_up
>>> my_up()
'nothing man, same old stuff'
>>>

あなたのコードで::

buttons.bind(on_press = self.t1.insert_text(str(item))) 

関数を呼び出しています

on_press = self.t1.insert_text(str(item))

関数を渡す代わりに

on_press = partial(self.t1.insert_text, str(item))

from functools import partial事前に電話する

于 2013-01-16T16:09:14.823 に答える