ITPub博客

首页 > 数据库 > 数据库开发技术 > Windows下使用PYTQ5-快速实现定时群发小工具笔实操

Windows下使用PYTQ5-快速实现定时群发小工具笔实操

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-04-25 15:25:33 0 删除 编辑

Windows下使用PYTQ5-快速实现定时群发小工具

因为不想浪费太多的时间,部分的函数和命名不规范等问题请忽略!仅仅是作为记录GUI快速开发的示例流程笔记!

1 安装依赖库


- pip install pyqt5
- pip install pyqt5-tools (包含对应的Qtdesigner和pycui工具)

安装不上的话更换安装源:

pip install PyQt5-tools -i https://pypi.douban.com/simple
pip install PyQt5 -i https://pypi.douban.com/simple

最终安装成功后相关的依赖库信息:

2 配置包含对应的Qtdesigner和pycui工具

- Qtdesigner: 用户可视化布局工具拖拽生成布局实现。
- pycui: 对使用Qtdesigner保存后的.ui文件的进行转义生成对应的py文件。

2.1 配置Qtdesigner

打开PyCharm,选择Settings -> Tools -> External Tools,点击左上角的加号 第1步添加扩展工具:

第2步添加配置工具:

  • Name:QtDesigner(名称无所谓,自己看得懂就好)。

  • Desscription:描述工具(名称无所谓,自己看得懂就好)。

  • Program:PyQt5-tools下面的designer.exe。

Program内容为:C:\Users\mayn.virtualenvs\pygui-qunfa\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

  • Arguments 相关参数可以为空
  • Working directory:工作目录
  • Working directory:
$FileDir$ - 表示的当前的文件
$ProjectFileDir$ 表示当前项目文件夹(可以使用这个)

2.1 配置然后添加PyUIC

打开PyCharm,选择Settings -> Tools -> External Tools,点击左上角的加号 添加配置工具:

  • Name:PyUIC(名称无所谓,自己看得懂就好)。

  • Desscription:PyUIC描述工具(名称无所谓,自己看得懂就好)。

  • Program:python的解析器的路径

Program:C:\Users\mayn.virtualenvs\pygui-qunfa\Scripts\python.exe

  • Arguments :-m PyQt5.uic.pyuic -o .py
  • Working directory:
注:$ProjectFileDir$表示UI文件所在的项目工作路径

$FileDir$表示UI文件所在的路径(建议使用这个,这样可以右键选择.ui直接运行转换成.py文件)

3 开始使用QtDesigner规划页面

拖拽几个控件出来进行相关的布局,保存文件。

4 转化.ui文件为.py文件:

PS:每次更新我们的UI布局保存后,需要重新的生成一下!

最后生产我们的文件zhu.py为:

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

# Form implementation generated from reading ui file 'zhu.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(575, 567)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.queding = QtWidgets.QPushButton(self.centralwidget)
        self.queding.setGeometry(QtCore.QRect(320, 100, 71, 23))
        self.queding.setObjectName("queding")
        self.quxiao = QtWidgets.QPushButton(self.centralwidget)
        self.quxiao.setGeometry(QtCore.QRect(410, 100, 75, 23))
        self.quxiao.setObjectName("quxiao")
        self.yichang_des = QtWidgets.QTextBrowser(self.centralwidget)
        self.yichang_des.setGeometry(QtCore.QRect(30, 200, 531, 111))
        self.yichang_des.setObjectName("yichang_des")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(30, 350, 181, 16))
        self.label_6.setObjectName("label_6")
        self.xiangxi_des = QtWidgets.QTextBrowser(self.centralwidget)
        self.xiangxi_des.setGeometry(QtCore.QRect(30, 370, 531, 171))
        self.xiangxi_des.setObjectName("xiangxi_des")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(30, 20, 251, 22))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.layoutWidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.horizontalLayout_2.addWidget(self.lineEdit_2)
        self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QtCore.QRect(30, 60, 251, 22))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.layoutWidget1)
        self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_3.addWidget(self.label_3)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.layoutWidget1)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.horizontalLayout_3.addWidget(self.lineEdit_3)
        self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget2.setGeometry(QtCore.QRect(30, 130, 521, 25))
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget2)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.layoutWidget2)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget2)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.openfile = QtWidgets.QPushButton(self.layoutWidget2)
        self.openfile.setObjectName("openfile")
        self.horizontalLayout.addWidget(self.openfile)
        self.layoutWidget3 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget3.setGeometry(QtCore.QRect(30, 100, 262, 22))
        self.layoutWidget3.setObjectName("layoutWidget3")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.layoutWidget3)
        self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_4 = QtWidgets.QLabel(self.layoutWidget3)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_4.addWidget(self.label_4)
        self.dateTimeEdit = QtWidgets.QDateTimeEdit(self.layoutWidget3)
        self.dateTimeEdit.setMinimumSize(QtCore.QSize(194, 0))
        self.dateTimeEdit.setObjectName("dateTimeEdit")
        self.horizontalLayout_4.addWidget(self.dateTimeEdit)
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(30, 170, 239, 25))
        self.widget.setObjectName("widget")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_5 = QtWidgets.QLabel(self.widget)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_5.addWidget(self.label_5)
        self.cleanButton = QtWidgets.QPushButton(self.widget)
        self.cleanButton.setObjectName("cleanButton")
        self.horizontalLayout_5.addWidget(self.cleanButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "短链群发工具-小钟版"))
        self.queding.setText(_translate("MainWindow", "确定"))
        self.quxiao.setText(_translate("MainWindow", "取消"))
        self.label_6.setText(_translate("MainWindow", "群发执行过程详细记录描述:"))
        self.label_2.setText(_translate("MainWindow", "短链签名:"))
        self.label_3.setText(_translate("MainWindow", "渠道标签:"))
        self.label.setText(_translate("MainWindow", "短链文件:"))
        self.openfile.setText(_translate("MainWindow", "打开文件"))
        self.label_4.setText(_translate("MainWindow", "群发时间:"))
        self.label_5.setText(_translate("MainWindow", "群发执行异常过程记录描述:"))
        self.cleanButton.setText(_translate("MainWindow", "清空信息"))


5 main继承我们的生成出来的文件,显示出来及添加相关事件处理:

#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     main
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/4/25
-------------------------------------------------
   修改描述-2021/4/25:         
-------------------------------------------------
"
""
# import sys
# from PyQt5.QtWidgets import QApplication, QMainWindow
# import zhu
#
# if __name__ == '__main__':
#     app = QApplication(sys.argv)
#     myMainWindow = QMainWindow()
#     myUi = zhu.Ui_MainWindow()
#     myUi.setupUi(myMainWindow)
#     myMainWindow.show()
#     sys.exit(app.exec_())

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from zhu import *
# from PyQt5.QtWidgets import *
from PyQt5.QtCore import QDateTime, QDate

from request_helper import post

class MyWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)
        self.confEvent()

    def confEvent(self):
        #  self.openfile.triggered.connect(self.funOpenFile)

        self.scheduler = BackgroundScheduler()

        self.openfile.clicked.connect(self.funOpenFile)
        self.queding.clicked.connect(self.funqueding)
        self.quxiao.clicked.connect(self.funquxiao)
        self.cleanButton.clicked.connect(self.funcleanButton)

        self.dateTimeEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss")

        # 设置日期最大值与最小值,在当前日期的基础上,后一年与前一年
        # self.dateTimeEdit.setMinimumDate(QDate.currentDate().addDays(-365))
        # self.dateTimeEdit.setMaximumDate(QDate.currentDate().addDays(365))
        self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())

        #
        # self.dateTimeEdit.setDateTime(QtCore.QDateTime.currentDateTime())
        # self.dateTimeEdit.setDisplayFormat("dd/MM/yyyy hh:mm:ss")

        # 设置日历控件允许弹出
        self.dateTimeEdit.setCalendarPopup(True)
        self.lineEdit_2.setText('【喜马拉雅】')
        self.lineEdit.setText('C:/Users/mayn/Desktop/guangdong_vip_1_3000_2_qunfa.txt')


    def funOpenFile(self):
        pass
        # 打开文件对话框
        try:
            fileName1, filetype = QFileDialog.getOpenFileName(self, "选取文件", "./", "*.txt")  # 设置文件扩展名过滤,注意用双分号间隔
            print(fileName1, filetype)
            self.lineEdit.setText(fileName1)
        except Exception:
            pass
            self.textBrowser.setText("打开出错了!")


    def send_sms_bykey(self,appkey='', secret='', mobile='', content=''):
        """
        发送短信
        :param mobile: 手机号码
        :param content: 短信发送内容
        :return:
        "
""
        url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
        params = {"key": appkey, "secret": secret, "mobile": mobile, "content": content}
        # logger.info('开始提交:' + mobile + '---》群发内容:' + content)
        # self.xiangxi_des.append('开始提交:' + mobile + '---》群发内容:' + content)
        headers = {"Content-Type": "application/json; charset=utf-8"}
        result = post(url, params=params, headers=headers)
        result = {
            'status_code':200,
            'content': {'resmsg': '发送完成', 'test': '0', 'resid': 0, 'msgid': '29c9283b38f5e4a3dd05ef4c3a1ca9ef'}
        }
        if result.get('status_code') != 200:
            # logger.info('提交结束:非200错误' + mobile + '---》群发内容:' + content)
            # self.yichang_des.append('提交结束:非200错误' + mobile + '---》群发内容:' + content)
            return False, '未知错误'
        else:
            if result.get('content') and result.get('content').get('resid') != 0:
                # logger.info('提交结束非0错误,具体信息为:' + result.get('content').get('resmsg', '错误异常') + mobile + '---》群发内容:' + content)
                # self.yichang_des.append('提交结束非0错误,具体信息为:' + result.get('content').get('resmsg', '错误异常') + mobile + '---》群发内容:' + content)
                return False, result.get('content').get('resmsg', '错误异常')
            else:
                # logger.info('提交结束发送成功:' + mobile + '---》群发内容:' + content)
                # self.xiangxi_des.append('提交结束发送成功:' + mobile + '---》群发内容:' + content)
                return True, result.get('content').get('resmsg', '成功')

    def takes_sms_send(self):
        self.xiangxi_des.append('任务开始执行:----》')  # 文本框逐条添加数据
        # 开始打开文件,并且进行相关的读取:
        self.xiangxi_des.append('读取号码:----》')  # 文本框逐条添加数据
        try:
            with open(self.lineEdit.text(), 'r') as file_to_read:
                # 1、read():读取文件全部内容
                while True:
                    line = file_to_read.readline()
                    if not line:
                        self.xiangxi_des.append('群发处理完成!!!!')  # 文本框逐条添加数据
                        break
                    line = line.strip('\n')
                    linesplie = line.split('|')
                    # 获取签名附加到短信内容的上面
                    mobile = linesplie[0]
                    content = self.lineEdit_2.text().strip() + linesplie[1]
                    print("内容:",content)
                    isok, msg = self.send_sms_bykey(appkey='xxxxxxxxxx', secret='xxxxxxxxxxxxxxxxxxxxxxxxxxxxx', mobile=mobile, content=content)

        except UnicodeDecodeError:
            pass
            # print("异常了!!!")
            self.yichang_des.append('读取文件出现编码异常,更换另一种方式')  # 文本框逐条添加数据
            with open(self.lineEdit.text(), 'r', encoding="utf-8") as file_to_read:
                # 1、read():读取文件全部内容
                while True:
                    line = file_to_read.readline()
                    if not line:
                        self.xiangxi_des.append('群发处理完成!!!!')  # 文本框逐条添加数据
                        break
                    line = line.strip('\n')
                    linesplie = line.split('|')
                    import time
                    time.sleep(0.01)
                    # 获取签名附加到短信内容的上面
                    mobile = linesplie[0]
                    content = self.lineEdit_2.text().strip()+linesplie[1]
                    # isok, msg = self.send_sms_bykey(appkey='1b0c906b33', secret='9d87a1bae1e265c4fd87fd6d92ad2135', mobile='', content='')



    def funqueding(self):

        if not self.lineEdit.text():
            self.yichang_des.append("请先导入短链文件地址信息!")
            return

        if not self.lineEdit_2.text():
            self.yichang_des.append("请先设置签名信息!")
            return
        if not self.lineEdit_3.text():
            self.yichang_des.append("请先设置渠道信息!")
            return
        try:
            self.yichang_des.setText("准备记录异常信息:---》")
            self.xiangxi_des.append('当前群发任务签名:' + self.lineEdit_2.text())  # 文本框逐条添加数据
            self.xiangxi_des.append('当前群发任务渠道:' + self.lineEdit_3.text())  # 文本框逐条添加数据
            self.xiangxi_des.append('当前群发任务设定时间:' + self.dateTimeEdit.text())  # 文本框逐条添加数据
            if self.scheduler.get_jobs() and len(self.scheduler.get_jobs()) > 0:

                self.scheduler.remove_all_jobs()
            # 表示2017年3月22日17时19分07秒执行该程序
            self.scheduler.add_job(self.takes_sms_send, 'date', run_date=self.dateTimeEdit.text())  # 在指定的时间,只执行一次
            # self.scheduler.add_job(fsdfs, 'cron', year=2021, month=4, day=25, hour=12, minute=47, second=45)
            # self.scheduler.start()  # 这里的调度任务是独立的一个线程
            # print("开始定时"
            if self.scheduler.state !=1:
                self.scheduler.start()
        except SchedulerAlreadyRunningError:
            self.scheduler.remove_all_jobs()
            # scheduler.shutdown()
            self.scheduler.add_job(self.fsdfs, 'date', run_date=self.dateTimeEdit.text())  # 在指定的时间,只执行一次
            if self.scheduler.state != 1:
                self.scheduler.start()
        except Exception:
            raise Exception


    def funcleanButton(self):
        self.yichang_des.setText("")


    def funquxiao(self):

        if self.scheduler:
            self.scheduler.remove_all_jobs()
        if self.scheduler.state==1:
            self.yichang_des.append("操作取消群发")
            self.xiangxi_des.append('操作取消群发-任务时间:' + self.dateTimeEdit.text())  # 文本框逐条添加数据
        # self.moveCursor( self.xiangxi_des.textCursor().End)  # 文本框显示到底部



import time

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers import SchedulerAlreadyRunningError


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = MyWindow()
    myWin.show()
    # UI实时更新问题
    QApplication.processEvents()

    sys.exit(app.exec_())


6 运行main.py文件:


个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111711