引用错误:弱引用对象不再存在。

4
我有两个文件:test.pytest.kv。当我从.kv文件中调用insert_update_account()函数时,会出现错误:
File "kivy/weakproxy.pyx", line 30, in kivy.weakproxy.WeakProxy.__getattr__ (kivy/weakproxy.c:1144)
   File "kivy/weakproxy.pyx", line 26, in kivy.weakproxy.WeakProxy.__ref__ (kivy/weakproxy.c:1043)
 ReferenceError: weakly-referenced object no longer exists<br/>

如果我在insert_update_account()函数中注释掉self.display_account()这一行,则不会出现错误。

test.py

import kivy

kivy.require('1.9.0')  # replace with your current kivy version !
import sqlite3 as lite
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty
from kivy.lang import Builder

from kivy.core.window import Window
Window.maximize()


con = lite.connect('test.db')
#con = lite.connect(path + 'fact.db')
con.text_factory = str
cur = con.cursor()

class MainMenu(BoxLayout):


    def display_account(self):
        self.dropdown.dismiss()
        self.remove_widgets()
        self.rvaccount = TEST()
        self.content_area.add_widget(self.rvaccount)
        self.cur.close()
        self.con.close()

    def insert_update_account(self, obj):
        cur.execute("UPDATE table SET test1=?, test2=? WHERE test3=?",
                    (obj.col_data[1], obj.col_data[2], obj.col_data[0]))
        con.commit()
        self.display_account()


class TEST(BoxLayout):
    data_items = ListProperty([])
    col1 = ListProperty()
    col2 = ListProperty()

    mode = StringProperty("")

    def __init__(self, **kwargs):
        super(TEST, self).__init__(**kwargs)
        self.get_data()

    def update(self):
        self.col1 = [{'test1': str(x[0]), 'test2': str(x[1]), 'key': 'test1'} for x in self.data_items]
        self.col2 = [{'test1': str(x[0]), 'test2': str(x[1]), 'key': 'test2'} for x in self.data_items]


    def get_data(self):

        cur.execute("SELECT * from table")
        rows = cur.fetchall()
        print(rows)
        i = 0
        for row in rows:
            self.data_items_city.append([row[0], row[1], i])
            i += 1
        print(self.data_items_city)
        self.update()

class TestApp(App):
    title = "test"

    def build(self):
        self.root = Builder.load_file('test.kv')
        return MainMenu()



if __name__ == '__main__':
    TestApp().run()

有人能帮我吗?


我认为你所遇到的问题在于每次显示账户时都执行close(),另外,在你的类中__init__方法在哪里呢? - ddor254
没有init也没关系,因为BoxLayout有一个init方法。 - PalimPalim
@ddor254,我在每次查询执行后都关闭了数据库连接,但仍然显示错误。 - Nirdesh Kumawat
我猜你想使用的是insert_update_account方法中已经被移除的内容。 - Simon Mengong
1个回答

2
在你的类MainMenu中,似乎混淆了光标cur和连接con,因为你在全局范围内定义了它们,并且在类的作用域内也使用了相同的名称。因此,这可能是因为变量在代码中被自由混合而发生的。
你应该尝试在MainMenu类中显式获取连接和光标。像下面这样做可以确保每次获取新的连接,并且你的代码不会将变量混合到作用域之外。
class MainMenu(BoxLayout):

    def __init__(self):
        super(MainMenu, self).__init__(self)
        self.con = lite.connect('test.db')
        self.cur = con.cursor()

    def display_account(self):
        self.dropdown.dismiss()
        self.remove_widgets()
        self.rvaccount = TEST()
        self.content_area.add_widget(self.rvaccount)
        self.cur.close()
        self.con.close()

    def insert_update_account(self, obj):
        self.cur.execute("UPDATE table SET test1=?, test2=? WHERE test3=?",
                    (obj.col_data[1], obj.col_data[2], obj.col_data[0]))
        self.con.commit()
        self.display_account()

谢谢您的回复。但是它会出现错误 sqlite3.ProgrammingError: 无法对已关闭的游标进行操作。 - Nirdesh Kumawat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接