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

Python递归深度超限问题求助:Kivy组件初始化触发报错

问题分析与解决办法

错误原因

  1. 递归错误触发点:ScreenMain类的__init__方法中,调用bidi()时未添加self.前缀,导致Python试图调用bidi模块(因导入了bidi.algorithm,bidi为模块对象),模块无法作为函数调用,结合Kivy内部机制引发递归调用,最终超出Python递归深度限制。
  2. KV文件未生效:Chat类的build方法仅设置了标题,未返回根部件实例,也未加载KV文件,导致KV中定义的界面无法被解析渲染。
  3. ids访问时机错误:即使修正方法调用,在__init__中直接访问self.ids.input2也可能报错,因为Kivy的ids是在KV文件解析完成后才绑定到实例的,__init__执行时ids尚未初始化。

解决步骤

1. 修正方法调用

将ScreenMain的__init__中的bidi()改为self.bidi(),确保调用类的实例方法:

class ScreenMain(Screen):
    def __init__(self,**kwargs):
        super(ScreenMain(),self).__init__(**kwargs)
        self.bidi()  # 添加self.前缀
    def bidi(self): 
        self.ids.input2.hint_text=bidi_text

2. 确保KV文件被加载并返回根部件

修改Chat类的build方法,加载KV文件并返回ScreenMain实例(替换chat.kv为你的实际KV文件名):

class Chat(App):
    def build(self):
        self.title="zockchin"
        Builder.load_file("chat.kv")  # 加载KV文件
        return ScreenMain()  # 返回根部件

3. 安全访问ids(可选但推荐)

将设置hint_text的逻辑移到on_kv_post方法中,该方法会在KV文件解析完成、ids绑定后自动调用,避免访问未初始化的ids:

class ScreenMain(Screen):
    def __init__(self,**kwargs):
        super(ScreenMain(),self).__init__(**kwargs)
    
    def on_kv_post(self, base_widget):
        # KV解析完成后执行
        reshaped_text = arabic_reshaper.reshape("ادخل النص هنا")
        bidi_text = get_display(reshaped_text)
        self.ids.input2.hint_text = bidi_text

注:可将阿拉伯文本处理逻辑移到此处,避免全局变量冗余。

4. 修复按钮绑定问题

KV文件中按钮的on_release绑定了root.click(),但ScreenMain类未定义click方法,需补充方法或删除该绑定:

Button:
    text: "Submet"
    # 补充click方法或注释该行
    # on_release:root.click()
    background_color:(1,1,1,.02)
    # ...其他属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:57:53