Kivy读取文件内容赋值给StringProperty时出现类型错误求助
问题解决:Kivy中StringProperty赋值报错类型不匹配
错误原因分析
触发ValueError: Screen1.usename accept only str的核心问题是未调用函数,直接将函数对象赋值给了StringProperty。在kv代码的按钮on_release事件里,root.gb是函数本身,并非函数执行后的返回值,类型自然不符合StringProperty要求的字符串格式。
另外还有两处细节问题:
- 文件读取后未手动关闭,可能导致资源泄漏,建议用
with语句自动管理文件生命周期 - 变量名拼写不一致:Screen1中的
usename与Screen2的username,容易引发逻辑混淆
修正后的代码
from kivy.app import App from kivy.uix.screenmanager import Screen from kivy.lang import Builder from kivy.properties import StringProperty class Screen1(Screen): def gb(self): # 使用with语句自动关闭文件,避免资源泄漏 with open('test.txt', 'r') as f: b = f.read() # read()本身返回字符串,str()可省略,保留也不影响 t = str(b) return t # 统一变量名为username,与Screen2保持一致 username = StringProperty("") class Screen2(Screen): username = StringProperty("") root = Builder.load_string(''' <Screen1>: BoxLayout: orientation: "vertical" Button: text:'ue' # 修复:调用函数root.gb()而非直接赋值函数对象 on_release: root.username = root.gb(); root.manager.current = "screen2" <Screen2>: name: "screen2" Label: text: root.username ScreenManager: Screen1: id: loginscreen Screen2: username: loginscreen.username ''') class MyApp(App): def build(self): return root r=MyApp() r.run()
关键修改点
- 函数调用修正:将
root.usename = root.gb改为root.username = root.gb(),确保执行函数并获取返回的字符串 - 文件操作优化:用
with open(...) as f替代直接open,自动关闭文件,避免资源泄漏 - 变量名统一:把Screen1的
usename改为username,与Screen2的变量名保持一致,减少拼写错误风险
内容的提问来源于stack exchange,提问作者rahul Patel
相关产品推荐
相关产品推荐

