动态访问Kivy文本值

时间:2017-09-18 11:07:32

标签: 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 = '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()

2 个答案:

答案 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)

输出 - 您的程序

enter image description here

示例 - 没有lambda

main.py

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

输出 - 示例

enter image description here