PyQt5的环境安装及初级使用

声明:本文仅供学习用,旨在分享
基于项目需要,运用了PyQt进行了桌面版APP的开发,在此将一些常用方法进行总结。
1、环境的安装及配置:
本人运用的是pycharm2016.3.2专业版,python3.6.0 64位,这两者的安装及配置不再阐述。首先是安装相应模块,运用豆瓣源安装,安装顺序为:sip=4.19.8>>>>PyQt5=5.11.3>>>>PyQt5-tools=5.11.3.1.4>>>>PyInstaller=3.5,
例如:pip install sip==4.19.8 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com。基于经验安装顺序最好不要调换,否则有时会出现无法正常运行的情况。安装完毕后配置打包环境:File---->settings---->Tools---->External Tools后选择加号按钮,如下图在这里插入图片描述
之后再按照下图内容进行填写:
在这里插入图片描述
其中:-D:指打包成多个文件,-D与-F对应,-F是打包成一个单独的文件
-p:即path,指定python安装包路径
-i:指定图标所在目录
编写完代码后一般右键选择External Tools再选择刚才创建的工具即可打包
在这里插入图片描述
有时打包会出现Unable to run PyInstaller - “Please install PyWin32 or pywin32-ctypes”的情况,需要到在PyInstaller文件夹中找到文件compat.py,并把以下两行进行替换后保存即可。

from win32ctypes.pywin32 import pywintypes替换为import pywintypes
from win32ctypes.pywin32 import win32api替换为import win32api

除此外有时打包报for real_module_name, six_moduleAttributeError: ‘str’ object has no attribute 'items’错误,这时运行pip install -U --pre setuptools即可。

2、上述的模块安装后,就可以开始进行界面设计,首先是创建窗口,对于窗口类型pyqt提供了QMainWindow、QWidget、QDialog三种类型。其中:

  • QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口。
  • QWidget类是所有用户界面对象的基类,是用户界面最基础的原子,也可以容纳其他的widget,它接收鼠标、键盘产生的事件,然后回应。需注意的是setCentralWidget是只能由mainwindow类调用的。
  • QDialog是对话框窗口的基类,派生自QWidget,主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的,应用场景比如可在关闭主程序关闭按钮时弹出询问是否关闭,或者当界面的按钮过多不美观时可把一些按钮放在这种对话框中,例如注册。

所以如果是主窗口,就使用QMainWindow类;如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类;如果是对话框,就使用QDialog类。在功能上QMainWindow > QWidget > QDialog。

3、接下来将运用一个简单的实例,模拟登录后界面的跳转及登录时信息填写错误后的提示来演示这三种类型的使用,代码如下:

# -*- coding: utf-8 -*-
'''多窗口反复切换'''
import sys  # 导入系统
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import *

class Login_UI(QWidget):  # 第一个窗口类
    def __init__(self):
        super(Login_UI, self).__init__()
        self.resize(300, 200)  # 设置窗口大小
        self.setWindowTitle('登录界面')  # 设置窗口标题
        self.Layout = QtWidgets.QVBoxLayout(self)#全局纵向
        self.Layout.setContentsMargins(20,20,20,20)
        self.Layout.setSpacing(0)

        self.linewidget=QtWidgets.QWidget()
        self.lineLayout = QtWidgets.QVBoxLayout(self.linewidget)
        self.user=QtWidgets.QLineEdit(self)
        self.user.setPlaceholderText('请输入用户名')
        self.pwd=QtWidgets.QLineEdit(self)
        self.pwd.setPlaceholderText('请输入密码')
        self.lineLayout.addWidget(self.user)
        self.lineLayout.addWidget(self.pwd)

        self.buttonwidget = QtWidgets.QWidget()
        self.buttonLayout=QtWidgets.QHBoxLayout(self.buttonwidget)
        self.login = QPushButton('登录', self)  # 设置按钮和按钮名称
        self.login.setMaximumSize(QtCore.QSize(100,30))  # 设置按钮大小
        self.register = QPushButton('注册', self)
        self.register.setMaximumSize(QtCore.QSize(100, 30))
        self.buttonLayout.addWidget(self.login)
        self.buttonLayout.addWidget(self.register)

        self.Layout.addWidget(self.linewidget)
        self.Layout.addWidget(self.buttonwidget)
        self.login.clicked.connect(self.login_function)  # 将信号连接到槽
        self.register.clicked.connect(self.register_function)

    def login_function(self):
        if 'test' in self.user.text() and '123' in self.pwd.text():
            self.hide()  # 隐藏此窗口
            self.Main = MainUi()
            self.Main.show()  # 将第二个窗口显示出来
        else:
            msgBox = QtWidgets.QMessageBox()
            msgBox.setWindowTitle(u'提示')
            msgBox.setText('信息错误,请重写')
            # 隐藏ok按钮
            msgBox.addButton(QMessageBox.Ok)
            msgBox.button(QMessageBox.Ok).hide()
            msgBox.exec_()  # 模态对话框

    def register_function(self):
        register=Register()
        if register.exec_():
            self.user.setText(register.text.split('::')[0])
            self.pwd.setText(register.text.split('::')[1])

class Register(QtWidgets.QDialog):
    def __init__(self,parent=None,):
        super(Register, self).__init__(parent)
        self.Layout = QVBoxLayout(self)  # 全局纵向
        self.setWindowTitle('注册界面')
        self.user = QtWidgets.QLineEdit(self)
        self.user.setPlaceholderText('请输入用户名')
        self.pwd = QtWidgets.QLineEdit(self)
        self.pwd.setPlaceholderText('请输入密码')
        self.jump = QPushButton('完成', self)  # 设置按钮和按钮名称
        self.jump.setMaximumSize(QtCore.QSize(100, 30))  # 设置按钮大小
        
        self.Layout.addWidget(self.user)
        self.Layout.addWidget(self.pwd)
        self.Layout.addWidget(self.jump)
        self.jump.clicked.connect(self.back_to_login)  # 将信号连接到槽
        self.text=''

    def back_to_login(self):#跳回登录界面
        self.text=self.user.text()+'::'+self.pwd.text()
        self.accept()

class Close_Windows(QtWidgets.QDialog):
    """对QDialog类重写,实现一些功能"""
    def closeEvent(self, event):
        reply = QtWidgets.QMessageBox.question(self,
                                               '退出界面',
                                               "是否要退出?",
                                               QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                               QtWidgets.QMessageBox.No)
        if reply == QtWidgets.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


class MainUi(QMainWindow,Close_Windows): # 建立第二个窗口的类,此窗口还继承重写的界面关闭类
    def __init__(self):
        super(MainUi, self).__init__()
        self.resize(500, 350)
        self.setWindowTitle('登陆后界面')  # 设置第二个窗口标题
        self.buttonwidget = QtWidgets.QWidget()
        self.buttonLayout = QtWidgets.QVBoxLayout(self.buttonwidget)
        self.setCentralWidget(self.buttonwidget)
        self.jump = QPushButton('跳回登录界面', self)  # 设置按钮和按钮名称
        self.jump.setMaximumSize(QtCore.QSize(100, 30))  # 设置按钮大小
        self.register = QPushButton('跳到注册界面', self)
        self.register.setMaximumSize(QtCore.QSize(100, 30))
        self.buttonLayout.addWidget(self.jump)
        self.buttonLayout.addWidget(self.register)

        self.jump.clicked.connect(self.back_to_login)  # 将信号连接到槽
        self.register.clicked.connect(self.back_to_register)

    def back_to_login(self):#跳回登录界面
        self.hide()  # 隐藏此窗口
        self.Login = Login_UI()
        self.Login.show()

    def back_to_register(self):#跳到注册界面填写完信息后回登录界面
        register = Register()
        if register.exec_():
            self.back_to_login()
            self.Login.user.setText(register.text.split('::')[0])
            self.Login.pwd.setText(register.text.split('::')[1])

def main():
    app = QApplication(sys.argv)
    w = Login_UI()
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

运行效果如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章