我无法找到应该是简单的事情的答案。我正在尝试按下它时按钮显示自己的文本值。例如,当我按下“项目1”时,它应该打印出“项目1”,依此类推。目前我得到的“第3项”打印出来是可以理解的,因为它是最后一个循环,但有没有办法改变行为。请协助:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class test(BoxLayout):
orientation = 'vertical'
def __init__(self, **kwargs):
super(test, self).__init__(**kwargs)
def reload(self, instance):
print(button.text)
myList = ['item 1', 'item 2', 'item 3']
t = 0
for x in myList:
button = Button(text=myList[t], on_press=lambda instance: reload(button.text, instance))
self.add_widget(button)
t += 1
class MyApp(App):
def build(self):
return test()
if __name__ == '__main__':
MyApp().run()
答案 0 :(得分:1)
你可以像我在下面那样使用lambda。
Button(text=myList[t], on_press=lambda a: print(a.text))
整个代码
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class test(BoxLayout):
orientation = 'vertical'
def __init__(self, **kwargs):
super(test, self).__init__(**kwargs)
myList = ['item 1', 'item 2', 'item 3']
for item in myList:
button = Button(text=item, on_press=lambda a: print(a.text))
self.add_widget(button)
class MyApp(App):
def build(self):
return test()
if __name__ == '__main__':
MyApp().run()
此外,我使用枚举更改了你的for循环更符合python惯例。
答案 1 :(得分:1)
您始终会打印“第3项”,因为您的重新加载方法始终引用创建的最后一个按钮。要解决此问题,您需要将“ button.text ”替换为“ instance.text ”,如图所示在下面的代码段中。有关详细信息,请参阅下面的示例(不使用lambda)。
替换:
def reload(self, instance):
print(button.text)
使用:
def reload(self, instance):
print(instance.text)
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class Test(BoxLayout):
orientation = 'vertical'
def __init__(self, **kwargs):
super(Test, self).__init__(**kwargs)
myList = ['item 1', 'item 2', 'item 3']
for x in myList:
button = Button(text=x, on_press=self.reload)
self.add_widget(button)
def reload(self, instance):
print(instance.text)
class MyApp(App):
def build(self):
return Test()
if __name__ == '__main__':
MyApp().run()