做完师大自动考试软件初用pyqt5 知识总结
一、主程序运行添加代码
import sys if __name__=="__main__": app=QtWidgets.QApplication(sys.argv) MainWindow=QtWidgets.QMainWindow() #创建窗口 ui=Ui_MainWindow() #创建qt设计的窗口 ui.setupUi(MainWindow) #初始化设置窗口 MainWindow.show() #显示窗口 sys.exit(app.exec_()) #程序关闭时候退出进程
2、菜单的添加以及运行函数
bar = QtWidgets.QMainWindow.menuBar(MainWindow) #设置菜单栏
start = bar.addMenu('程序文件') #增加一个主菜单
web = start.addAction("打开网站") #增加一个子菜单
web.triggered.connect(self.openweb) ##子菜单连接信号 用的是 triggered
quite = start.addAction('关闭程序') #增加第二个子菜单
quite.triggered.connect(self.closewindows) #第二个子菜单连接信号def closewindows(self): #使用的两个函数
app.quit()
def openweb(self):
webbrowser.open("http://cgjx.jsnu.edu.cn/np/#/login")3、打开新窗体
主窗体设置
使用菜单或者按钮等槽 连接
zhuce.triggered.connect(self.opencode) #注册菜单连接 按钮则用clicked def opencode(self): # 打开注册码窗口 这里注意引用子窗口 并设置窗体 和显示 import code self.codeWindows = code.Ui_MainWindow() self.codeWindows.show()
子窗体设置
from PyQt5.QtWidgets import QMainWindow #引用 class Ui_MainWindow(QMainWindow): #类继承 QMainWindow def __init__(self): super().__init__() #初始化设置ui self.setupUi(self)
4、线程的使用
线程本次使用用了半天的时间查找资料,因为需要传参和多信号发送,从无到有,现在能解决非常好
线程的启用可以当成函数一般在需要的地方使用
以下直接使用我实例中代码
self.jc = newThread(data=data, danxuan=danxuan, duoxuan=duoxuan, panduan=panduan, cookies=cookies, url=url, mubiao=mubiao) #定义线程
self.jc.xinhao.connect(self.shuchu) #信号一
self.jc.isend.connect(self.isend) #信号二
self.jc.start() #线程启动命令
#以下是两个接收并在主程序显示UI的函数
def isend(self, bool):
if bool:
self.startexam.setEnabled(True)
self.lineEdit.clear()
def shuchu(self, str):
self.listWidget.addItem(str)
#线程设置
class newThread(QThread):
xinhao = pyqtSignal(str) #pysqSingnal函数用于定义信号 下方用emit方法显示信号内容
isend = pyqtSignal(bool)
def __init__(self, data, danxuan, duoxuan, panduan, cookies, url, mubiao): #初始化可以接收传值
super(newThread, self).__init__()
self.data = data
self.danxuan = danxuan
self.duoxuan = duoxuan
self.panduan = panduan
self.cookies = cookies
self.url = url
self.mubiao = mubiao
def run(self):
dan_answer = ['A', 'B', 'C', 'D']
pan_answer = ['T', 'F']
duo_answer = ['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD', 'ABCD', 'E',
'AE',
'BE', 'CE', 'DE', 'ABE', 'ADE', 'ACE', 'BCE', 'BDE', 'CDE', 'ABCE', 'ABDE', 'ACDE', 'BCDE',
'ABCDE']
# 流程如下
before = 0
# 组合成答案 提交然后获取
tishu = self.danxuan + self.duoxuan + self.panduan
self.xinhao.emit(f'单选题:{str(tishu)}题') # 这里向信号发送内容
# 首先生成全NULL
myanswer = {}
for i in range(0, tishu):
myanswer[i] = 'NULL'
# print(myanswer)
right_num = 0
bianhao = 0
jieti = True
while jieti:
if right_num in range(0, self.danxuan):
if bianhao in range(0, len(duo_answer)):
myanswer[right_num] = dan_answer[bianhao]
else:
right_num += 1
continue
if right_num in range(self.danxuan, self.danxuan + self.duoxuan):
if bianhao in range(0, len(duo_answer)):
myanswer[right_num] = duo_answer[bianhao]
else:
right_num += 1
continue
if right_num in range(self.duoxuan + self.danxuan, tishu):
if bianhao in range(0, len(pan_answer)):
myanswer[right_num] = pan_answer[bianhao]
else:
right_num += 1
continue
# 组合答案
zifu = ""
for x in range(0, tishu):
zifu = zifu + '|' + str(myanswer[x])
myAnswers = zifu[1:]
# print(myAnswers)
# data['myAnswers']=quote(myAnswers) #data 数据加入新的值
self.data['myAnswers'] = myAnswers # data 数据加入新的值
# print(data)
# 开始解题
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Cookie': self.cookies,
'Host': 'cgjx.jsnu.edu.cn',
'Referer': self.url,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Origin': 'http://cgjx.jsnu.edu.cn'
}
posturl = "http://cgjx.jsnu.edu.cn/learnspace/course/test/coursewareTest_handSubmitPaperToResult.action"
html = requests.post(url=posturl, data=self.data, headers=headers).text
time.sleep(2)
now = re.findall('<span class="record_num_this">(.*?)</span>', html, re.S)[0]
now = int(now)
if now >= self.mubiao:
# self.listWidget.addItem('本次考试已达目标分数')
self.xinhao.emit('本次考试已达目标分数')
jieti = False # 关闭循环
if now > before: # 说明解题正确
# print()
# self.listWidget.addItem(f'{now}分---第{right_num + 1}题解答成功,正确答案为{myanswer[right_num]}')
self.xinhao.emit(f'{now}分---第{right_num + 1}题解答成功,正确答案为{myanswer[right_num]}')
right_num += 1 # 题号加1
bianhao = 0 # 编号归位
before = now # 更新初始值
elif now == before: # 说明答案不对,继续下一个答案
# print(f'{now}分---第{right_num + 1}题答案{myanswer[right_num]}错误,继续尝试')
bianhao += 1
time.sleep(2)
# print('====================本场考试结束,可进行下一场================================')
self.xinhao.emit(f'本场考试结束,请进行下一场')
self.isend.emit(True) # 第二个信号发送内容5、各种控件的使用,见书本
6、打包
#终端使用 pyinstaller -W -F xxx.py -i xxx.ico #进行打包成一个文件 #出现spec文件后 对spec文件进行二次打包 pyinstaller xxx.spec
7、关于结构
本次对框架的理解最深的便是快速掌握一个框架,首先要理解框架的整个结构,懂得了结构后,在关注细节,比方一个pyqt,它大的框架就是一个类 和里面包含的函数,以及需要添加的运行主程序。
细节部分就是如何添加删除设置操控控件,如何连接信号和槽,如何多窗体联动显示, 槽(函数)的使用,耗时线程的的使用等知识点。
0 评论