Kivy中Label仅通过按钮直接调用函数时才更新,其他场景不生效问题
问题根源
核心存在2个错误:
- 每次调用
GENERATE方法时都新建了Generate类实例,你修改的是这个未被添加到界面中的新实例的label,而不是已经添加到ScreenManager中、当前正显示在页面上的Generate页面对应实例,所以界面上看不到任何变化。 - 线程定义语法错误,
target参数需要传入可调用对象,你写的target=p.getTotalPair()是直接调用了方法并把返回值传给了target,不是把方法本身交给线程执行。
修复步骤
- 不要在
GENERATE方法内新建Generate实例,直接从ScreenManager中读取已经注册好的对应实例即可 - 修正线程写法,涉及UI更新的操作需要保证在主线程执行,建议给
getTotalPair添加@mainthread装饰器 - 你之前写的
Clock.schedule_once(XRPqr().getTotalPair, 1)也存在同样的新建实例错误,需要替换为已注册的实例调用
修复后的代码示例
修正GENERATE方法
def GENERATE(self): self.sm.current = 'generate' # 从ScreenManager读取已存在的Generate页面实例,不要新建 generate_screen = self.sm.get_screen('generate') # 不需要线程的话直接调用即可 generate_screen.getTotalPair() # 如果确实需要异步读文件,修正线程写法(不要加括号): # threading.Thread(target=generate_screen.getTotalPair).start()
正确的延迟调度写法
generate_screen = self.sm.get_screen('generate') Clock.schedule_once(lambda dt: generate_screen.getTotalPair(), 1)
内容的提问来源于stack exchange,提问作者Johhny
相关产品推荐
相关产品推荐

