我用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。但是,您可以通过其父的ids字典访问具有id的小部件(这是一个特殊的字典,可以使用点表示法进行查询,例如,如果dict变量是x,并且其中包含元素“apple”,则可以使用x.apple获取其值)。
例如,如果你有in.kv:
你可以。py:
在本例中,w.ids.out0_bit3返回对CcaSwitch小部件的引用。
编辑
正如我在评论中所说的,只有一种方法可以将id值作为字符串获取——使用其父id s字典。因此,只有当CcaSwitch小部件具有父小部件(即,它不是主小部件)时,以下操作才有效:
它的作用是遍历其父级的ids dict,并提取其id字符串。不能直接从init调用self.load_name,因为它可能还没有父对象等,所以我们将其安排在下一帧。
如果小部件没有父对象,那么您就不走运了,您要么必须像以前那样做,要么如果名称不必是人类可读的,或者在不同的运行中是相同的,那么您可以在init set self.name=str(self)。
相关问题 更多 >
编程相关推荐