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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:40:29