pyqt5 常用知识总结一

磊落不羁 by:磊落不羁 分类:pyQt5 时间:1年前 阅读:140 评论:0

做完师大自动考试软件初用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,它大的框架就是一个类 和里面包含的函数,以及需要添加的运行主程序。

细节部分就是如何添加删除设置操控控件,如何连接信号和槽,如何多窗体联动显示, 槽(函数)的使用,耗时线程的的使用等知识点。


非特殊说明,本文版权归原作者所有,转载请注明出处

本文地址:http://php.liulei.com.cn/?type=acticle&id=61

评论列表

发表评论

  • 昵称(必填)
  • 邮箱
  • 网址

TOP