【问题标题】:Unable to get a reference to a certain object inside another class无法在另一个类中获取对某个对象的引用
【发布时间】:2021-01-14 12:50:47
【问题描述】:

所以我正在尝试使用 python 和 kivy 创建一个应用程序。我在这里创建了一个充当我的数据库的类:

class database():
    Links = ['www.example.com', 'www.youtube.com']

    #Adds the new link to the Links list and then saves the list at Links.txt
    def SaveLinks(self, L):
        try:
            self.Links.append(L)
            with open("Links.txt", "w") as f:
                json.dump(self.Links, f)
                f.close()
            return 0
        except:
            print("Error saving the data")
            return -1

但我需要一些屏幕才能与数据库类交互,以便我可以将数据添加到列表中。所以在做了一些研究之后,我找到了一种可能的(?)方法来使用垃圾收集器库。我在屏幕的类中创建了一个函数,并将一个按钮从它绑定到 Save 函数:

class AddLinksScreen(Screen):

    def Save(self):
        for obj in gc.get_objects():
            if isinstance(obj, database):
                obj.SaveLinks(self.ids.TextI.text) 

当我在 textinput 中输入文本并按下按钮时,我收到以下错误:

Exception has occurred: ReferenceError
weakly-referenced object no longer exists

所以很明显我做错了事。如果我只是绕过 gc 并输入对象的名称,我没有问题。但问题是我希望能够在不知道对象名称的情况下找到它。这是我尝试过的,它奏效了:

class AddLinksScreen(Screen):

    def Save(self):
        Databaseobj1.AddLink(self.ids.TextI.text)

Databaseobj1 是database() 类的类实例

任何帮助将不胜感激

【问题讨论】:

  • 目前尚不清楚您到底想做什么,但是绝对没有必要使用垃圾收集器来查找对您的对象的引用。您如何创建 database 的实例,而您自己还没有保存对它的显式引用?
  • 我在 App().run() 命令之前创建对象。像这样: if name == 'main': D1 = database() eclassApp().run()
  • 在没有看到更多代码的情况下(也不是很熟悉kivy),我建议需要将D1 作为参数传递给eclassApp
  • 根据 eclassApp 的定义位置,D1 可以作为全局变量使用,但最好将数据库作为显式参数提供给应用程序。
  • 我只是尝试将它作为参数传递,它按我想要的方式工作!这肯定是比我更好的方法。非常感谢。

标签: python python-3.x class kivy


【解决方案1】:

您的数据库类需要有一个构造函数,并且您必须在其中定义 Links 变量:

class database():
    def __init__(self):
        self.Links = ['www.example.com', 'www.youtube.com']

因为你定义它的方式,它是一个全局变量,你不能用 self.Links 引用它。

【讨论】:

  • 感谢您的关注。我是新来的课程,我可以很容易地把事情搞砸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 2021-11-09
  • 2012-06-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多