python黑帽子学习笔记1:pyqt5 designer+wmi实现进程监视器
环境说明:python3.6 所需要模块:wmi、pyqt5、pythonMagick
先放上一张成品效果图,如图所示:
界面利用pyqt5的designer实现,画好界面如下图所示:
画好后,保存好,利用pyuic5命令将.ui文件转换为.py文件,转换后的代码贴在下面:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'E:/py/wmi_ui.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! #author:windy_2 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(643, 646) MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(10, 10, 81, 31)) self.label.setFocusPolicy(QtCore.Qt.NoFocus) self.label.setLayoutDirection(QtCore.Qt.LeftToRight) self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(180, 10, 81, 31)) self.label_2.setObjectName("label_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(340, 10, 81, 31)) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(491, 20, 81, 21)) self.label_4.setObjectName("label_4") self.textEdit = QtWidgets.QTextEdit(self.centralwidget) self.textEdit.setGeometry(QtCore.QRect(10, 50, 104, 501)) self.textEdit.setObjectName("textEdit") self.textEdit.clearFocus() self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget) self.textEdit_2.setGeometry(QtCore.QRect(163, 50, 111, 501)) self.textEdit_2.setObjectName("textEdit_2") self.textEdit_2.clearFocus() self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget) self.textEdit_3.setGeometry(QtCore.QRect(330, 50, 104, 501)) self.textEdit_3.setObjectName("textEdit_3") self.textEdit_3.clearFocus() self.textEdit_4 = QtWidgets.QTextEdit(self.centralwidget) self.textEdit_4.setGeometry(QtCore.QRect(490, 50, 104, 501)) self.textEdit_4.setObjectName("textEdit_4") self.textEdit_4.clearFocus() self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(40, 580, 181, 41)) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(352, 580, 191, 41)) self.pushButton_2.setObjectName("pushButton_2") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "进程监视器")) self.label.setText(_translate("MainWindow", " 进程号")) self.label_2.setText(_translate("MainWindow", " 进程名")) self.label_3.setText(_translate("MainWindow", " 所有者")) self.label_4.setText(_translate("MainWindow", " 开始时间")) self.pushButton.setText(_translate("MainWindow", "开始")) self.pushButton_2.setText(_translate("MainWindow", "退出"))
(控件对象名懒得改了,直接使用默认的)
接下来是装载界面函数,利用
self.pushButton.clicked.connect(self.work) self.pushButton_2.clicked.connect(self.bye)
手动连接槽函数,由于wmi模块不能放在主线程(主线程是界面运行的线程),因为wmi有耗时操作,会导致主线程阻塞,造成主界面假死,所以将功能函数单独放在子线程中运行,下面先贴要运行的py文件的代码:
#author:windy_2 import sys from PyQt5.QtWidgets import * import wmi_ui import mythread class Wmi(QMainWindow,wmi_ui.Ui_MainWindow): def __init__(self): QMainWindow.__init__(self) wmi_ui.Ui_MainWindow.__init__(self) self.setupUi(self) self.pushButton.clicked.connect(self.work) self.pushButton_2.clicked.connect(self.bye) def work(self): self.thread = mythread.MyThread() self.thread.singal_text.connect(self.thread_start) self.thread.start() def thread_start(self,id,name,owner,date): self.textEdit.append(id) self.textEdit_2.append(name) self.textEdit_3.append(owner) self.textEdit_4.append(date) def bye(self): sys.exit(0) if __name__=='__main__': app = QApplication(sys.argv) md = Wmi() md.show() sys.exit(app.exec_())
开始按钮绑定的槽函数是work函数,work函数实现创造一个子线程,该线程通过信号singal_text连接到函数thread_start,最后启动子线程。
thread_start函数接收子线程传送的信号作为参数,然后将参数值打印在4个textedit控件中,结束按钮连接的函数为bye,作用为退出程序。
最后是核心功能的编写,利用pyqt5下的qcore的qthread类,写一个mythread类继承qthread,重写run方法实现我们的核心功能,先贴代码:
#author:windy_2 from PyQt5 import QtCore import wmi import pythoncom class MyThread(QtCore.QThread): def __init__(self): super(MyThread,self).__init__() singal_text = QtCore.pyqtSignal(str,str,str,str) def run(self): pythoncom.CoInitialize() c = wmi.WMI() process_watcher = c.Win32_Process.watch_for('creation') while True: try: list = [] new_process = process_watcher() date = new_process.CreationDate name = new_process.Name id = new_process.ProcessId owner = new_process.GetOwner() owner = owner[2] owner = str(owner) date = str(date) date = date[0:8] id = str(id) self.singal_text.emit(id,name,owner,date) except: pass pythoncom.CoUninitialize()
首先定义一个信号singal_text(相当于告诉程序我要向主线程传递什么类型的参数,这里要传递4个参数,类型都为str),接着重写run函数,由于我们将wmi放在了子线程中,所以使用wmi之前必须先初始化,同样,结束wmi的时候也必须要去初始化,实例化wmi模块的WMI类,调用win32_process创建一个监视器(作者这么理解),接着进入一个永真循环,利用proceess_watch监控进程,最后获取相关进程信息赋值给变量,发射信号(可以理解为向主线程传参的过程,这里是向thread_start传参),自此,整个代码编写完成。
接下来可以利用pyinstaller将py文件打包为exe,相关命令为pyinstaller -F -w -i 你的ico文件位置 你的py文件位置(要运行的py文件),ico文件(图标)可以利用修图工具制得,也可以利用脚本转换,这里我利用python脚本转换,代码这里就不接着贴了,在下方的网盘链接里面,使用时相关例子为python conversion.pi -P 你的图片资源文件位置
百度网盘链接:https://pan.baidu.com/s/1dWJI7IU6k93YrhavRmiMeQ 提取码:m468(里面有打包好的exe执行文件,对conversion.py感兴趣的可以去相关网站下载已经编译好的whl包,再用pip安装,或者在联系我私发)
- 《Python 黑帽子》学习笔记 - Python3 实现 netcat - Day 8
- Linux内核设计与实现 学习笔记(二)进程管理
- 安装、进程-云计算学习笔记---hadoop的简介,以及安装,用命令实现对hdfs系统进行文件的上传下载-by小雨
- python数据结构学习笔记-2016-10-24-02-使用排序列表实现集合ADT
- 信号退出【Linux学习笔记】kill及kill -9的用法及如何实现进程的优雅退出
- 孙鑫VC学习笔记:第十七讲 用匿名管道实现进程间的通信
- 感知机模型学习笔记及Python实现
- 孙鑫VC学习笔记:第十七讲 (二) 用匿名管道实现进程间的通信
- 【Linux学习笔记】kill及kill -9的用法及如何实现进程的优雅退出
- Python学习笔记13:标准库之子进程(subprocess包)
- 孙鑫VC学习笔记:第十七讲 用命名管道实现进程间的通信
- Python学习笔记-3(线程、进程、同步等)
- python学习笔记 ---线程、进程、协程、队列、python-memcache、python-redis
- python 学习笔记7进程和线程
- 机器学习实战笔记(Python实现)-06-AdaBoost
- python学习笔记(4)-进程和线程(二)-多线程
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数
- 《 Head First 》学习笔记:装饰者模式 (python实现)
- Linux内核设计与实现 学习笔记(5)进程地址空间
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序