Python 在Kivy,为什么';t popup.disclose()是否从内存中删除弹出窗口?

Python 在Kivy,为什么';t popup.disclose()是否从内存中删除弹出窗口?,python,memory,popup,kivy,Python,Memory,Popup,Kivy,我目前正在努力解决Kivy的内存使用问题 当创建并打开一个弹出窗口时,内存使用会增加一点(这是正常的),但是当用户关闭它时(使用dislose()方法,关闭弹出窗口并将其从其父窗口中移除),内存不会被释放 因此,如果用户决定多次打开弹出窗口,程序最终将使用大量内存。下面是我代码的一部分,它通过创建、打开然后关闭弹出窗口500次来显示问题 # py file class OptionsView(Screen): def popupLoop(self): for x in

我目前正在努力解决Kivy的内存使用问题

当创建并打开一个弹出窗口时,内存使用会增加一点(这是正常的),但是当用户关闭它时(使用dislose()方法,关闭弹出窗口并将其从其父窗口中移除),内存不会被释放

因此,如果用户决定多次打开弹出窗口,程序最终将使用大量内存。下面是我代码的一部分,它通过创建、打开然后关闭弹出窗口500次来显示问题

# py file
class OptionsView(Screen):

    def popupLoop(self):
        for x in range(0, 500):
            popup = self.MyPopup()
            popup.open()
            popup.dismiss()

    class MyPopup(Popup):
        pass


# kv file
<OptionsView>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Popup Loop"
            on_press: root.popupLoop()

<MyPopup>:
    size_hint: (.6, .6)
    title: "Confirmation"
    BoxLayout:
        Button:
            text: "Cancel"
            on_press: root.dismiss()
#py文件
类选项视图(屏幕):
def popupLoop(自):
对于范围(0,500)内的x:
popup=self.MyPopup()
popup.open()
弹出
类MyPopup(弹出窗口):
通过
#kv文件
:
盒子布局:
方向:“垂直”
按钮:
文本:“弹出循环”
按:root.popupLoop()
:
尺寸提示:(.6,.6)
标题:“确认”
盒子布局:
按钮:
文本:“取消”
按:root.discouse()
按下OptionView屏幕中的“Popup Loop”(弹出循环)按钮可使程序的内存使用率从1.2%跳至11.7%(根据
顶部
)。调整窗口的大小(调用
gc.collect()
)确实会使这个数字降低一点,但仍然很高

我怎样才能防止这种情况发生?(请记住,我远非Python/Kivy专家,因此即使解决方案对您来说非常明显,请尝试向我解释!)

popup.dismission()
不会立即从内存中删除弹出窗口

也许这会有帮助

第二;关于为什么有时弹出窗口会被取消,而有时不会,您必须理解,
UI框架
需要使用事件进行编程。事件/进展不会以线性方式发生

使用
Clock

    self.pops = 0
    Clock.schedule_once(self.test_pops)

def test_pops(self, dt):
    if self.pops > 10:
        return
    self.pops += 1
    pup = self.MyPopup()
    pup.bind(on_parent=self.dismiss_pup)
    pup.open()

def dismiss_pup(self, pup, parent)
    # popup was opened, please close it now
    pup.unbind(on_parent=self.dismiss_pup)
    pup.dismiss()
    Clock.schedule_once(self.test_pops)
不过,只使用面向此的web调试器模块要简单得多


可能是CPython只是保留了内存以备将来使用。试着打开和关闭一万个弹出窗口。@Joonazan嗯,我不知道我期望的是什么。10000个弹出窗口只是使程序崩溃,没有任何错误。我可能只有4gb内存,但这种行为仍然很反常。它们是同时打开的吗?如果一次只打开一个,而程序仍然崩溃,则说明内存泄漏。这在Python中是不可能的,但是库可能有问题,或者需要调用一些函数来释放内存。@Joonazan它确实有问题:有时没有弹出窗口显示(因此我假设它们一个接一个地打开和关闭),而有时弹出窗口开始堆积,我必须手动关闭它们。但在这两种情况下,内存使用量都会爆炸,而且不会下降。我尝试将gc.collect()添加到创建/打开/关闭循环中。这明显减缓了内存使用率的上升,但它仍然达到了非常高的水平,并没有下降。我还是会检查Kivy文档,看看是否有你说的特殊功能。