You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:22:31