gpt4 book ai didi

python - 如何从 Kivy 语言获取对象 ID 到 Python 代码

转载 作者:行者123 更新时间:2023-11-28 17:43:17 24 4
gpt4 key购买 nike

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

所以,我需要一个字符串,它以 DRY 方式标识这个小部件实例本身。

我想实现这样的目标:

在 .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 的小部件。 dictionary(这是一个特殊的字典,可以用点号查询,例如,如果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 值作为字符串获取 - 使用其父级的 ids 字典。因此,以下内容仅在 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 字典,并提取其 id 字符串。您不能直接从 init 调用 self.load_name,因为它可能还没有父级等等。所以我们将它安排在下一帧。

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

关于python - 如何从 Kivy 语言获取对象 ID 到 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com