首页 > 解决方案 > 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

标签: pythonkivy

解决方案


您已注释掉的行正在尝试访问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"

它会自动为您处理将事物转换为字符串,并且您可以根据需要将任意数量的变量全部插入到同一个字符串中。


推荐阅读