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

Kivy跨屏幕引用变量报错:无法获取homeScreen的name_input

问题解决方法

错误原因分析

  1. self.manager为None:TalkBot的__init__方法执行时,该屏幕还未被添加到ScreenManager中,此时self.manager尚未赋值,调用get_screen会触发报错。
  2. name_input是局部变量:homeScreen里的name_input仅为局部变量,未绑定为屏幕实例的属性,外部无法通过屏幕实例访问。
  3. text()调用错误:TextInput的文本是text属性,并非方法,不能加括号调用。

修改步骤

1. 将homeScreen中的name_input改为实例属性

在homeScreen的__init__方法里,把name_input = TextInput(...)修改为self.name_input = TextInput(...),让外部能通过屏幕实例访问这个输入框。

2. 延迟获取homeScreen实例到按钮点击时

不在TalkBot的__init__里获取homeScreen,而是放到playvid方法中执行——此时屏幕已被添加到ScreenManager,self.manager已有效。

3. 修正text属性的调用方式

把hs.name_input.text()改为hs.name_input.text。

4. 调整playvid函数的参数

on_release会传递按钮实例作为参数,内部函数的参数不要用self,避免和屏幕实例混淆。

修改后的完整代码

import kivy
kivy.require('2.2.1')
import pyttsx3
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition
from kivymd.uix.boxlayout import MDBoxLayout
from kivy.uix.video import Video
from kivy.uix.image import Image
from kivy.uix.textinput import TextInput
from kivymd.uix.button import MDRaisedButton
from kivymd.uix.label import MDLabel


class homeScreen(Screen):
    def __init__(self, **kwa):
        super().__init__(**kwa)

        # 背景渐变
        bgbox = MDBoxLayout()
        bgbox.add_widget(Image(source='background.png', allow_stretch=True, keep_ratio=False, size_hint_y=1))
        self.add_widget(bgbox)

        # 页面标题
        topic = MDLabel(text="Personal Information", font_style="H4", pos_hint = {'x': 0.03, 'y': 0.45})
        topic_info = MDLabel(text="Please input the following information. This will be used to generate your report", font_style="H6", pos_hint = {'x':0.06, 'y':0.37})
        # 姓名输入框(改为实例属性)
        name_prompt = MDLabel(text="Name:", pos_hint = {'x': 0.1, 'y': 0.3}, _text_color_str="white")
        self.name_input = TextInput(size_hint_x = 0.3, size_hint_y = 0.05, pos_hint = {'x':0.1, 'y': 0.73}, multiline = False)

        self.add_widget(topic)
        self.add_widget(topic_info)
        self.add_widget(name_prompt)
        self.add_widget(self.name_input)


class TalkBot(Screen):
    def __init__(self, **kwa):
        super(TalkBot, self).__init__(**kwa)

        bgimg = Image(source="background.png", allow_stretch=True, keep_ratio=False, size_hint_y=1)
        self.add_widget(bgimg)

        def playvid(btn):
            # 在按钮点击时获取homeScreen实例
            hs = self.manager.get_screen('homeScreen')
            name = hs.name_input.text

            bgvid = Video(source="speechvid.avi", allow_stretch=True, keep_ratio=False, size_hint_y=1, state="play")
            box.add_widget(bgvid)

            engine=pyttsx3.init()
            engine.say(f"Hello {name}, welcome to Mind Magic!")
            print(name)
            engine.runAndWait()

        btn = MDRaisedButton(text="start", pos_hint={'x':0.49, 'y':0.49}, on_release=playvid)
        self.add_widget(btn)

        box=MDBoxLayout()
        self.add_widget(box)


class MindMagic(MDApp):
    def build(self):
        self.theme_cls.material_style = "M3"
        self._app_name = "MindMagic"
        self.icon = "logo.png"
        sm = ScreenManager(transition = FadeTransition())
        # 注意:winvid类未定义,需补充该类或注释此行,否则运行会报错
        # sm.add_widget(winvid(name="winvid"))
        sm.add_widget(homeScreen(name="homeScreen"))
        sm.add_widget(TalkBot(name="talkbot"))
        return sm

if __name__ == "__main__":
    MindMagic().run()

额外说明

代码中winvid类未定义,若没有该类的实现,运行时会报错,建议补充类定义或注释掉对应的添加代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:29