python - Kivy ids 通过使用不工作的字符串改变
问题描述
我有很多不同的标签,上面会有不同的数字。我正在创建一个正在运行的应用程序,您可以在其中写下您每天运行的次数。但是由于某种原因,像下面这样动态地进行操作是行不通的。我需要创建某种 id 对象吗?
def mileageinput(self, mileagevalue):
global curmileage
global runs
try:
curmileage = float(mileagevalue)
runs[activeday] = curmileage
calendar = self.manager.get_screen('calendar')
label = "mileagerun" + str(activeday)
print(label)
# Changing the identifier like this isn't working:
# calendar.ids.label.text = str(curmileage) + " miles"
# This works, but I have tons of different labels and I want it
# to work dynamically:
calendar.ids.mileagerun2.text = str(curmileage) + " miles"
except:
curmileage = 0
解决方案
您已注释掉的行正在尝试访问id
named label
,但您想访问id
其名称是变量值的label
。
ids
可以通过点表示法或括号中的索引访问 - 也就是说,ids.foo
与 相同ids['foo']
,在这种情况下后者更容易使用它。尝试这个:
calendar.ids[label].text = str(curmileage) + " miles"
(请注意,这是ids[label]
,不是ids['label']
。后者等同于您当前的代码。)
为了完整起见,这里还有另一种方法。ids
为了您的方便,Kivy 有意提供两种方式。但是,如果您正在使用其他东西,那只能作为属性使用,而不是作为索引呢?假设在下面的代码之后,您想以某种方式menu.spam
动态检索 的值,使用 的值item
。
menu = object()
menu.spam = False
menu.eggs = True
item = 'spam'
这样做的方法是使用内置函数getattr
:
print(getattr(menu, item))
>>> False
因此,您的代码也可以使用:
getattr(calendar.ids, label).text = str(curmileage) + " miles"
在这种情况下,我认为第一个选项更具可读性,但getattr
在其他类似情况下很高兴了解。
最后一点:您可能会喜欢尝试f-strings,它可以更方便地将变量插入字符串。例如,str(curmileage) + " miles"
可以改为:
f"{curmileage} miles"
它会自动为您处理将事物转换为字符串,并且您可以根据需要将任意数量的变量全部插入到同一个字符串中。
推荐阅读
- html - 选中的复选框不会向数据库发送布尔值
- python - 在 OpenCV 中更改通道顺序可防止绘制矩形
- redirect - Weblogic将https重定向到http
- c++ - std::unique_ptr 可以被认为是一个单子吗?
- apache-flink - Flink 中的算子是什么?操作员状态和键控状态有何不同?
- javascript - 为每一行附加一个带有链接的按钮
- mysql - 相同的 SQL 查询在不同的服务器上花费更多时间
- reporting-services - 减少SSRS中同一组的条形图中条形之间的空间
- java - Android - openFileInput() NullPointerException
- vue.js - 无法在另一个组件内的组件中显示来自 vue 实例的数据