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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:01