我目前正在努力解决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专家,所以即使解决方案对您来说非常明显,请尝试向我解释!)
答案 0 :(得分:1)
popup.dismiss()
不会立即从内存中删除弹出窗口。
也许这有助于How to force deletion of a python object?
二;为什么有时为什么你的弹出窗口会被解雇,有时候他们不会,你必须明白UI frameworks
需要使用事件进行编程。事件/进展不是以线性方式发生的。
更好地测试您要检查的内容将使用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调试器模块会更简单。