01、逻辑和界面分离之文件选择框、输入获取框、点击事件获取输入框内容和文件名、展示text
--基本结构:一个设计界面类,一个逻辑实现类,一个if __name__ == '__main__':
通过界面和逻辑分离,使得整个开发架构清晰
--存在的问题:前端显示后台日志/运行流程时,尽管使用了time.sleep()仍然无法实现依次输出,导致完全卡顿
--import sys
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(774, 445)
Form.setMaximumSize(QtCore.QSize(16777215, 16777215))
Form.setSizeIncrement(QtCore.QSize(2, 2))
# 进行解析
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(590, 70, 75, 23))
self.pushButton.setObjectName("pushButton")
# 一条线而已不在乎
self.line = QtWidgets.QFrame(Form)
self.line.setGeometry(QtCore.QRect(0, 150, 771, 16))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
# 文本输入
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setGeometry(QtCore.QRect(10, 180, 751, 241))
self.textEdit.setObjectName("textEdit")
# 选择文件
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(420, 70, 121, 23))
self.pushButton_2.setObjectName("pushButton_2")
# textlabel展示
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(73, 70, 81, 21))
self.label.setObjectName("label")
# 单行输入
self.lineEdit = QtWidgets.QLineEdit(Form)
self.lineEdit.setGeometry(QtCore.QRect(160, 70, 211, 20))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit.setPlaceholderText('请输入网址')
#
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "选择文件并爬取内容"))
self.pushButton_2.setText(_translate("Form", "下载爬取结果"))
self.label.setText(_translate("Form", " url 地址:"))
# 获取接口输入框中数据 和 文件夹打开的文件
class Get_Input_Text(QtWidgets.QWidget, Ui_Form):
# 创建一个信号,相当于是创建一个通道,可以创建多个,同时使用_表示不可以在类外使用该信号
_signal = QtCore.pyqtSignal(str)
def __init__(self):
super(Get_Input_Text, self).__init__()
self.setupUi(self)
# 两个按钮触发两个事件
self.pushButton.clicked.connect(self.lineedit_Ptn)
self.pushButton_2.clicked.connect(self.fileedit_Ptn)
# 将信号通道的一端连上lineedit_Ptn,相当于插入lineedit_Ptn函数体中,使用参数接受
self._signal.connect(self.lineedit_Ptn)
self.textEdit.append('爬虫执行日志:')
"""
获取输入的文件名
获取url地址
爬取网页
"""
def fileedit_Ptn(self):
# 点击接受输入框的文字内容:网址
Line_Input_Str = self.lineEdit.text()
print('点击接受输入框的网址: ', str(Line_Input_Str))
# 点击打开、选择获取文件路径,并发送
fileName, selectFilter = QFileDialog.getOpenFileName(self, ("标题"), ("C:/Users/lwx898295/Desktop/lwx898295/python/djando"), ("选择文件(*.txt)"))
print('点击接收文件路径,并发送: ', fileName)
# 模拟执行爬取过程,并将数据日志发送到前台,并通过sleep定时发送,但是这种方式会有问题,不是真正的定时
# 因为pyqt封装的的是C++的Qt,所以需要我们使用pyqt自带的定时器/使用进程
for i in range(20):
self._signal.emit(str(fileName), 'liming weishuo')
time.sleep(1)
"""
text展示爬取进程
"""
def lineedit_Ptn(self, parameter, parameter02):
# txt文件路径
file_path = parameter
self.textEdit.append('lalallalal')
self.textEdit.append(file_path)
time.sleep(0.5)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
get_input_text = Get_Input_Text()
get_input_text.show()
sys.exit(app.exec_())
02、逻辑和界面分离之使用定时器
--
--