import sys
import time
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWindow(QWidget):
# 声明一个信号 只能放在函数的外面
my_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.init_ui()
self.msg_history = list() # 用来存放消息
def init_ui(self):
self.resize(500, 200)
# 创建一个整体布局器
container = QVBoxLayout()
# 用来显示检测到漏洞的信息
self.msg = QLabel("")
self.msg.resize(440, 15)
# print(self.msg.frameSize())
self.msg.setWordWrap(True) # 自动换行
self.msg.setAlignment(Qt.AlignTop) # 靠上
# self.msg.setStyleSheet("background-color: yellow; color: black;")
# 创建一个滚动对象
scroll = QScrollArea()
scroll.setWidget(self.msg)
# 创建垂直布局器,用来添加自动滚动条
v_layout = QVBoxLayout()
v_layout.addWidget(scroll)
# 创建水平布局器
h_layout = QHBoxLayout()
btn = QPushButton("开始检测", self)
# 绑定按钮的点击,点击按钮则开始检测
btn.clicked.connect(self.check)
h_layout.addStretch(1) # 伸缩器
h_layout.addWidget(btn)
h_layout.addStretch(1)
# 操作将要显示的控件以及子布局器添加到container
container.addLayout(v_layout)
container.addLayout(h_layout)
# 设置布局器
self.setLayout(container)
# 绑定信号和槽
self.my_signal.connect(self.my_slot)
def my_slot(self, msg):
# 更新内容
print(msg)
self.msg_history.append(msg)
self.msg.setText("<br>".join(self.msg_history))
self.msg.resize(440, self.msg.frameSize().height() + 15)
self.msg.repaint() # 更新内容,如果不更新可能没有显示新内容
def check(self):
for i, ip in enumerate(["192.168.1.%d" % x for x in range(1, 255)]):
msg = "模拟,正在检查 %s 上的漏洞...." % ip
# print(msg)
if i % 5 == 3:
# 表示发射信号 对象.信号.发射(参数)
self.my_signal.emit(msg + "【发现漏洞】")
time.sleep(0.01)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
这段代码是一个基于 PyQt5 的简单程序,用于模拟漏洞检测过程。
首先,导入了必要的模块,包括 sys、time 和 PyQt5.QtWidgets、PyQt5.QtCore。然后,定义了一个名为 MyWindow 的继承自 QWidget 的类,用于创建主窗口。
在 MyWindow 的构造函数中,初始化了界面布局,并创建了一个用于显示检测到的漏洞信息的标签 msg。通过创建一个滚动区域 scroll 并将标签放入其中,实现了自动滚动条的功能。然后,创建了一个垂直布局器 v_layout 和一个水平布局器 h_layout,用于添加控件和按钮。最后,将布局器添加到主窗口的整体布局器 container 中,并设置为窗口的布局。
在 my_slot 方法中,更新了漏洞信息展示的标签内容,并根据内容的高度调整标签的大小。使用 repaint() 方法更新内容的显示。
check 方法模拟了漏洞检测的过程。通过一个循环,对 IP 地址进行模拟检测,并在每次检测到漏洞时发出信号,并将相应的信息传递给槽函数 my_slot。
在 main 函数中,创建了一个应用程序对象 app,然后创建了 MyWindow 对象,并显示它。最后,通过调用 app.exec() 进入应用程序的事件循环,直到应用程序退出。

该代码展示了如何使用PyQt5创建一个简单的窗口应用,模拟漏洞检测过程,并通过信号槽机制实时显示检测信息。
541

被折叠的 条评论
为什么被折叠?



