pyqt5 常用知识总结一
做完师大自动考试软件初用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,它大的框架就是一个类 和里面包含的函数,以及需要添加的运行主程序。
细节部分就是如何添加删除设置操控控件,如何连接信号和槽,如何多窗体联动显示, 槽(函数)的使用,耗时线程的的使用等知识点。
评论列表
发表评论