Python跨类调用方法问题:Kivy中add_widget添加组件无显示
在Kivy中调用其他类方法并解决界面不更新问题
看起来你遇到的核心问题是新建的RowsExpense实例和界面上实际显示的不是同一个——虽然控制台打印证明方法触发了,但你操作的是一个孤立的、没有被添加到界面布局树里的实例,所以add_widget()的效果自然看不到。
问题根源
你当前的代码里,每次调用RowsExpense().add_expense()都会创建一个全新的RowsExpense对象,这个对象和你之前已经添加到界面中的RowsExpense实例完全无关。你在新实例上调用add_widget(),当然不会影响到界面上的那个。
解决方案:操作已存在的界面实例
你需要获取已经挂载到界面上的RowsExpense实例,而不是每次都新建。这里有两种常见的实现方式:
方式1:通过Kivy的ObjectProperty绑定实例引用
首先在你的主布局类里定义一个ObjectProperty,用来绑定界面上的RowsExpense实例:
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.properties import ObjectProperty class MainLayout(BoxLayout): # 绑定kv文件中对应id的RowsExpense实例 rows_expense = ObjectProperty(None) def insert(self): # 调用已存在的实例的方法,而不是新建 self.rows_expense.add_expense() class RowsExpense(BoxLayout): def add_expense(self): # 这里是你创建新增行的逻辑,比如: from kivy.uix.textinput import TextInput r = TextInput(hint_text="新增行") self.add_widget(r) print("add_expense方法已触发") class DemoApp(App): def build(self): return MainLayout() if __name__ == "__main__": DemoApp().run()
然后在对应的kv文件(或者用Builder加载的字符串)里,给RowsExpense设置id并绑定到主布局的属性:
<MainLayout>: rows_expense: rows_expense # 将id为rows_expense的组件绑定到属性 orientation: 'vertical' RowsExpense: id: rows_expense # 给界面上的RowsExpense实例设置id Button: text: "OK" on_press: root.insert()
方式2:通过App的root属性获取实例
如果你的RowsExpense是主布局的直接子组件,也可以通过App.get_running_app().root来获取主布局,再找到对应的实例:
def insert(self): # 获取当前运行的App实例的根布局 root = App.get_running_app().root # 假设RowsExpense是root的第一个子组件,根据你的实际布局调整 rows_expense_instance = root.children[0] rows_expense_instance.add_expense()
关键注意点
- 确保你调用
add_expense()的RowsExpense实例,是已经被添加到界面布局中的那个,而不是新建的。 - 检查
RowsExpense的布局类型(比如BoxLayout)是否允许添加新的子控件(比如是否设置了正确的orientation)。
这样修改后,点击OK按钮时,新增的行控件就会正常显示在界面上了。
内容的提问来源于stack exchange,提问作者gunjan talwar
相关产品推荐
相关产品推荐

