将lambda函数绑定到按钮在for循环中不起作用

时间:2019-08-21 20:47:18

标签: python kivy

我试图在Kivy中生成按钮列表,将每个on_release事件绑定到我的Tracks类实例(存储在track_list中)的action()函数。我举了一个小例子来说明问题。前3个按钮可打印正确的数字,但它们不使用for循环...后7个按钮不起作用,它们始终显示9。

bindtest.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget

track_list = []
button_list = []


class BindTest(Widget):
    global track_list
    global button_list

    def initialize(self):
        for x in range(0, 10):
            track_list.append(Tracks(x))

        #
        # this works, and each button prints its unique 'num' when clicked
        #

        button_list.append(TrackButton())
        button_list[len(button_list) - 1].bind(on_release=lambda y: track_list[0].action())
        self.ids.buttons.add_widget(button_list[len(button_list)-1])

        button_list.append(TrackButton())
        button_list[len(button_list) - 1].bind(on_release=lambda y: track_list[1].action())
        self.ids.buttons.add_widget(button_list[len(button_list) - 1])

        button_list.append(TrackButton())
        button_list[len(button_list) - 1].bind(on_release=lambda y: track_list[2].action())
        self.ids.buttons.add_widget(button_list[len(button_list) - 1])

        #
        # this does not work. each button prints '9' when clicked
        #

        for x in range(3, 10):
            button_list.append(TrackButton())
            button_list[len(button_list)-1].bind(on_release=lambda y: track_list[x].action())
            self.ids.buttons.add_widget(button_list[len(button_list)-1])


class TrackButton(Button):
    pass


class Tracks:
    num = ''

    def action(self):
        print(self.num)

    def __init__(self, num):
        self.num = num


class BindTestApp(App):
    def build(self):
        return BindTest()


bindTest = BindTestApp()
bindTest.run()

bindtest.kv

<TrackButton>:
    text: 'button'

<BindTest>:
    __init__: root.initialize()
    BoxLayout:
        size: root.size
        id: buttons
    orientation: 'vertical'

0 个答案:

没有答案