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.'
这样做的好处
- 代码更简洁:不用每次重复写冗长的
self.ids.level_one_bedroom_progress和self.ids.level_one_bedroom_text - 逻辑正确:变量指向的是控件对象本身,修改它的
text属性会直接同步到界面上 - 可读性更高:变量名
progress_label和text_button比ID名更直观
额外小提示
你代码里重复定义了两次StartScreen类,虽然不会导致当前问题,但最好删掉其中一个,避免潜在的混淆~
内容的提问来源于stack exchange,提问作者immeeh
相关产品推荐
相关产品推荐

