【发布时间】:2019-04-26 15:05:59
【问题描述】:
在示例中,当程序运行时,占用了 18 MB 的 RAM。当第二个窗口运行时,另外 4 MB 将被 RAM 占用。当我们关闭第二个 Window 时,所占用的内存不会返回到 RAM,如果第二次打开第二个 Window,那么又会占用 4MB 的 RAM。你对这个问题的解决方案是什么? 这个例子是 PyQt4 而我的应用是 PyQt5。
这个例子来自这个链接: PyQT: how to open new window
如果可能,提出一个程序,用原理方法打开第二个窗口,关闭后不占用RAM空间。
from PyQt4 import QtGui, QtCore
import sys
class Second(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Second, self).__init__(parent)
class First(QtGui.QMainWindow):
def __init__(self, parent=None):
super(First, self).__init__(parent)
self.pushButton = QtGui.QPushButton("click me")
self.setCentralWidget(self.pushButton)
self.pushButton.clicked.connect(self.on_pushButton_clicked)
self.dialogs = list()
def on_pushButton_clicked(self):
dialog = Second(self)
self.dialogs.append(dialog)
dialog.show()
def main():
app = QtGui.QApplication(sys.argv)
main = First()
main.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
PyQt5 中的示例
from PyQt5 import QtCore, QtGui, QtWidgets, uic
import sys
class Second(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Second, self).__init__(parent)
class First(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(First, self).__init__(parent)
self.pushButton = QtWidgets.QPushButton("click me")
self.setCentralWidget(self.pushButton)
self.pushButton.clicked.connect(self.on_pushButton_clicked)
self.dialogs = list()
def on_pushButton_clicked(self):
dialog = Second(self)
self.dialogs.append(dialog)
dialog.show()
def main():
app = QtWidgets.QApplication(sys.argv)
main = First()
main.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
【问题讨论】:
-
只是好奇,您为什么要保留打开的窗口列表?
-
我刚刚写了例子
-
问题是 PyQt 自己管理所有这些东西——一旦你销毁了对象的所有实例,它就会从内存中消失。您应该尝试从列表中删除关闭的窗口,看看您的内存使用量是否下降。
-
@DanialAminiMoghadam 你如何测量内存使用情况?
-
@icwebndev 列表中打开的窗口的名称是否保存?如果是这样,我如何访问它们并将它们从列表中删除?