Kivy多屏幕应用中如何跨屏幕访问类属性并获取其数值?
解决Kivy多屏幕跨实例访问属性的问题
嘿,我来帮你搞定这个跨屏幕获取属性值的问题!你的代码里出现的问题,根源在于你访问的是类属性,而不是实际运行的屏幕实例的属性。
问题分析
你在Second类里用Main.transport_price_value调用的是Main这个类本身的属性,而Kivy的NumericProperty是和具体的屏幕实例绑定的——类层面的这个属性其实是一个Property对象,不是你每次点击按钮更新的那个数值,所以返回的自然不是你想要的实际值。
几种可行的解决方案
方案1:通过ScreenManager获取Main屏幕实例
ScreenManager是所有屏幕的管理者,你可以通过它拿到Main屏幕的实际运行实例,再访问它的属性。
首先修改Second类的方法:
from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager from kivy.properties import NumericProperty class Main(Screen): transport_price_value = NumericProperty(0) def change_value_on_press(self): self.transport_price_value += 10 class Second(Screen): def display_transport_price_value(self): # 通过ScreenManager获取Main屏幕的实例 main_screen = self.manager.get_screen('main') return str(main_screen.transport_price_value) class WindowManager(ScreenManager): pass class Example(App): def build(self): return WindowManager()
然后别忘了在你的kv文件里给屏幕设置name属性(这是get_screen方法能找到实例的关键):
<WindowManager>: Main: name: 'main' # 给Main屏幕命名 Second: name: 'second' # 给Second屏幕命名 <Main>: Button: text: "增加数值并跳转" on_press: root.change_value_on_press() root.manager.current = 'second' <Second>: Button: text: "显示数值" on_press: print(root.display_transport_price_value())
方案2:通过App实例共享数据
你可以把Main屏幕的实例存在App类里,这样任何屏幕都能通过App实例访问到它:
修改Example和Second类:
class Example(App): def build(self): # 保存Main屏幕的实例到App中 self.main_screen = Main(name='main') window_manager = WindowManager() window_manager.add_widget(self.main_screen) window_manager.add_widget(Second(name='second')) return window_manager class Second(Screen): def display_transport_price_value(self): # 获取当前运行的App实例,再访问Main屏幕的属性 app = App.get_running_app() return str(app.main_screen.transport_price_value)
方案3:用Kivy属性绑定自动同步(推荐)
Kivy的属性绑定功能可以让数值自动同步,不用手动写方法获取。比如直接在kv文件里把Second屏幕的控件和Main的属性绑定:
<Second>: Label: # 直接绑定到Main屏幕的属性,数值变化时自动更新 text: str(root.manager.get_screen('main').transport_price_value)
这样你甚至不需要display_transport_price_value方法,数值会实时同步显示。
内容的提问来源于stack exchange,提问作者Bogdan
相关产品推荐
相关产品推荐

