Python 动态访问Kivy文本值

Python 动态访问Kivy文本值,python,kivy,Python,Kivy,我找不到一个简单问题的答案。我试图在按下按钮时使其显示自己的文本值。例如,当我按下“项目1”时,它应该打印出“项目1”等等。现在我可以理解地打印出“第3项”,因为这是最后一个循环,但有没有办法改变行为。请协助: from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button class test(BoxLayout): orientation =

我找不到一个简单问题的答案。我试图在按下按钮时使其显示自己的文本值。例如,当我按下“项目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()

你可以像我下面做的那样使用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()

此外,我使用enumerate更改了for循环,使其更符合python约定。

您可以使用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()
此外,我使用enumerate更改了for循环,使其更符合python约定。

您总是打印“Item 3”,因为您的重载方法总是引用最后创建的按钮。要更正此问题,需要将“按钮.text”替换为“实例.text”,如下面的代码段所示。有关详细信息,请参考下面的示例(不使用lambda)

一小条 替换:

def reload(self, instance):
    print(button.text)
与:

输出-您的程序

示例-不带lambda main.py 输出-示例

您总是打印“项目3”,因为您的重新加载方法总是引用上次创建的按钮。要更正此问题,需要将“按钮.text”替换为“实例.text”,如下面的代码段所示。有关详细信息,请参考下面的示例(不使用lambda)

一小条 替换:

def reload(self, instance):
    print(button.text)
与:

输出-您的程序

示例-不带lambda main.py 输出-示例

它可以工作,但这是一个相当复杂的方法,因为我需要在“test”类中使用文本值,但我无法获取,很抱歉,我是kivy的新手。这是唯一的方法吗?不是,我认为我的更新答案提供了一个更好的解决方案。它有效,但这是一个相当复杂的方法,因为我需要在我的“测试”类中使用文本值,我无法获得,抱歉,我是kivy的新手。这是唯一的方法吗?不是,我认为我的更新答案提供了一个更好的解决方案。谢谢两个答案都很好,我将只添加第一个作为答案,然后向上投票另一个谢谢两个答案都很好,我将只添加第一个作为答案,然后向上投票另一个