如何从Kivy语言到Python代码中获取对象id

如何从Kivy语言到Python代码中获取对象id,python,kivy,Python,Kivy,我用Kivy语言创建了一个小部件,它有一些属性,我在这个小部件的python代码中使用了其中的一些属性。因为我在.kv文件中使用了“id”关键字,所以它们都有id。我需要在Python代码中使用相同的ID。以下是解决方法: CcaSwitch: id: out0_bit3 name: "out0_bit3" 我在python代码中使用self.name代替self.id。如果没有每个小部件的“重复”条目,我如何实现相同的目标 谢谢 编辑 我在Python代码中使用“name”变

我用Kivy语言创建了一个小部件,它有一些属性,我在这个小部件的python代码中使用了其中的一些属性。因为我在.kv文件中使用了“id”关键字,所以它们都有id。我需要在Python代码中使用相同的ID。以下是解决方法:

CcaSwitch:
    id: out0_bit3
    name: "out0_bit3"
我在python代码中使用self.name代替self.id。如果没有每个小部件的“重复”条目,我如何实现相同的目标

谢谢

编辑 我在Python代码中使用“name”变量,如下所示:

class CcaSwitch(BoxLayout):

    name = StringProperty()

    def __init__(self, *args, **kwargs):
        # ...
        Clock.schedule_interval(self.refresh, 5)

    def refresh(self, dt):
        self.comm.publish(get_bool_status(self.name), self.routing_key)
所以,我需要一个字符串,它以一种干燥的方式标识这个小部件实例本身

我想实现这样的目标:

在.kv文件中:

CcaSwitch:
    id: out0_bit3
在Python中,我希望使用它,如:

 class CcaSwitch(BoxLayout):

    def __init__(self, *args, **kwargs):
        # ...
        self.name = self.id.__name__
        Clock.schedule_interval(self.refresh, 5)

    def refresh(self, dt):
        self.comm.publish(get_bool_status(self.name), self.routing_key)

您不会说为什么需要在python中使用这些ID。但您可以通过其父词典访问具有id的小部件(这是一个特殊的词典,可以使用点符号进行查询,例如,如果dict变量是x,并且其中包含元素“apple”,则可以使用x.apple获取其值)

因此,对于您的示例,如果您有in.kv:

<ExampleWidget>:
    CcaSwitch:
        id: out0_bit3
        state: 'ON'
w、 在本例中,ids.out0_bit3返回对该CcaSwitch小部件的引用

编辑

正如我在评论中所说,只有一种方法可以将id值作为字符串获取——使用其父项的ids字典。因此,只有当CcaSwitch小部件有一个父小部件(即,它不是主小部件)时,以下内容才会起作用:

它所做的是遍历其父项的ids dict,并提取其id字符串。您不能直接从init调用self.load_name,因为它可能还没有父对象等。因此我们将其安排在下一帧


如果小部件没有父项,那么你就倒霉了,你要么必须像以前那样做,要么如果名称不必是人类可读的,或者在不同的运行中是相同的,那么你可以在init set self.name=str(self)中创建小部件。

我不在python代码中创建小部件,它们都是自动创建的。我需要获取“out0\u bit3”字符串,因为此小部件使用id通过网络自动发送和接收一些数据。因为我正在为.kv文件的“id:…”部分键入此id,所以在通过网络获取数据时,我可能会使用相同的东西进行查询。假设我在sql查询中使用此id。您确定要将id用作字符串吗,而不是id变量的值?可能会显示更多示例代码(在python中您希望如何使用它(而不是名称)以及在kv中您在何处使用id),因为在python中,父项中的ids字典实际上是唯一可以将id作为字符串获取的方法。是的,我确信我正在将id作为字符串使用。我按照你的意愿编辑了我的第一篇文章。我感谢你的帮助,但是没有运气。您给出的最后一个代码对我不起作用。尽管self.parent.children给出了正确的子树,但self.parent.ids是一个空列表。我必须利用我的变通方法,继续前进。也许这更合适,因为小部件的查询id(名称)可能会随着时间的推移而改变,但会有一个静态id,用于在其他小部件之间交换数据。顺便说一句,schedule_once()是一个很好的技巧,解决了我不同的问题。非常感谢。
w = ExampleWidget()
print(w.ids.out0_bit3.state)
class CcaSwitch(Widget):

    name = ''

    def __init__(self, *args, **kwargs):
        super(CcaSwitch, self).__init__(**kwargs)
        Clock.schedule_once(self.load_name)
        Clock.schedule_interval(self.refresh, 5)

    def load_name(self, *l):
        for id_str, widget in self.parent.ids.iteritems():
            if widget.__self__ is self:
                self.name = id_str
                return

    def refresh(self, dt):
        self.comm.publish(get_bool_status(self.name), self.routing_key)