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

时间:2014-02-08 18:29:39

标签: python kivy

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

1 个答案:

答案 0 :(得分:2)

你没有说为什么你需要在python中使用这些id。但是您可以通过其父{4}字典访问具有id的窗口小部件(这是一个可以使用点表示法查询的特殊字典,例如,如果dict变量是x,并且其中包含元素'apple' ,你可以用x.apple获得它的价值。

所以对于你的例子,如果你有.kv:

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

你可以.py:

w = ExampleWidget()
print(w.ids.out0_bit3.state)
在这种情况下,

w.ids.out0_bit3返回对该CcaSwitch小部件的引用。

修改

正如我在评论中所说,只有一种方法可以将id值作为字符串使用 - 使用其父级的id字典。因此,只有当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)

它的作用是通过其父级的id字典,并提取其id字符串。你不能直接从init调用self.load_name,因为它可能还没有父等等。所以我们为下一帧安排它。

如果小部件没有父级,那么你运气不好,要么你必须像以前那样做,或者如果名称不必是人类可读或不同的运行,你可以在init设置self.name = str(self)。