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

Kivy二次跳转single_chat屏幕报不存在该屏幕错误如何解决

问题原因

报错的核心原因是你覆盖了Screen类自带的name属性。
Kivy的ScreenManager是靠每个Screen实例的name属性匹配、查找屏幕的,这个值是屏幕注册时就固定的唯一标识,不能随意修改。你在SingleChat类里把name定义成了可变的StringProperty,还在on_pre_enter生命周期里把它赋值成了聊天对象的用户名:第一次跳转到单聊页时,屏幕初始name是single_chat,跳转成功后on_pre_enter触发,直接把这个屏幕的name改成了当前聊天的用户名,等于把屏幕在ScreenManager里的注册名改没了。等你第二次跳转时,ScreenManager再找叫single_chat的屏幕自然找不到,直接抛异常。

修复方法
  1. 不要占用Screen自带的name属性存业务数据
    • 给SingleChat设置固定的name值为single_chat,全程不要修改
    • 单独定义一个新的属性(比如chat_target)存当前聊天对象的用户名,替换原来所有用self.name取聊天对象的逻辑
      修改后的SingleChat核心代码如下:
class SingleChat(Screen):
    # 屏幕标识固定,不要动态修改
    name = "single_chat"
    # 单独定义属性存聊天对象
    chat_target = StringProperty("")
    chat_input = ObjectProperty(None)

    def on_pre_enter(self, *args):
        # 赋值给业务属性,不要改self.name
        self.chat_target = self.manager.get_screen("directory").ids.message.text

    def send(self):
        # ...省略其他原有逻辑...
        # 原来判断self.name的地方换成self.chat_target
        for i in chat_download:
            client_one = chat_download[i]['clients']["client_one"]
            client_two = chat_download[i]['clients']["client_two"]
            if self.chat_target == client_one or self.chat_target == client_two and new_user == client_two or new_user == client_one:
                # ...省略后续发消息逻辑...
  1. 额外优化建议
    你的message_list方法每次调用都会往self.ids.chat里重复添加聊天项组件,建议每次调用前先清空容器内已有组件,避免出现重复的聊天条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:57:48