Kivy开发:如何在非创建屏幕中访问其他屏幕声明的对象?
解决Kivy跨屏幕访问对象的问题
嘿,我来帮你搞定这个跨屏幕访问实例的问题!在Kivy里要访问其他屏幕的对象,其实有几种简单可靠的方法,我给你一一拆解:
方法1:通过ScreenManager获取目标屏幕的属性
这种方法适合当你的obj_random是属于某个特定屏幕的实例时。
首先,你需要在创建obj_random的屏幕(比如叫Screen1)里,把它设为屏幕的类属性,这样其他屏幕就能通过ScreenManager找到这个屏幕后访问它:
class Screen1(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) # 把实例赋值给屏幕的属性 self.obj_random = CL_Random()
然后在第二个屏幕(比如Screen2)里,就可以通过self.manager拿到ScreenManager,再用get_screen()方法获取Screen1,进而访问obj_random:
class Screen2(Screen): def access_random_obj(self): # 获取ScreenManager实例 screen_manager = self.manager # 根据屏幕名称获取Screen1 screen1 = screen_manager.get_screen("screen1") # 现在就能访问obj_random了 my_random_obj = screen1.obj_random # 这里可以做你需要的操作,比如调用obj_random的方法 my_random_obj.some_method()
方法2:把实例放在App类中(全局共享)
如果这个CL_Random实例是整个应用都需要用到的,那把它放在App类里会更方便,因为Kivy的App实例是全局可获取的。
修改你的App类,把obj_random作为App的属性:
class MyKivyApp(App): def build(self): # 在这里创建实例,或者让Screen1创建后赋值给这里 self.obj_random = CL_Random() # 初始化ScreenManager和各个屏幕 sm = ScreenManager() sm.add_widget(Screen1(name="screen1")) sm.add_widget(Screen2(name="screen2")) return sm
然后在任何屏幕里,都可以通过App.get_running_app()拿到当前运行的App实例,进而获取obj_random:
from kivy.app import App class Screen2(Screen): def use_random_obj(self): app = App.get_running_app() my_random_obj = app.obj_random # 执行你的操作 print(my_random_obj.some_property)
注意事项
- 确保在访问
obj_random的时候,它已经被创建了!比如不要在Screen2的__init__方法里直接访问,因为此时Screen1可能还没完成初始化。最好在Screen2的on_enter方法(进入屏幕时触发)或者用户触发的事件(比如按钮点击)里获取实例。 - 如果用方法1,记得给每个屏幕设置唯一的
name属性,这样get_screen()才能准确找到目标屏幕。
内容的提问来源于stack exchange,提问作者Gaurav Singh
相关产品推荐
相关产品推荐

