Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单击Kivy Python时返回按钮的ID_Python_Kivy - Fatal编程技术网

单击Kivy Python时返回按钮的ID

单击Kivy Python时返回按钮的ID,python,kivy,Python,Kivy,我遇到的一个简单问题是: 当我在Kivy/Python应用程序中单击一个按钮时,我希望能够访问该按钮的ID 我尝试过各种各样的尝试和错误,但我无法理解。如果这是我的问题的一个因素,则按钮作为更大应用程序的一部分嵌套如下: FloatLayout: AnchorLayout: ScreenManager: Screen: BoxLayout: FloatLayout:

我遇到的一个简单问题是:

当我在Kivy/Python应用程序中单击一个按钮时,我希望能够访问该按钮的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)
我遇到的问题是,我甚至不知道我应该在文档中看到什么,因为我还没有完全理解术语,所以我无法找到正确的信息来学习

编辑:


传递到函数中的名称用于其他一些功能,与此问题无关。

您已经知道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()

啊,我明白了。我有很多这样的按钮——当按下按钮时,它们会调用一个弹出窗口,其中有一个选项列表,选择一个选项会替换按钮文本。每个按钮的选项都是相同的,所以我只想编写一个函数,将新文本应用于单击的按钮。目前,我对每个按钮都有一个唯一的功能,因为我使用的是硬编码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()