写在前面:
①本教程使用pycharm编译器进行pyqt5的学习,安装教程请大家自行百度
②本系列博客根据B站王铭东博主教程学习 学习代码 笔记8
链接:https://pan.baidu.com/s/1i3y4mI_9N84iAC6tav-j8Q
提取码:gupx
资料:
【1】B站教程
【2】B站教程配套课件
【3】PyQt官网的所有模块 (有部分内容没有补充进去)
【4】C++具体实现的API文档
窗口有三种:QWidget、QMainWindow、QDialog
QMainWindow 是QWidget子类,继承QWidget,另外包含菜单栏、状态栏等
详情参考:https://doc.itprojects.cn/0001.zhishi/python.0008.pyqt5rumen/index.html#/05.window
对象.信号.connect(槽函数)alt+enter快捷键 alt+enter:当有的函数没有导入需要的包时,下方有红色波浪线

鼠标放在红色波浪线的位置按住alt+enter,就会出现下面这个界面,再按enter就会自动导入需要的包了

btn_press1.clicked.connect(self.btn_press1_clicked) 按钮和事件进行绑定
信号:clicked 槽:btn_press1_clicked函数
代码1:
import sys
from PyQt5.QtWidgets import QWidget,QApplication,QPushButton
def pressbtn():
print("点击按钮啦~")
app = QApplication(sys.argv)
w = QWidget()
btn = QPushButton("点我点我", w)
btn.clicked.connect(pressbtn)
w.show()
app.exec()

代码2:
import sys
from PyQt5.QtWidgets import QWidget,QApplication,QPushButton
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initui()
def initui(self):
self.setWindowTitle("信号与槽")
self.resize(300,300)
btn = QPushButton("点我点我", self) # 给按钮设置父亲,self
# btn.setGeometry(200, 200, 100, 30)
btn.clicked.connect(self.pressbtn)
def pressbtn(self,arg):
print("点击按钮啦~",arg)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()

①from PyQt5.QtCore import pyqtSignal
②my_signal = pyqtSignal(str): 声明一个信号,这个信号只接收带有一个字符串的信号 只能写在函数外面
③self.my_signal.connect(self.sort_fall): 自己新建的信号与槽函数进行绑定
对象.信号.发射(参数)
④self.my_signal.emit(msg+"【发现漏洞】"):触发自定义信号,相当于调用sort_fall函数
⑤def sort_fall(self,msg): print(">>>>>" + msg)
import sys
import time
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
class MyWindow(QWidget):
# 声明一个信号,只能写在函数外面
my_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.initui()
def initui(self):
self.resize(300,300)
btn = QPushButton("测试",self)
btn.setGeometry(100,200,100,50)
btn.clicked.connect(self.pressbtn)
self.my_signal.connect(self.sort_fall) # 自己新建的信号与槽函数进行绑定
def sort_fall(self,msg):
print(">>>>>" + msg)
def pressbtn(self):
for num, ip in enumerate(["192.168.%s" % x for x in range(1,256)]):
msg = "模拟,正在检查" + ip + "上的漏洞"
print(msg)
# 每5次报一次故障
if num % 5 == 0:
# 这个时候触发自定义信号,相当于调用sort_fall函数
self.my_signal.emit(msg+"【发现漏洞】")
print(msg)
time.sleep(0.01)
if __name__=='__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
for num, ip in enumerate(["192.168.%s" % x for x in range(1,256)]):对元组进行拆包 num、ip
num为从0到254,ip为192.168.1.1~192.168.1.255
运行结果:


视频教程:https://www.bilibili.com/video/BV1LT4y1e72X?p=20&vd_source=7bf7a381cd41ba8ac1e32306d989aeb1

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("
".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()