环境说明: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实现进程监视器的更多相关文章

  1. 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道

    Python黑帽子  黑客与渗透测试编程之道   <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...

  2. 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道

    python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...

  3. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  4. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  5. Python Built-in Function 学习笔记

    Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...

  6. Python快速入门学习笔记(二)

    注:本学习笔记参考了廖雪峰老师的Python学习教程,教程地址为:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb49318210 ...

  7. python数据分析入门学习笔记

    学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...

  8. python网络爬虫学习笔记(二)BeautifulSoup库

    Beautiful Soup库也称为beautiful4库.bs4库,它可用于解析HTML/XML,并将所有文件.字符串转换为'utf-8'编码.HTML/XML文档是与“标签树一一对应的.具体地说, ...

  9. Python之xml学习笔记

    XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...

随机推荐

  1. Compile for Windows on Linux(交叉编译,在Linux下编译Windows程序),以OpenSSL为例

    OpenSSL for Windows In earlier articles, we have looked at how to create a gcc build environment on ...

  2. git(一)

    一.邮件的格式 抄送:需要知道这件事的人 内容: 大家好: 我是xxx,附件内容是我的简历,请查收,有问题可以随时联系我susun|开发工程师电话:1231xxxxx31地址:xxxxxx联系电话(公 ...

  3. python 参考知识点

    本笔记仅作为有编程基础的童鞋在学习python时的参考资料,不适合零基础小白,并假设在你的电脑上已经正确安装了python环境,windows下需要配置环境变量,可以在终端窗口中执行以下命令 set ...

  4. python trojan development 2nd —— use python to send mail and listen to the key board then combine them

    请勿用于非法用途!!!!!本人概不负责!!!原创作品,转载说明出处!!!!! from pynput.keyboard import Key,Listener import logging impor ...

  5. 【入门】WebRTC知识点概览 | 内有技术干货免费下载

    什么是WebRTC WebRTC 即Web Real-Time Communication(网页实时通信)的缩写,是一个支持网页浏览器之间进行实时数据传输(包括音频.视频.数据流)的技术.经过多年的发 ...

  6. spring源码深度解析— IOC 之 默认标签解析(上)

    概述 接前两篇文章  spring源码深度解析—Spring的整体架构和环境搭建  和  spring源码深度解析— IOC 之 容器的基本实现 本文主要研究Spring标签的解析,Spring的标签 ...

  7. Ace-Admin框架-首页(一)

    ACE-Admin是一个强大的后台模板框架,看起来非常漂亮,但是每个页面内容太多,看起来不知道怎么修改,现在来对首页进行主要内容改装,将不需要的内容都给删除,然后就只剩下一个框架,在开发中,我们就完全 ...

  8. 33 | 无实例无真相:基于LoadRunner实现企业级服务器端性能测试的实践(下)

  9. 并发编程-concurrent指南-Lock

    既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述.本文先从synchronized的缺陷讲起,然后再讲述java.util.concurr ...

  10. 用CSS3 vh 简单实现DIV全屏居中

    vh.vw.vmin.vmax介绍 vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)vh:视窗高度的百分比vmin:当前 vw 和 vh 中较小的一个值vmax:当前 vw 和 vh 中较大的 ...