如何从子小部件更新根小部件的 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
我的应用程序中有以下 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