You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kivy的for循环中为每个Label分配ID?

给循环创建的Label添加标识以便后续修改

你可以通过两种方式实现这个需求,直接看修改后的代码和说明:

方法一:利用Kivy自带的ids字典

Kivy的Widget类自带ids属性,你可以在创建Label时指定唯一的id,后续通过self.ids[id名称]直接访问对应的Label:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.metrics import dp  # 原代码漏导入了dp,必须加上


class WordLabel(GridLayout):
    def __init__(self, **kwargs):
        super(WordLabel, self).__init__(**kwargs)
        self.cols = 5
        self.rows = 6
        self.spacing = 5
        self.pos_hint = {"center_x": .5}
        for i in range(0, 30):
            label = Label(
                id=f"label_{i}",  # 给每个Label设置唯一id
                pos_hint={"center_x": 0.5},
                text=str(i+1),
                size_hint=(dp(10), dp(10)),
                color=(0, 0, 0, 1),
            )
            self.add_widget(label)
        
        # 示例:修改第3个Label的文本和颜色
        self.ids["label_2"].text = "修改后的文本"
        self.ids["label_2"].color = (1, 0, 0, 1)


class WORDOLE5App(App):
    def build(self):
        return WordLabel()  # 这里要返回WordLabel实例,原代码没写,运行会空白


WORDOLE5App().run()

方法二:自行维护Label实例字典

如果不想依赖Kivy的ids,可以在类里自己定义一个字典来存储每个Label,后续通过字典键值对访问:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.metrics import dp


class WordLabel(GridLayout):
    def __init__(self, **kwargs):
        super(WordLabel, self).__init__(**kwargs)
        self.cols = 5
        self.rows = 6
        self.spacing = 5
        self.pos_hint = {"center_x": .5}
        self.labels = {}  # 自定义字典存储Label
        for i in range(0, 30):
            label = Label(
                pos_hint={"center_x": 0.5},
                text=str(i+1),
                size_hint=(dp(10), dp(10)),
                color=(0, 0, 0, 1),
            )
            self.add_widget(label)
            self.labels[i] = label  # 将Label存入字典,用循环索引当键
        
        # 示例:修改第5个Label的文本
        self.labels[4].text = "自定义字典修改"


class WORDOLE5App(App):
    def build(self):
        return WordLabel()


WORDOLE5App().run()

注意:原代码里有两个问题必须修正才能正常运行:

  • 缺少dp的导入语句,会导致运行报错
  • WORDOLE5App类没有实现build方法返回Widget实例,运行后会显示空白窗口

内容的提问来源于stack exchange,提问作者gwadhalp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:28:14