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

Kivy类内使用变量失效求助:简化代码时功能异常

问题分析与解决方案

嘿,这问题我太熟啦!你遇到的核心问题是Python字符串的不可变性,以及你误解了变量赋值的本质——你现在的变量只是复制了控件text属性的字符串值,而不是引用控件本身,所以修改变量根本不会影响界面上的控件。

为什么你的变量方式失效?

当你写:

example_var_a = self.ids.level_one_bedroom_progress.text
example_var_b = self.ids.level_one_bedroom_text.text

这里example_var_a拿到的是控件text属性的字符串副本(比如初始的'a01')。之后你给example_var_a赋值'a02',只是改变了这个变量自己的值,完全不会触发表单控件的text属性更新——控件的text还是原来的'a01',所以后续的条件判断自然不会生效。

正确的简化方式:引用控件对象,而不是字符串值

你应该把控件本身赋值给变量,这样修改变量的text属性时,就是直接操作界面上的控件了。修改后的next_text方法如下:

def next_text(self):
    # 把控件对象赋值给变量,简化后续代码
    progress_label = self.ids.level_one_bedroom_progress
    text_button = self.ids.level_one_bedroom_text
    
    if progress_label.text == 'a01':
        text_button.text = 'Why is it that no matter how much I sleep, I always wake up tired?'
        progress_label.text = 'a02'
    elif progress_label.text == 'a02':
        text_button.text = 'But hey, at least it鈥檚 the weekend. What should I do first?'
        progress_label.text = 'a03'
    elif progress_label.text == 'a03':
        # Decision time!
        self.manager.current = 'level one bedroom choice'
    elif progress_label.text == 'a03c1':
        text_button.text = 'Do I look like a responsible adult to you?'
        progress_label.text = 'a03c1a'
    elif progress_label.text == 'a03c1a':
        # Decision time!
        self.manager.ids.level_one_bedroom_choice.ids.level_one_bedroom_choice_progress.text = 'a01a'
        self.manager.current = 'level one bedroom choice'
    elif progress_label.text == 'a03c2':
        text_button.text = 'Nothing gets your day started like a hearty brownie!'
        progress_label.text = 'a03c2a'
    elif progress_label.text == 'a03c2a':
        # Time to Move!
        text_button.text = 'To the Kitchen! Post-haste!'
        self.ids.level_one_bedroom_left_button.text = 'Kitchen'
    elif progress_label.text == 'a03c3':
        text_button.text = 'I\'m too tired for this. Back to sleep it is!'
        progress_label.text = 'a03c3a'
    elif progress_label.text == 'a03c3a':
        text_button.text = 'Goodnight World!'
        progress_label.text = 'a03cb'
    elif progress_label.text == 'a03cb':
        self.manager.current = 'game over'
        self.manager.ids.game_over.ids.game_over_text.text = 'a01'
        self.manager.ids.game_over.ids.game_over_text.text = 'And so you went to sleep.'

这样做的好处

  1. 代码更简洁:不用每次重复写冗长的self.ids.level_one_bedroom_progress和self.ids.level_one_bedroom_text
  2. 逻辑正确:变量指向的是控件对象本身,修改它的text属性会直接同步到界面上
  3. 可读性更高:变量名progress_label和text_button比ID名更直观

额外小提示

你代码里重复定义了两次StartScreen类,虽然不会导致当前问题,但最好删掉其中一个,避免潜在的混淆~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:52:07