声明:本文仅供学习用,旨在分享
基于项目需要,运用了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类;如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用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()
运行效果如下: