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

2024-06-12 02:34:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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)

Tags: 文件代码nameselfid目标属性部件
1条回答
网友
1楼 · 发布于 2024-06-12 02:34:41

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

例如,如果你有in.kv:

<ExampleWidget>:
    CcaSwitch:
        id: out0_bit3
        state: 'ON'

你可以。py:

w = ExampleWidget()
print(w.ids.out0_bit3.state)

在本例中,w.ids.out0_bit3返回对CcaSwitch小部件的引用。

编辑

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

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)

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

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

相关问题 更多 >