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黑帽子学习笔记1:pyqt5 designer+wmi实现进程监视器的更多相关文章
- 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道
Python黑帽子 黑客与渗透测试编程之道 <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...
- 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道
python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- Python Built-in Function 学习笔记
Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...
- Python快速入门学习笔记(二)
注:本学习笔记参考了廖雪峰老师的Python学习教程,教程地址为:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb49318210 ...
- python数据分析入门学习笔记
学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...
- python网络爬虫学习笔记(二)BeautifulSoup库
Beautiful Soup库也称为beautiful4库.bs4库,它可用于解析HTML/XML,并将所有文件.字符串转换为'utf-8'编码.HTML/XML文档是与“标签树一一对应的.具体地说, ...
- Python之xml学习笔记
XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...
随机推荐
- 使用WebBrowser并调用网页中的JS函数
在界面上拖入QAxWidget,注意这里不建议直接在UI设计界面指定控件,否则可能引起QtCreator崩溃 建议在代码中动态设置,如: ui->axWidget->setControl( ...
- 管道Demo
使用管道实现读取DOS命令结果,界面如下: 主要代码如下: UpdateData(TRUE); //创建一个管道,用于接收命令执行结果 SECURITY_ATTRIBUTES sa; ZeroMemo ...
- Android开发环境搭建(原创)
1,我的环境: win8 64位 2,软件安装: 1) jdk-7u40-windows-i586.exe 下载合适的版本,我下载的是 jdk7u40 32位 for windows 安装JDK,配置 ...
- PHP网站开发方案
一. 开发成员 a)项目主管 b)页面美工c)页面开发 d)服务端程序开发e)系统与数据管理f)测试与版本控制 二. 网站组开发简明流程 三. 开发工具与环境 a) 服务器配置i. WEB服务器: F ...
- vmware linux虚拟机忘记密码怎么办
你又忘了root密码??? 针对好多好多同学经常忘记root密码...这里给你整理怎么重置root密码!! 重启 Linux 系统主机并出现引导界面时,按下键盘上的 e 键进入内核编辑界面 在 lin ...
- JVM检测&工具
前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案.正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置,每个参数的设置都需要对JVM进行长时间的监测,并 ...
- 曹工说Tomcat2:自己撸一个简易Tomcat Digester
一.前言 框架代码其实也没那么难,大家不要看着源码就害怕,现在去看 Tomcat 3.0的代码,保证还是看得懂一半,照着撸一遍基本上很多问题都能搞定了.这次我们就模拟 Tomcat 中的 Digest ...
- Scala 学习之路(九)—— 继承和特质
一.继承 1.1 Scala中的继承结构 Scala中继承关系如下图: Any是整个继承关系的根节点: AnyRef包含Scala Classes和Java Classes,等价于Java中的java ...
- 【JAVA8】Set排序四种写法
工作中遇到,写了很久以前的写法,师兄给了很多建议,于是整理了一下.孔子曰:"你知道茴香豆的茴字有几种写法吗?" 第一种,平常的写法: public class App { publ ...
- laravel配置不同环境的配置文件
//在入口bootstrap/App.php中 $env = $app->detectEnvironment( function () use ($app) { $uname = php_una ...