Registro de prueba para principiantes de PyQt5 (dos): desde la interfaz para obtener los parámetros hasta la retroalimentación de la información del rastreador a la interfaz

Prólogo : Este registro es una nota simple en el proceso de autoestudio del autor. Explica el proceso desde la instalación de la biblioteca hasta finalmente empaquetarla en .exe. Se divide en tres partes para que los principiantes puedan consultar e intercambiar. Por favor, lectores si hay errores en la descripción. Para obtener asesoramiento, la segunda parte del catálogo se encuentra a continuación.

1. La realización de la función de control Qt: obtener parámetros de la interfaz

1. Botón pulsador y línea de cuadro de textoEditar

Inserte la descripción de la imagen aquí
Es más importante que lo más importante (se hace la nueva llamada ), luego en base a los controles en la parte superior, hablaré de cómo obtener varios parámetros ingresados ​​por el usuario desde la interfaz;
de arriba a la izquierda a abajo a la derecha, el primero es Botón Actualizar cookie. Junto a él está el control lineEdit para recibir parámetros. Puede escribir una sola línea de texto (TextEdit son varias líneas). Búsquelo en el lado izquierdo de la interfaz de Qt Designer y arrástrelo y colóquelo en Widegt;
Inserte la descripción de la imagen aquí

Cookie 是笔者所用爬虫所需参数之一,每天都需要更新(未做模拟登录,直接在浏览器里F12然后找到复制过来,爬虫相关知识在此不赘述),但一般同一天内无需多次更新。如此,需要实现储存当日Cookie 的功能;
让我们在 getXlsxForm 类(详见上一篇第三节部分:爬取基本页功能类)中添加成员方法reCookie(),首先用text()方法接收输入的文本,因 Cookie 为必要参数所以需验证是否输入(未限定输入有效性),若输入了则把Cookie存入到本地.txt文件,若未输入则从该文件中载入历史记录,注意:路径 .\\GUI_Call表示当前 .py 文件根目录下的 GUI_Call 文件夹;

def reCookie(self): # 更新Cookie---------------------------------【1】
    inputCookie = self.lineEdit_RenewCookie.text()
    if inputCookie == '':
        QMessageBox.about(self,"提示:请确认是否更新!","未输入Cookie,已载入cookie.txt中的历史记录")
        f = open(".\\GUI_Call\\cookie.txt", "r")
        inputCookie = f.readlines()[0]
        self.lineEdit_RenewCookie.setText(inputCookie)
        f.close() # 注意:文件打开后要关闭,避免占用内存资源
    else:
        with open(".\\GUI_Call\\cookie.txt", "w", encoding='utf-8') as f:
            f.write(inputCookie)
# 使用with可省去close()
        QMessageBox.about(self,"提示","已更新Cookie至cookie.txt")

笔者将其他参数的接收统一写入运行爬虫按钮,添加runCrawler(),同样用text()方法接收用户输入,在爬取之前获取的数据有些要经过处理,于是另外还写了个setParameter(),其处理内容在此不赘述。再次验证Cookie是否存在,验证后传参调用爬虫,代码如下:

def runCrawler(self): # 点击运行爬虫按钮,爬取基本页信息-----------------【2】
    Cookie = self.lineEdit_RenewCookie.text() 
    sheetname = self.lineEdit__SheetName.text() # 输出的表名
    typeIndex = self.comboBox_infortype.currentIndex() # 类型选择下拉框
    maxpage = self.lineEdit_maxpage.text() # 最大页码
    paraList = self.setParameter(typeIndex,maxpage) # 处理类型、历史类型、最大页码
    begintime = self.lineEdit_begtime.text() # 开始日期
    endtime = self.lineEdit_endtime.text() # 结束日期
    brist = str(self.lineEdit_brist.text()) # 内容搜索
    accregpername = self.lineEdit_register.text() # 作者
    if Cookie!= '':
        # print("此处为传参调用爬虫程序中的方法MyCrawler.get_xlsx()")
    else:
        QMessageBox.about(self,"提示","请注意:未更新Cookie")

2、下拉框comboBox和单选按钮RadioButton

说明一下 comboBox 控件,即下拉框。在 Qt Designer 中拖至界面后双击,增加需要的下拉选项即可,通过currentIndex()方法获取其当前选项序号(从0开始);
Inserte la descripción de la imagen aquí
以及它旁边的 RadioButton 控件,即单选按钮。拖出来两个,笔者对1个月内选项的按钮命名为radioButton_0,通过isChecked()方法确认其是否被点击;

if self.radioButton_0.isChecked() == True: # 点击1个月内,datatype设为0
    datatype = '0'
else:
    datatype = '1' # 否则datatype设为1,即点击历史

小结:至此,基本的界面构建和参数传递方式就说明完毕,后续再做进一步的优化。本部分的关键点为:1、lineEdit.text(),2、caja combo. currentIndex (), 3 、Boton de radio. está chequeado()

2. Optimización de la interfaz: controles de calendario e iconos de botones, sugerencias de contenido, etc.

Inserte la descripción de la imagen aquí

1. Widget de calendario

( Mire la interfaz de nuevo, o olvide lo que hay allí ) . Como se mencionó anteriormente, la función del botón de actualización de cookies es facilitar el almacenamiento temporal y la carga de cookies, por lo que ¿se puede obtener la fecha de manera más conveniente?
Debido a que el formato de parámetro de fecha requerido por el rastreador utilizado por el autor es "aaaa-mm-dd", puede importar el módulo de hora y usarlo time.strftime("%Y-%m-%d")para obtener la fecha del día de acuerdo con el formato. Simplemente __init__agregue el código en el método de la clase getXlsxForm setText()y configure el cuadro de texto de fecha mediante el método Incumplimientos;

class getXlsxForm(QWidget,getXlsxWidget.Ui_Form):
    def __init__(self):
        super(getXlsxForm, self).__init__()
        self.setupUi(self)
        # 设置默认日期为当日
        self.lineEdit_begtime.setText(time.strftime("%Y-%m-%d"))
        self.lineEdit_endtime.setText(time.strftime("%Y-%m-%d"))

Pero, por lo general, cuando se usa un rastreador para realizar una consulta, el rango de fechas no es el mismo día y la fecha debe modificarse manualmente. Para evitar los problemas causados ​​por cambiar tediosamente la entrada, el control CalendarWidget proporcionado por Qt puede satisfacer las necesidades de selección de clics tontos. Nota : El icono del control dateEdit a continuación también se parece a un calendario. Puede probarlo usted mismo,
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
vamos a utilizar CalendarWidget y colocarlo en una posición adecuada, como debajo del botón junto al cuadro de texto de la fecha. Es conveniente mostrar el efecto del calendario emergente después de hacer clic en el botón, como se muestra a continuación:

Inserte la descripción de la imagen aquí
También __init__agregue código al método de la clase getXlsxForm , configure el panel del calendario para que se oculte primero y configure el cuadro de texto de fecha en solo lectura, sin necesidad de ingresar cambios manualmente. Luego siga el proceso normal "se hace clic en un botón. Se conecta para ejecutar (un método) " método de enlace que se ejecutará cuando se haga clic en el botón, se muestre el panel de calendario oculto y se haga clic en el calendario para establecer la fecha y se haga clic en el panel de calendario para volver a QDate ;

self.date_start.setHidden(True) # 隐藏日期面板
self.date_end.setHidden(True)
self.lineEdit_begtime.setReadOnly(True) # 日期框只读
self.lineEdit_endtime.setReadOnly(True)
self.pB_date_start.clicked.connect(self.showDate1) #显示日历面板
self.pB_date_end.clicked.connect(self.showDate2)  
self.date_start.clicked[QDate].connect(self.setDate1) # 设置所选日期
self.date_end.clicked[QDate].connect(self.setDate2) 

Agregue un showDate()método personalizado , primero use el isHidden()método para determinar si está oculto, actualmente está oculto, luego haga clic en el botón y luego use el setVisible()método para mostrar, si se muestra actualmente, haga clic en el botón y luego oculte;

def showDate1(self):  # 显示日历面板--------------------------------【5】
    if self.date_start.isHidden():
        self.date_start.setVisible(True)
    else:
        self.date_start.setHidden(True)
def showDate2(self):
    if self.date_end.isHidden():
        self.date_end.setVisible(True)
    else:
        self.date_end.setHidden(True)

Agregue un setDate()método, selectedDate()obtenga la fecha seleccionada en el panel de calendario por el método y use el toString()método para devolver la cadena en el formato, use el setText()método para establecer el valor de visualización del cuadro de texto de fecha y oculte el panel de calendario después de que se complete la selección. Al mismo tiempo, debe verificarse. La fecha de inicio no puede ser posterior a la fecha de finalización. El formato de la cadena de fecha es "aaaa-MM-dd", por lo tanto, replace('-','')elimine la barra horizontal para obtener un número puro y, luego, conviértalo a tipo int para comparar el tamaño, como 20200101 <20201231 ;
(Esta conversión parece ser un poco problemática, jaja, por favor dame un consejo sobre una mejor solución ლ (° ◕ ‵ ƹ′◕ ლ))

def setDate1(self): # 设置所选日期----------------------------------【6】
    date = self.date_start.selectedDate().toString("yyyy-MM-dd")
    if int(date.replace('-','')) > int(self.lineEdit_endtime.text().replace('-','')):
        QMessageBox.warning(self,"警告","开始日期不可晚于结束日期!")
    else:
        self.lineEdit_begtime.setText(date)
        self.date_start.setHidden(True)
def setDate2(self): #
    date = self.date_end.selectedDate().toString("yyyy-MM-dd")
    if int(date.replace('-','')) < int(self.lineEdit_begtime.text().replace('-','')):
        QMessageBox.warning(self,"警告","结束日期不可早于开始日期!")
    else:
        self.lineEdit_endtime.setText(date)
        self.date_end.setHidden(True)

De esta manera, la operación de adquisición de fechas parece ser más de gama alta, así que echemos un vistazo a qué más podemos hacer.
Por ejemplo, configure el ícono del botón. No use sólo texto seco, conviértalo en un mensaje de texto cuando el cursor esté flotando, luego tome la parte inferior que ha estado vacía para la cirugía. ( Esta frase es un poco genial ... )

2. Iconos de botones y sugerencias de contenido

Inserte la descripción de la imagen aquí
setStyleSheet()Establezca el estilo del botón a través del método. Puede buscar en detalle el contenido relacionado de la hoja de estilo Qt. Los estudiantes que han estado expuestos al front-end deben manejarlo rápidamente, de manera similar a css. setToolTip()Implemente mensajes de texto mediante métodos. Además, además de configurar la imagen de fondo del botón en la hoja de estilo, también puede setIcon()configurar el icono a través de métodos;

#设置按钮样式和提示
self.pB_runCrawler.setStyleSheet("QPushButton{border-image:url(./QtFile/images/run.png)}"
                                "QPushButton:hover {border:2px solid black}"
                                "QPushButton {border:none}")
self.pB_runCrawler.setToolTip("爬取基本页")
self.pB_stop.setStyleSheet("QPushButton{border-image:url(./QtFile/images/stop.png)}"
                            "QPushButton:hover {border:2px solid black}"
                            "QPushButton {border:none}")
# self.pB_stop.setIcon(QIcon(".\\QtFile\\images\\stop.png"))
self.pB_stop.setToolTip("停止程序")

El efecto probablemente sea como la imagen de abajo, que es bastante fea;
Inserte la descripción de la imagen aquí
también puede usar setClearButtonEnabled()métodos para agregar una función clara al cuadro de texto, como se muestra en la imagen de abajo, haga clic en X;
Inserte la descripción de la imagen aquí
código:

# lineEdit内容删除提示
self.lineEdit_RenewCookie.setClearButtonEnabled(True)
self.lineEdit__SheetName.setClearButtonEnabled(True)
self.lineEdit_brist.setClearButtonEnabled(True)
self.lineEdit_register.setClearButtonEnabled(True)

¿Recuerdas runCrawler()esta parte del método? El siguiente artículo actualizará la información de comentarios del rastreador al control de texto de varias líneas TextEdit una por una.

if Cookie!= '':
        # print("此处为传参调用爬虫程序中的方法MyCrawler.get_xlsx()")
else:
        QMessageBox.about(self,"提示","请注意:未更新Cookie")

Resumen :CalendarWidget.selectedDate (). ToString (“aaaa-MM-dd”)
( De repente aprecio palabras como oro ... ¡Hola! )

3. Actualización de la interfaz: información de comentarios del rastreador de carga

Esta sección ( no es necesario leerla, en realidad es una queja del autor ) explica cómo implementar los comentarios de carga de rastreadores en la interfaz. El efecto es el mismo que las instrucciones detalladas de la instalación de software común. La información de progreso se carga una por una en un cuadro de texto de varias líneas;
ah;
Inserte la descripción de la imagen aquí
Hmm ... emmmmmm;

Inserte la descripción de la imagen aquí
Ejem, realmente no es malicioso inventar el espacio. ¿Qué debo hacer? Hablando sinceramente, esta parte también requirió mucho esfuerzo (el tipo grande parpadeó y el cabrón tuvo mucho tiempo para aprender ). Al principio, quería usar el verdadero asesino de Qt: yo Defina señales y ranuras, y combine subprocesos múltiples. Pero para lograr rápidamente los requisitos, puede aprender cosas nuevas sin perder tiempo (¡ espere, espere, espere! ¡TengaInserte la descripción de la imagen aquí
cuidado si comete un error! ) Comience con un método simple: primero use el clear()método para borrar el último antes de ejecutar el rastreador Grabe, ejecute el rastreador en el bucle for, MyCrawler.getBaseData () es el programa rastreador utilizado por el autor y devuelve un código de estado de respuesta del servidor rastreado. No se explica el conocimiento relacionado con el rastreador. append()Agregue la información correspondiente al cuadro de texto de varias líneas mediante el método, es decir, el área gris de arriba;

if Cookie!= '':
    self.textEdit_CheckInfo.clear()
    for i in range(1, paraList[2] + 1):
        i = str(i)
        status_code = MyCrawler.getBaseData(爬虫参数省略……)
        info = " >>> 已爬取第%s页" % i + "(状态码:%s)" %status_code +"\n"
        self.textEdit_CheckInfo.append(info)
        QApplication.processEvents()
        time.sleep(0.1)
    self.textEdit_CheckInfo.append("爬取完成!")
else:
    QMessageBox.about(self,"提示","请注意:未更新Cookie")

Entonces viene el problema. Debido a que la interfaz está bloqueada cuando el rastreador se está ejecutando, es decir, la interfaz se bloquea antes de que finalice todo el proceso de rastreo y la información no se puede actualizar una por una, lo que hará que toda la información se imprima de una vez después de que finalice el rastreador. Y el autor es demasiado vago para aprender multiproceso , por lo que el autor tomó un enfoque diferente y encontró QApplication.processEvents()este método, que se utiliza para actualizar la información de la interfaz y finalmente lograr el efecto objetivo;
pero todavía hay problemas, aunque parece estar impreso línea por línea, pero en el proceso Aún no se puede hacer clic en la interfaz en sí misma y debe resolverse mediante subprocesos múltiples.
Inserte la descripción de la imagen aquí

Cuatro, posdata

Aunque el título general es "PyQt5 Beginner Test Record", el autor ha estado en contacto con Qt antes. Qt es una biblioteca para escribir programas GUI basados ​​en C ++. Es potente y más fácil de usar que otras bibliotecas que implementan funciones similares. Aprendí Qt cuando estaba haciendo mi proyecto de graduación. También escribí una interfaz simple. Leí el "Inicio rápido de Qt Creator" escrito por el Sr. Huo Yafei. La descripción de las características de Qt es muy detallada. Estoy interesado en esto Recomendado por estudiantes. Además, para el aprendizaje de C ++, los estudiantes que lo necesiten pueden buscar "Tsinghua University C ++" en la estación B.

Al aprender la interfaz gráfica en Python, Qt ayudó mucho, y la mayoría de los materiales para aprender PyQt5 esta vez provienen de CSDN, por lo que el autor quiso registrarlo en una publicación de blog. Si existe la posibilidad, el autor revisará y organizará Qt en C ++ para que los principiantes como yo puedan entenderlo y usarlo rápidamente. Además, las herramientas de interfaz producidas esta vez aún deben mejorarse, como el multihilo. Continuaré agregando nuevos descubrimientos.

¡Gracias por leer, gracias!


La siguiente parte continuará explicando cómo usar pyinstaller para empaquetar en un archivo .exe.

Supongo que te gusta

Origin blog.csdn.net/zohan134/article/details/106157333
Recomendado
Clasificación