QTableWidge(Qt设计师数据表)和selenium的实际应用,自动提交表单和筛选作品

丨涉及到的第三方库

PySide2(QT设计师)
selenium(自动化测试)
pyautogui(自动化测试)
pyperclip(复制粘贴)
requests(爬虫)
webbrowser(调起浏览器)

丨程序介绍

我有一个作品排行,经过几个人审核 ,并且有排名,我想把数据库的排名对接到本地的程序里面,然后还可以查看评审的建议。
通过建议和分数,我可以自己选,这个作品怎么样,给他发通知,优秀的再把这个作品连同建议发送给编程猫官方。
不管是精选作品还是潜力作品都可以调用接口发送信息给对方。这个是如何做到的呢?

丨程序思路

我想利用可视化界面展示排名和建议,并且提交表单的时候(也就是提交给编程猫官方),我想自动化操作,无需手动复制粘贴点击。
最后实现:管理员选择作品,查看建议,再确认作品归类,就完成。
最后测试:纯人工筛选和提交一个作品至少需要5分钟,但程序只需要1分钟。
效果如图所示:

在这里插入图片描述
大概就是这样,数据来源就是我们的服务器,前后端分离对接服务器的接口,从而完成程序。

丨程序流程

首先从Qt设计师设计好界面,然后再转换成Py文件,导入到主文件。
然后开始写代码,先获取排行,点击其中一个再获取委员建议,最后再执行提交操作。
也没有这么难。上面的提交表单纯自动操作,无人工干涉,大约1.2s完成操作。

丨程序代码

应部分代码私用,不开放,下方代码已隐藏,用 {接口隐藏} 字符代替。编创协API开放平台:https://api.bcmcreator.cn/

主程序.py

#coding:utf8
from PySide2.QtWidgets import *  
from PySide2.QtCore import QStringListModel  
from ui_workdata7 import Ui_MainWindow   
import json,sys,webbrowser as wb,requests as rq,time,pyautogui,pyperclip
from selenium import webdriver 
from selenium.webdriver import ChromeOptions 

class Work(QMainWindow, Ui_MainWindow):
    BASE_URL='https://api.bcmcreator.cn/'
    FORM_URL='https://shimo.im/forms/gVcgVC9gPdHkYj3w/fill'
    WORK_URL='https://shequ.codemao.cn/work/'
    headers={'user-agant':'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()  
        self.getWork('{}user_base/user_workdata7.php'.format(self.BASE_URL))
        self.getJsonWork()
        self.setRowCount()
        self.forDataTable()
        #点击按钮,获取作品委员和大众评审信息
        self.tableWidget.itemClicked.connect(self.chick)
        #点击按钮,打开作品地址
        self.pushButton_4.clicked.connect(self.openUrl)
        #点击按钮,推送上首页给编程猫官方的通知
        self.pushButton_3.clicked.connect(self.pushWorkSelected)
        #点击按钮,本周潜力作品,继续加油的通知
        self.pushButton_2.clicked.connect(self.pushWorkPotential)
        #点击按钮,正式推送作品给编程猫官方
        self.pushButton_5.clicked.connect(self.seleniumOpen)
        
    def chick(self,item):
        '''
        获取作品委员数据,显示。
        格外赋值作品ID
        '''
        if item.column()==0:
            self.getWork('{}user_base/user_workintroduce.php?code={}'.format(self.BASE_URL,item.text()))
            self.textEdit.setText(self.data)
            self.id=self.tableWidget.item(item.row(),item.column()+1).text()
            self.x=item.text()

    def openUrl(self):
        '''
        使用系统浏览器打开指定作品
        '''
        wb.open('{}{}'.format(self.WORK_URL,self.id))

    def pushWorkSelected(self):
        '''
        提交作品,本周精选,成功推送给编程猫官方
        '''
        self.getWork('{}{接口已隐藏}{}'.format(self.BASE_URL,self.x))
        QMessageBox.information(self, "提醒", "提交成功!")
        
    def pushWorkPotential(self):
        '''
        提交作品,本周潜力,还需加油
        '''
        self.getWork('{}{接口已隐藏}{}'.format(self.BASE_URL,self.x))
        QMessageBox.information(self, "提醒", "提交成功!")

    def getWork(self,url):
        '''
        Get网页数据,以文本形式传回
        url:网页链接
        '''
        self.data=rq.get(url,headers=self.headers).text

    def getJsonWork(self):
        '''
        文本转Json
        '''
        self.dataJson=json.loads(self.data)

    def setRowCount(self):
        '''
        设置表格行数,根据Json长度设置
        '''
        self.tableWidget.setRowCount(len(self.dataJson))

    def forDataTable(self):
        '''
        设置表格数据
        '''
        set=self.tableWidget.setItem
        for i in range(len(self.dataJson)):
            set(i,0,QTableWidgetItem(self.dataJson[i]['x']))
            set(i,1,QTableWidgetItem(self.dataJson[i]['pd']))
            set(i,2,QTableWidgetItem(self.dataJson[i]['id'].split('&')[1]))
            set(i,3,QTableWidgetItem(self.dataJson[i]['js']))
            set(i,4,QTableWidgetItem(self.dataJson[i]['pwname']+'/'+self.dataJson[i]['shr']))
            set(i,5,QTableWidgetItem(self.dataJson[i]['fs']))
    
    def seleniumOpen(self):
        '''
        传递作品给官方,自动化操作提交表单
        '''
        option = ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_argument('lang=zh_CN.UTF-8')
        option.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"')
        browser = webdriver.Chrome(options=option)
        browser.get(self.FORM_URL)
        # browser.maximize_window()
        time.sleep(2)
        pyautogui.click(300, 468)
        pyperclip.copy(self.WORK_URL+self.id)
        pyperclip.paste()
        pyautogui.hotkey('ctrl','v')
        pyautogui.click(300, 630)
        pyautogui.click(300, 780)
        pyautogui.click(300, 930)
        browser.execute_script('window.scrollBy(0,500)')
        pyautogui.click(300, 600)
        pyautogui.click(300, 750)
        pyperclip.copy(self.data)
        pyperclip.paste()
        pyautogui.hotkey('ctrl','v')
        pyautogui.click(300, 830)
        pyautogui.click(300, 750)
        pyautogui.click(440, 950)
        time.sleep(2)
        


#程序入口
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Work()
    sys.exit(app.exec_())

ui_workdata7.py(由Qt设计师转换而来的界面)

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'workdata7.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1616, 641)
        MainWindow.setMinimumSize(QSize(1616, 641))
        MainWindow.setMaximumSize(QSize(1616, 641))
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.tableWidget = QTableWidget(self.centralwidget)
        if (self.tableWidget.columnCount() < 6):
            self.tableWidget.setColumnCount(6)
        __qtablewidgetitem = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
        __qtablewidgetitem1 = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
        __qtablewidgetitem2 = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2)
        __qtablewidgetitem3 = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3)
        __qtablewidgetitem4 = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4)
        __qtablewidgetitem5 = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(5, __qtablewidgetitem5)
        self.tableWidget.setObjectName(u"tableWidget")
        self.tableWidget.setGeometry(QRect(10, 10, 1211, 591))
        self.tableWidget.horizontalHeader().setVisible(True)
        self.tableWidget.horizontalHeader().setCascadingSectionResizes(False)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(198)
        self.tableWidget.horizontalHeader().setHighlightSections(True)
        self.groupBox = QGroupBox(self.centralwidget)
        self.groupBox.setObjectName(u"groupBox")
        self.groupBox.setGeometry(QRect(1230, 10, 371, 441))
        self.textEdit = QTextEdit(self.groupBox)
        self.textEdit.setObjectName(u"textEdit")
        self.textEdit.setGeometry(QRect(10, 20, 351, 411))
        self.textEdit.setReadOnly(True)
        self.tabWidget = QTabWidget(self.centralwidget)
        self.tabWidget.setObjectName(u"tabWidget")
        self.tabWidget.setGeometry(QRect(1240, 460, 361, 111))
        self.tab = QWidget()
        self.tab.setObjectName(u"tab")
        self.pushButton_4 = QPushButton(self.tab)
        self.pushButton_4.setObjectName(u"pushButton_4")
        self.pushButton_4.setGeometry(QRect(10, 20, 331, 41))
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QWidget()
        self.tab_2.setObjectName(u"tab_2")
        self.pushButton_2 = QPushButton(self.tab_2)
        self.pushButton_2.setObjectName(u"pushButton_2")
        self.pushButton_2.setGeometry(QRect(100, 20, 81, 41))
        self.pushButton_3 = QPushButton(self.tab_2)
        self.pushButton_3.setObjectName(u"pushButton_3")
        self.pushButton_3.setGeometry(QRect(10, 20, 81, 41))
        self.pushButton_5 = QPushButton(self.tab_2)
        self.pushButton_5.setObjectName(u"pushButton_5")
        self.pushButton_5.setGeometry(QRect(230, 20, 101, 41))
        self.tabWidget.addTab(self.tab_2, "")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        self.tabWidget.setCurrentIndex(0)


        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u63a8\u9996\u9875\u4f5c\u54c1\u6570\u636e\u64cd\u4f5c\u53f0", None))
        ___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)
        ___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"\u8bc6\u522b\u7801", None));
        ___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1)
        ___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1ID", None));
        ___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2)
        ___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1\u6635\u79f0", None));
        ___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(3)
        ___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u8005", None));
        ___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(4)
        ___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"\u521d\u5ba1\u4eba/\u590d\u5ba1\u4eba", None));
        ___qtablewidgetitem5 = self.tableWidget.horizontalHeaderItem(5)
        ___qtablewidgetitem5.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1\u5206\u6570", None));
        self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"\u59d4\u5458\u4f1a\u59d4\u5458\u5efa\u8bae\u548c\u5927\u4f17\u8bc4\u5ba1\u5efa\u8bae\u5c55\u793a", None))
        self.textEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"\u8bf7\u5148\u8f93\u5165\u8bc6\u522b\u7801\uff0c\u70b9\u51fb\u786e\u8ba4\u540e\uff0c\u624d\u4f1a\u663e\u793a\u59d4\u5458\u548c\u5927\u4f17\u8bc4\u5ba1\u5efa\u8bae....", None))
        self.pushButton_4.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u4f5c\u54c1", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1\u64cd\u4f5c", None))
        self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"\u6f5c\u529b", None))
        self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"\u7cbe\u9009", None))
        self.pushButton_5.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u63a8\u9001", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u63a8\u9001", None))
    # retranslateUi


丨写道最后

程序经过仅供学习,请勿滥用和商业用途。
同时希望各位大神能给我的程序提出优化建议,谢谢!~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值