Python 在Kivy,为什么';t popup.disclose()是否从内存中删除弹出窗口?
我目前正在努力解决Kivy的内存使用问题 当创建并打开一个弹出窗口时,内存使用会增加一点(这是正常的),但是当用户关闭它时(使用dislose()方法,关闭弹出窗口并将其从其父窗口中移除),内存不会被释放 因此,如果用户决定多次打开弹出窗口,程序最终将使用大量内存。下面是我代码的一部分,它通过创建、打开然后关闭弹出窗口500次来显示问题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
# 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文档,看看是否有你说的特殊功能。