使用SplashScreen时跨.kv文件访问登录屏幕报错求助
Kivy闪屏跳转登录页面错误解决:TypeError: 'StringProperty' object is not callable
问题背景
设计应用启动闪屏,显示Logo后3秒自动跳转登录页面,闪屏和登录页面分别在独立.kv文件中,但运行时出现错误:TypeError: 'kivy.properties.StringProperty' object is not callable,无法访问登录屏幕。
错误原因分析
- 类名冲突:自定义的
ScreenManager类与Kivy内置的ScreenManager重名,导致逻辑混乱。 - 屏幕切换代码错误:
self.manager.current = login.Screen.name('login')中,Screen.name是Kivy的StringProperty属性,不是可调用方法,不能加();且当前类本身就是ScreenManager实例,无需通过self.manager访问,直接用self.current即可。 - build方法无效返回:
build方法中第一个return会终止执行,第二个return永远不会被调用,且logo.kv已通过#:include引入login.kv,无需重复加载。 - 未定义SplashScreen类:
logo.kv中使用的SplashScreen未在Python代码中定义,需改为内置Screen或自定义该类。
修正后的代码
main.py
from kivy.uix.screenmanager import ScreenManager, Screen from kivy.clock import Clock from kivymd.app import MDApp from kivy.lang import Builder # 自定义ScreenManager,避免与内置类重名 class MainScreenManager(ScreenManager): def on_enter(self, *args): # 调度3秒后执行页面切换 Clock.schedule_once(self.switch_to_login, 3) def switch_to_login(self, dt): # 直接设置当前屏幕为登录页 self.current = 'login' # 定义闪屏页面类 class SplashScreen(Screen): pass class StartPage(MDApp): def build(self): # 仅加载logo.kv,login.kv已被include return Builder.load_file('logo.kv') if __name__ == '__main__': StartPage().run()
logo.kv
#:include login.kv MainScreenManager: SplashScreen: name: 'Splash' MDLabel: text: "LOGO" pos_hint: {"center_x": 0.5, "center_y": 0.5}
login.kv
Screen: name:'login' MDLabel: text: "LOGIN" pos_hint: {"center_x": 0.5, "center_y": 0.5}
关键修正点说明
- 重命名自定义
ScreenManager为MainScreenManager,避免类名冲突。 - 定义
SplashScreen类继承自Screen,对应kv文件中的组件。 - 页面切换时直接给
self.current赋值目标屏幕的名称字符串'login',而非调用属性。 - 移除
build方法中无效的第二个return,确保仅加载一次kv文件。
内容的提问来源于stack exchange,提问作者mahsa ho3eini
相关产品推荐
相关产品推荐

