我用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)
答案 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)。