因为不想浪费太多的时间,部分的函数和命名不规范等问题请忽略!仅仅是作为记录GUI快速开发的示例流程笔记!
- 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
最终安装成功后相关的依赖库信息:
- Qtdesigner: 用户可视化布局工具拖拽生成布局实现。
- pycui: 对使用Qtdesigner保存后的.ui文件的进行转义生成对应的py文件。
打开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
$FileDir$ - 表示的当前的文件
$ProjectFileDir$ 表示当前项目文件夹(可以使用这个)
打开PyCharm,选择Settings -> Tools -> External Tools,点击左上角的加号 添加配置工具:
Name:PyUIC(名称无所谓,自己看得懂就好)。
Desscription:PyUIC描述工具(名称无所谓,自己看得懂就好)。
Program:python的解析器的路径
Program:C:\Users\mayn.virtualenvs\pygui-qunfa\Scripts\python.exe
注:$ProjectFileDir$表示UI文件所在的项目工作路径
$FileDir$表示UI文件所在的路径(建议使用这个,这样可以右键选择.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", "清空信息"))
#!/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_())
个人其他博客地址
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。