我试图在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'