如何在Kivy中创建可被所有屏幕访问和修改的Python变量?
解决Kivy跨屏幕变量共享与文本更新问题
问题需求
创建一个可被某一屏幕修改的变量,该变量能改变其他屏幕的文本内容:点击MainWindow中的任意按钮,变量value被修改为1或2,切换至SecondWindow后显示文本“successfully printed x”(x为value的取值)。
原代码问题分析
- 全局定义的
value不属于任何可被屏幕访问的实例(如ScreenManager或App),无法实现跨屏幕的属性绑定与监听 - MainWindow的方法中传入的
root是MainWindow自身,并非ScreenManager,导致修改的对象错误 - SecondWindow的Label文本拼接语法错误,且未正确指向共享变量
修正后的代码
Python文件(testing.py)
from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import Screen, ScreenManager from kivy.properties import NumericProperty class MainWindow(Screen): def set_value(self, manager, val): manager.value = val class SecondWindow(Screen): pass class WindowManager(ScreenManager): value = NumericProperty(0) # 将共享变量定义在ScreenManager中 kv = Builder.load_file("testing.kv") class testing(App): def build(self): return kv if __name__ == "__main__": testing().run()
KV文件(testing.kv)
WindowManager: MainWindow: SecondWindow: <MainWindow>: name: "main" GridLayout: size: root.width, root.height rows: 2 Button: text: "print 1" on_release: root.set_value(app.root, 1) app.root.current = "second" Button: text: "print 2" on_release: root.set_value(app.root, 2) app.root.current = "second" <SecondWindow>: name: "second" Label: # 拼接字符串并将数值转为字符串类型 text: "successfully printed " + str(app.root.value)
关键说明
- 将共享变量
value定义在WindowManager类中,因为它是所有屏幕的父容器,所有屏幕都能通过app.root访问到它 - MainWindow的方法接收ScreenManager实例和要设置的值,直接修改其
value属性 - SecondWindow的Label通过
app.root.value获取共享变量,并用str()将数值转为字符串后完成文本拼接,确保显示格式正确
内容的提问来源于stack exchange,提问作者Raka Wiratama
相关产品推荐
相关产品推荐

