gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:41 25 4
gpt4 key购买 nike

我目前正在努力解决 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 屏幕中按下“Popup Loop”按钮会使程序从 1.2% 的内存使用率跳到 11.7%(根据 top)。调整窗口大小(调用 gc.collect())确实会使这个数字降低一点,但它仍然很高。

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

最佳答案

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

也许这会有所帮助 How to force deletion of a python object?

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

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)

不过,如果只使用专门针对此的网络调试器模块,会简单得多。

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

关于python - 在 Kivy 中,为什么 popup.dismiss() 不从内存中删除弹出窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com