单击Kivy Python时返回按钮的ID

时间:2017-03-16 17:46:11

标签: python kivy

我遇到的简单问题:

当我点击我的Kivy / Python应用程序中的按钮时,我希望能够访问该按钮的ID。

# Kivy code

Button:
    id: position_1
    on_press: app.access_button_id()

我有各种尝试和错误尝试,但我无法弄清楚。该按钮嵌套如下(作为更大的应用程序的一部分),如果这是我的问题的一个因素:

FloatLayout:
    AnchorLayout:
        ScreenManager:
            Screen:
                BoxLayout:
                    FloatLayout:
                        Button:
                            id: position_1
                            on_press: app.access_button_id()

这是我的Python代码,它返回所有id。那跟我一样接近:

# Python code

def access_button_id(name):
    print(self.root.ids)

我遇到的问题是我甚至不知道我应该在文档中看到什么因为我还没有完全理解术语,所以我找不到正确的信息来学习。

编辑:

传递给函数的(名称)是针对某些其他功能的,与此问题无关。

1 个答案:

答案 0 :(得分:1)

你已经知道了id - 你自己设置了它。这些主要用作代码中的硬编码值:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder


Builder.load_string('''
<MyWidget>:
    Button:
        id: id_value_1
        text: 'Print my id'
        on_press: print({'id_value_1': self.proxy_ref})
    Button:
        id: id_value_2
        text: 'Print all ids'
        on_press: print(root.ids)
''')


class MyWidget(BoxLayout):
    pass


class MyApp(App):
    def build(self):
        widget = MyWidget()
        print({'id_value_1': widget.ids['id_value_1']})
        return widget


if __name__ == '__main__':
    MyApp().run()

如果您已经有权访问,为什么还需要按钮的ID?你想要完成什么?

修改

评论中提到的问题的示例解决方案:

import random
import functools

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.lang import Builder


Builder.load_string('''
<MyWidget>:
    Button:
        text: 'B1'
        on_press: root.open_popup(self)
    Button:
        text: 'B2'
        on_press: root.open_popup(self)
''')

class MyWidget(BoxLayout):
    def open_popup(self, caller):
        fun = functools.partial(self.rename, caller)
        popup = Popup(
            title='Test popup',
            content=Button(
                text='rename',
                on_press=fun
            ),
            size_hint=(None, None), size=(400, 400)
        )
        popup.open()

    def rename(self, caller, *args):
        caller.text = ''.join(chr(random.randint(48, 90)) for i in range(5))


class MyApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyApp().run()