上一篇文章用python制作了一个自动清理内存的程序,利用cmd端口调用Rammap,不过只是做了一个托盘图标,这回用pyqt5做一个简单的图形界面,并实现对自动清理模式的一些设置

首先利用pyqt5工具qt designer生成UI界面,这里命名为F_UI.ui(并利用信号/槽编辑器将滑动条和微调框绑定,实现数值同步)

然后利用PyUIC把Qt Designer生成的.ui文件换成.py文件

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'F-ram.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)self.tabWidget.setGeometry(QtCore.QRect(220, 10, 571, 561))self.tabWidget.setObjectName("tabWidget")self.tab = QtWidgets.QWidget()self.tab.setObjectName("tab")self.tabWidget.addTab(self.tab, "")self.tab_2 = QtWidgets.QWidget()self.tab_2.setObjectName("tab_2")self.tabWidget.addTab(self.tab_2, "")self.frame = QtWidgets.QFrame(self.centralwidget)self.frame.setGeometry(QtCore.QRect(10, 40, 201, 161))self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame.setFrameShadow(QtWidgets.QFrame.Sunken)self.frame.setObjectName("frame")self.label = QtWidgets.QLabel(self.frame)self.label.setGeometry(QtCore.QRect(60, 0, 81, 20))self.label.setObjectName("label")self.line = QtWidgets.QFrame(self.frame)self.line.setGeometry(QtCore.QRect(10, 120, 181, 16))self.line.setFrameShape(QtWidgets.QFrame.HLine)self.line.setFrameShadow(QtWidgets.QFrame.Sunken)self.line.setObjectName("line")self.pushButton = QtWidgets.QPushButton(self.frame)self.pushButton.setGeometry(QtCore.QRect(10, 20, 181, 21))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(self.frame)self.pushButton_2.setGeometry(QtCore.QRect(10, 40, 181, 21))self.pushButton_2.setObjectName("pushButton_2")self.pushButton_3 = QtWidgets.QPushButton(self.frame)self.pushButton_3.setGeometry(QtCore.QRect(10, 60, 181, 21))self.pushButton_3.setObjectName("pushButton_3")self.pushButton_4 = QtWidgets.QPushButton(self.frame)self.pushButton_4.setGeometry(QtCore.QRect(10, 80, 181, 21))self.pushButton_4.setObjectName("pushButton_4")self.pushButton_5 = QtWidgets.QPushButton(self.frame)self.pushButton_5.setGeometry(QtCore.QRect(10, 100, 181, 21))self.pushButton_5.setObjectName("pushButton_5")self.pushButton_6 = QtWidgets.QPushButton(self.frame)self.pushButton_6.setGeometry(QtCore.QRect(10, 130, 181, 21))self.pushButton_6.setObjectName("pushButton_6")self.frame_2 = QtWidgets.QFrame(self.centralwidget)self.frame_2.setGeometry(QtCore.QRect(10, 210, 201, 141))self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame_2.setFrameShadow(QtWidgets.QFrame.Sunken)self.frame_2.setObjectName("frame_2")self.label_2 = QtWidgets.QLabel(self.frame_2)self.label_2.setGeometry(QtCore.QRect(70, 0, 61, 20))self.label_2.setObjectName("label_2")self.checkBox = QtWidgets.QCheckBox(self.frame_2)self.checkBox.setGeometry(QtCore.QRect(10, 50, 31, 16))self.checkBox.setChecked(True)self.checkBox.setObjectName("checkBox")self.checkBox_3 = QtWidgets.QCheckBox(self.frame_2)self.checkBox_3.setGeometry(QtCore.QRect(50, 50, 31, 16))self.checkBox_3.setChecked(True)self.checkBox_3.setObjectName("checkBox_3")self.checkBox_2 = QtWidgets.QCheckBox(self.frame_2)self.checkBox_2.setGeometry(QtCore.QRect(90, 50, 31, 16))self.checkBox_2.setChecked(True)self.checkBox_2.setObjectName("checkBox_2")self.checkBox_4 = QtWidgets.QCheckBox(self.frame_2)self.checkBox_4.setGeometry(QtCore.QRect(130, 50, 31, 16))self.checkBox_4.setChecked(True)self.checkBox_4.setObjectName("checkBox_4")self.checkBox_5 = QtWidgets.QCheckBox(self.frame_2)self.checkBox_5.setGeometry(QtCore.QRect(170, 50, 31, 16))self.checkBox_5.setChecked(True)self.checkBox_5.setObjectName("checkBox_5")self.horizontalSlider = QtWidgets.QSlider(self.frame_2)self.horizontalSlider.setGeometry(QtCore.QRect(60, 90, 131, 22))self.horizontalSlider.setMinimum(30)self.horizontalSlider.setMaximum(300)self.horizontalSlider.setProperty("value", 60)self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)self.horizontalSlider.setTickPosition(QtWidgets.QSlider.NoTicks)self.horizontalSlider.setObjectName("horizontalSlider")self.label_3 = QtWidgets.QLabel(self.frame_2)self.label_3.setGeometry(QtCore.QRect(80, 70, 41, 20))self.label_3.setObjectName("label_3")self.spinBox = QtWidgets.QSpinBox(self.frame_2)self.spinBox.setGeometry(QtCore.QRect(11, 90, 41, 22))self.spinBox.setMinimum(30)self.spinBox.setMaximum(300)self.spinBox.setProperty("value", 60)self.spinBox.setObjectName("spinBox")self.pushButton_7 = QtWidgets.QPushButton(self.frame_2)self.pushButton_7.setGeometry(QtCore.QRect(10, 20, 181, 21))self.pushButton_7.setObjectName("pushButton_7")self.pushButton_8 = QtWidgets.QPushButton(self.frame_2)self.pushButton_8.setGeometry(QtCore.QRect(110, 112, 75, 21))self.pushButton_8.setObjectName("pushButton_8")MainWindow.setCentralWidget(self.centralwidget)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)self.tabWidget.setCurrentIndex(0)self.horizontalSlider.valueChanged['int'].connect(self.spinBox.setValue)self.spinBox.valueChanged['int'].connect(self.horizontalSlider.setValue)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))self.label.setText(_translate("MainWindow", "Empty options"))self.pushButton.setText(_translate("MainWindow", "Empty working sets"))self.pushButton_2.setText(_translate("MainWindow", "Empty system working sets"))self.pushButton_3.setText(_translate("MainWindow", "Empty modified page list"))self.pushButton_4.setText(_translate("MainWindow", "Empty standby list"))self.pushButton_5.setText(_translate("MainWindow", "Empty priority 0 standby list"))self.pushButton_6.setText(_translate("MainWindow", "Empty all"))self.label_2.setText(_translate("MainWindow", "Automatic"))self.checkBox.setText(_translate("MainWindow", "Ew"))self.checkBox_3.setText(_translate("MainWindow", "Es"))self.checkBox_2.setText(_translate("MainWindow", "Em"))self.checkBox_4.setText(_translate("MainWindow", "Et"))self.checkBox_5.setText(_translate("MainWindow", "E0"))self.label_3.setText(_translate("MainWindow", "Time/s"))self.pushButton_7.setText(_translate("MainWindow", "Empty automatic"))self.pushButton_8.setText(_translate("MainWindow", "Save"))

新建MainWindow.py用于启动图形界面并保存关于自动清理的设置(生成_Ea_.py)

​
import F_UI  # 导入QtTest文件
from sys import exit, argv
from subprocess import Popen
from PyQt5.QtWidgets import QMainWindow, QApplicationclass MainWindow(QMainWindow):def __init__(self, parent=None):super(QMainWindow, self).__init__(parent)self.ui = F_UI.Ui_MainWindow()self.ui.setupUi(self)# 定义按钮self.button_w = self.ui.pushButtonself.button_s = self.ui.pushButton_2self.button_m = self.ui.pushButton_3self.button_t = self.ui.pushButton_4self.button_0 = self.ui.pushButton_5self.button_l = self.ui.pushButton_6self.button_a = self.ui.pushButton_7self.button_save = self.ui.pushButton_8# 按钮信号绑定self.button_w.clicked.connect(self.click_button)self.button_s.clicked.connect(self.click_button)self.button_m.clicked.connect(self.click_button)self.button_t.clicked.connect(self.click_button)self.button_0.clicked.connect(self.click_button)self.button_l.clicked.connect(self.click_button)self.button_a.clicked.connect(self.click_button)self.button_save.clicked.connect(self.click_button)self.button_a.setCheckable(True)def click_button(self):sender = self.sender()print(sender.text() + '被点击')if sender.text() == 'Save':x = self.ui.horizontalSlider.value()with open("_Ea_.py", "w") as f:f.write("from subprocess import Popen\n\n\n")f.write("class RunEa:\n")f.write("\tdef __init__(self):\n")f.write("\t\tself.sleep_time = "+str(x)+"\n\n")f.write("\tdef rPopen(self):\n")if self.ui.checkBox.isChecked():f.write("\t\tPopen('RAMMap -Ew', shell=True).wait()\n")if self.ui.checkBox_2.isChecked():f.write("\t\tPopen('RAMMap -Es', shell=True).wait()\n")if self.ui.checkBox_3.isChecked():f.write("\t\tPopen('RAMMap -Em', shell=True).wait()\n")if self.ui.checkBox_4.isChecked():f.write("\t\tPopen('RAMMap -Et', shell=True).wait()\n")if self.ui.checkBox_5.isChecked():f.write("\t\tPopen('RAMMap -E0', shell=True).wait()\n")elif sender.text() == 'Empty automatic':if self.button_a.isChecked():Popen("start R_Ea.exe", shell=True)else:Popen("taskkill /F /IM R_Ea.exe", shell=True)elif sender.text() == 'Empty all':Popen("RAMMap -Ew", shell=True).wait()Popen("RAMMap -Es", shell=True).wait()Popen("RAMMap -Em", shell=True).wait()Popen("RAMMap -Et", shell=True).wait()Popen("RAMMap -E0", shell=True).wait()elif sender.text() == 'Empty working sets':Popen("RAMMap -Ew", shell=True)elif sender.text() == 'Empty system working sets':Popen("RAMMap -Es", shell=True)elif sender.text() == 'Empty modified page list':Popen("RAMMap -Em", shell=True)elif sender.text() == 'Empty standby list':Popen("RAMMap -Et", shell=True)elif sender.text() == 'Empty priority 0 standby list':Popen("RAMMap -E0", shell=True)if __name__ == '__main__':app = QApplication(argv)window = MainWindow()window.show()exit(app.exec_())'''
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == '__main__':# 获取UIC窗口操作权限app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()# 调自定义的界面(即刚转换的.py对象)Ui = F_UI.Ui_MainWindow() # 这里也引用了一次F_connect.py文件的名字注意Ui.setupUi(MainWindow)# 显示窗口并释放资源MainWindow.show()sys.exit(app.exec_())
''''''
setCheckable()  设置按钮是否已经被选中,如果设置为True,则表示按钮将保持已点击和释放状态
toggle()        在按钮状态之间进行转换
setIcon()       设置按钮上的图标
setEnabled()    设置按钮是否可以使用,当设置为False时,按钮变成不可用状态,点击它不会发射信号
isChecked()     返回按钮的状态,返回值为True或False
setDefault()    设置按钮的默认状态
setText()       设置按钮的显示文本
text()          返回按钮的显示文本
'''​

新建R_Ea.py用于读取保存的设置并实现自动清理

from time import sleep
import _Ea_E = _Ea_.RunEa()while True:E.rPopen()sleep(E.sleep_time)

生成的_Ea_.py

from subprocess import Popenclass RunEa:def __init__(self):self.sleep_time = 60def rPopen(self):Popen('RAMMap -Ew', shell=True).wait()Popen('RAMMap -Es', shell=True).wait()Popen('RAMMap -Em', shell=True).wait()Popen('RAMMap -Et', shell=True).wait()Popen('RAMMap -E0', shell=True).wait()

主文件 F-Ram.py

from ctypes import windll
from sys import executable
from wx import adv, App# 用于创建托盘图标
from PIL import Image
from pystray import MenuItem, Icon# 用于调用cmd
from subprocess import Popenautomatic = False
empty_path = 6'''
def RAMMap_run():cmd = 'RAMMap-64bit -Ew'res = Popen(cmd)output_str = res.read()print(output_str)
'''# 启动和关闭自动释放内存的文件
def Automatic():global automatic, iif automatic == True:automatic = FalsePopen('taskkill /F /IM R_Ea.exe',shell=True) #强行终止进程#托盘气泡提示adv.NotificationMessage("RAMMap-64bit", message="已结束释放内存\n Automatic turn off").Show()elif automatic == False:automatic = TruePopen("start R_Ea.exe",shell=True)#启动(也可以用.py)# adv.NotificationMessage("").SetIcon(wx.Icon("ASNO.png")).Show()#托盘气泡提示adv.NotificationMessage("RAMMap-64bit", message="正在自动释放内存\n Automatic have already turn on").Show()def Empty(path):# cmd调用RAMMap外部接口if path == 0:# 这里一定要阻塞运行,否则RAMMAP会报错Popen("RAMMap -Ew",shell=True).wait()Popen("RAMMap -Es",shell=True).wait()Popen("RAMMap -Em",shell=True).wait()Popen("RAMMap -Et",shell=True).wait()Popen("RAMMap -E0",shell=True).wait()elif path == 1:Popen("RAMMap -Ew",shell=True)elif path == 2:Popen("RAMMap -Es",shell=True)elif path == 3:Popen("RAMMap -Em",shell=True)elif path == 4:Popen("RAMMap -Et",shell=True)elif path == 5:Popen("RAMMap -E0",shell=True)# 判断点击的选项
def click_menu(icon, item):global empty_pathprint("点击了", item)if str(item) == 'Empty automatic':Automatic()elif str(item) == 'Empty all':empty_path = 0elif str(item) == 'Empty Ew':empty_path = 1elif str(item) == 'Empty Es':empty_path = 2elif str(item) == 'Empty Em':empty_path = 3elif str(item) == 'Empty Et':empty_path = 4elif str(item) == 'Empty E0':empty_path = 5Empty(empty_path)empty_path = 6# 关闭程序
def on_exit(icon, item):icon.stop()def on_open():Popen("start MainWindow.exe", shell=True)def is_admin():try:return windll.shell32.IsUserAnAdmin()except:return Falseapp = App(0)
# flag = adv.NotificationMessage.SetFlags("ASNO.png")# 以管理员运行
if is_admin():# 创建托盘menu = (MenuItem(text='Empty all', action=click_menu),MenuItem(text='Empty Ew', action=click_menu),MenuItem(text='Empty Es', action=click_menu),MenuItem(text='Empty Em', action=click_menu),MenuItem(text='Empty Et', action=click_menu),MenuItem(text='Empty E0', action=click_menu),MenuItem(text='Empty automatic', action=click_menu),MenuItem(text='Open', action=on_open),MenuItem(text='Exit', action=on_exit),)image = Image.open("ASNO.png")# 托盘显示的图标icon = Icon("name", image, "RAMMap-64bit\nRUN", menu)# 鼠标放在托盘上显示的文字icon.run()
else:windll.shell32.ShellExecuteW(None, "runas", executable, __file__, None, 1)

效果

程序和源码下载

F-Ram基于RAMMap的自动内存释放工具(含源码)-Python文档类资源-CSDN文库

F-Ram基于RAMMap的自动内存释放工具(含源码)python-Python文档类资源-CSDN文库

RAMMAP(运行内存清理工具)自动释放内存,并利用pyqt5制作图形界面相关推荐

  1. 【安卓培训 App培训】自动释放内存!Android图片库Fresco

    [安卓培训 零基础到就业]QQ:3163173005 摘要:Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络.本地存储和本地资源中加载图片.其中的D ...

  2. Facebook推出强大Android 自动释放内存的图片库Fresco

    目录结构 Facebook推出强大Android图片库Fresco,Fresco有这些特性,自动释放内存.Fresco 加载和处理动画.Drawing 显示图像.Fresco自定义加载等. Andro ...

  3. 自动释放内存!Facebook推出强大Android图片库Fresco

    自动释放内存!Facebook推出强大Android图片库Fresco 发表于 2015-03-30 17:23|  14728次阅读| 来源 CSDN|  73 条评论| 作者 刘璐璐 移动开发 图 ...

  4. 三星内存android用法,三星One UI(Android 9)自带清理功能:自动释放内存和存储空间...

    文章翻译自sammobile,侵删 三星Galaxy手机拥有让设备保持最佳运行所需的所有工具,包括通过停止后台应用程序释放设备内存以及通过删除不必要的文件释放存储空间.但是不能期望用户主动关注这些方面 ...

  5. win10系统中如何不用360安全卫士等软件仍能实现清理垃圾,释放内存和安全防护的基本功能

    对于很多电脑小白来说,如果没有安全卫士或者电脑管家这样的软件协助,可能根本不知道如何管理自己的电脑.但其实装了这些所谓的管家软件,电脑运行速度不仅不能变快,反而会因为这些软件的运行而减缓.我们用安全卫 ...

  6. ARC 没有自动释放内存

    http://www.cnblogs.com/qingche/p/4569833.html 定位了好几天,才发现是打印日志没有即时释放内存,使用intrustment 转载于:https://www. ...

  7. redis怎么不让存byte_Redis 删除数据后不能自动释放内存么?

    前言 上周刚来了个应届小师弟,组长说让我带着,周二问了我这样一个问题:师兄啊,我用top命令看了下服务器的内存占用情况,发现Redis内存占用严重,于是我就删除了大部分不用的keys,为什么内存占用还 ...

  8. qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...

    前一段时间,有不少朋友问我关于智能指针的问题,并且反映经常会在面试中被面试官问到,所以今天小豆君就来讲讲我对智能指针的理解,希望能对大家有所帮助 既然讲智能指针,我们就先来看看它为什么会出现. 1 传 ...

  9. linux手动清理缓存,释放内存

    linux内存可使用的计算方法:可用内存=free+buffers+cached 手动释放linux缓存: free -m sync (一定要在第三部之前) echo 3 > /proc/sys ...

最新文章

  1. 什么是 CAS 机制?
  2. 阿里云redis设置缓存方法
  3. junit4使用心得
  4. SAP Marketing Cloud的几大核心模块讲解
  5. Redis Cluster集群的搭建与实践[转]
  6. matlab给hfss建模,HFSS-MATLAB联合建模
  7. Linux系统中设置静态ip地址
  8. 用户名 不在 sudoers 文件中。此事将被报告。
  9. 简单的社区管理系统(Qt)
  10. JavaSE_day01【Java概述、环境搭建、标识符、变量、基本数据类型】
  11. Python单词识别
  12. WifiManager 实现Wifi快捷开关
  13. keyshot局部打光_KeyShot新手的第一次打光,无脑三点打光塑造模型质感
  14. 批量删除新浪微博的关注
  15. oracle卸载步骤图解,Oracle完全卸载步骤
  16. 深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)
  17. centos 7.3 iscsi登录失败问题及解决方法
  18. 北京博奥智源,发布ERP系统之财务管理及成本核算模块开发功能
  19. 从数据架构看生鲜电商的数据价值
  20. html怎么做一条轴,html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果

热门文章

  1. python派森知多少_派森吧 - pythonpub.com | 享受python带来的便利以及快乐
  2. 远程登录工具Putty下载,并连接服务器(详细笔记)
  3. K-means聚类算法的应用——Python数据工程No.5
  4. 人人都在用的机器学习算法-决策树
  5. 第33次Scrum会议(11/21)【欢迎来怼】
  6. 处理亚马逊差评的几个方法
  7. 华为手机不小心点了始终_华为手机有一个设置,用过一次就再也离不开了,你打开了吗?...
  8. 【渝粤教育】广东开放大学 古代汉语 形成性考核 (28)
  9. OPC客户端连接OPCserver报错或拒绝访问
  10. 计算机网络机房安置要点,机房平面布置图