在Kivy中,为什么popup.dismiss()没有从内存中删除弹出窗口?

时间:2015-10-12 18:15:51

标签: python memory popup kivy

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

当创建并打开弹出窗口时,内存使用率会上升一点(这是正常的),但是当用户关闭它时(使用dismiss()方法关闭弹出窗口并将其从父窗口中删除),记忆未被释放。

因此,如果用户决定多次打开弹出窗口,程序最终将使用大量内存。以下是我的代码的一部分,通过创建,打开然后解除弹出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()

按下OptionView屏幕中的“弹出循环”按钮会使程序从1.2%的内存使用率跳至11.7%(根据top)。调整窗口大小(调用gc.collect())确实会使这个数字下降一点,但它仍然很高。

如何防止这种情况发生? (请记住,我远不是Python / Kivy专家,所以即使解决方案对您来说非常明显,请尝试向我解释!)

1 个答案:

答案 0 :(得分:1)

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

也许这有助于How to force deletion of a python object?

二;为什么有时为什么你的弹出窗口会被解雇,有时候他们不会,你必须明白UI frameworks需要使用事件进行编程。事件/进展不是以线性方式发生的。

Kivy events loop

更好地测试您要检查的内容将使用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调试器模块会更简单。

http://kivy.org/docs/api-kivy.modules.webdebugger.html