Kivy按钮循环绑定on_press来回调

时间:2013-01-15 00:17:43

标签: kivy

所以我在kivy用户支持(google groups)上提出了这个问题,但还没有得到任何回复,所以我会在这里试试。

我有一组基于搜索工具创建的按钮。基本上它的工作方式是用户在textinput框中输入搜索词,并根据输入文本,我的程序在数据库中搜索匹配的结果。如果有任何匹配的结果,则创建按钮(其文本作为匹配结果的文本),这非常有效。但我的问题是当循环中创建按钮时,如何将其个体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)中的文本应该改变为按钮文本(即按钮用作自动填充小部件)。我究竟做错了什么? 请注意,上面只是代码的一部分。主要代码的结构应该是,唯一的问题在于上面的代码片段 谢谢!

1 个答案:

答案 0 :(得分:2)

Bind 事件类型或属性 回调

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

因此x应为eventproperty,而my_x_callback必须是对callback/method的引用

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(),你得到函数返回的任何内容或如果没有返回任何内容,则为无。

您可以将函数的引用传递给任何变量,如::

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