如何从子小部件更新根小部件的 kivy ListProperty?

How to update a kivy ListProperty of root widget from a child widget?

我的应用程序中有以下 kivy 布局

ABC:

<ABC>:

    BoxLayout:
    orientation: 'vertical'

    Label:
        text: str(root.current_cell)

    GridLayout:
        id: grid
        cols: 10

网格布局的内容在Python代码中动态生成

class ABC(BoxLayout):
    current_cell = ListProperty([0, 0])
    
    def on_size(self, *args):
        self.draw_grid()

    def draw_grid(self):
        for i in range(10):
            for j in range(10):
                self.ids.grid.add_widget(Cell(cell_id=[i, j]))

Cell 小部件是 TextInput 小部件的子部件

class Cell(TextInput):
    def __init__(self, cell_id, **kwargs):
        super().__init__(**kwargs)
        self.cell_id = cell_id

    def _on_focus(self, instance, value, *largs):
        if value:
            ABC.current_cell = self.cell_id # Issue is here
        return super()._on_focus(instance, value, *largs)

当用户聚焦网格中的任何单元格时,它应该更新 ABC.current_cell,这反过来会更新布局中的标签文本。上面的代码不起作用。我是 kivy 的新手,所以很难理解哪里出了问题。提前致谢!

嗯,首先你需要将引用从 ABC class 传递到 Cell class 并稍后修改它。

小例子:

class ABC(BoxLayout):
    current_cell = ListProperty([0, 0])
    def draw_grid(self):
        add = self.ids.grid.add_widget             
        add(Cell(abc=self, cell_id=[i, j]))

class Cell(TextInput):
    def __init__(self, abc, cell_id):
        self.abc = abc
        self.cell_id = cell_id

    def _on_focus(self):
        self.abc.current_cell = self.cell_id