【发布时间】: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