1. 介绍

Python GUI 常用的 3 种框架是:Tkinter、wxpython、PyQt5

PyQt5 基于 Qt,是 Python 和 Qt 的结合体,可以用 Python 语言编写跨平台的 GUI 应用程序

相比 Tkiner和 wxpython,PyQt5 利用自带的 Qt Designer 可视化工具进行界面设计,可以非常快速地开发出一款功能强大、界面美观的 GUI 应用程序

2. 安装

以 Mac OSX 为例,PC 下的操作类似。

首先,在系统内部安装 qt 应用

  1. python学习交流群:660193417###
  2. # 安装qt
  3. brew install qt

然后,在 Python 虚拟环境下安装 sip 和 pyqt5 两个依赖库

  1. # 安装依赖sip
  2. pip3 install sip
  3. # 安装依赖pyqt5
  4. pip3 install pyqt5

接着,在 Pycharm 中配置 External Tools,新建 Qt Designer 和 PyUIC 两个命令

  1. # Qt Designer 配置
  2. Program:/usr/local/Cellar/qt/5.14.1/libexec/Designer.app
  3. Working directory:/usr/local/Cellar/qt/5.14.1/libexec
  4. # PyUIC
  5. # Python环境路径
  6. Program:/usr/local/bin/python3.7
  7. # 参数
  8. Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
  9. # 路径【固定】
  10. Working directory$ProjectFileDir$
  11. # Qt Designer 配置
  12. Program:/usr/local/Cellar/qt/5.14.1/libexec/Designer.app
  13. Working directory:/usr/local/Cellar/qt/5.14.1/libexec
  14. # PyUIC
  15. # Python环境路径
  16. Program:/usr/local/bin/python3.7
  17. # 参数
  18. Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
  19. # 路径【固定】
  20. Working directory$ProjectFileDir$

其中,在第一步安装 Qt 应用文件夹下,找到 Designer.app 和 libexec 两个文件,配置进去

由于 QtDesigner 生成的文件是 *.ui 文件,需要借助 pyqt5 中的 pyuic,将 ui 文件转换为 Python 文件

最后,可以直接在 Pycharm 中快速打开 Designer 界面、ui 转 py 文件这两个操作。

3. 常用功能介绍

QtDesigner 是一个非常强大的 GUI 设计工具,生成的文件格式为:*.ui

QtDesigner 主要包含下面 6 部分:

主设计界面区
控件区
控件属性区
信号和槽函数区
资源图片区
控件结构树区

其中,

主设计界面区:用于窗口编辑,最终的 GUI 展示区域

控件区:包含文本、输入框、选择器、容器等控件,可以直接拖拉到窗口进行布局

属性区:用于定义控件的属性,包含:内容、字体大小、宽和高等

信号和槽函数区:可以很方便地为一个控件指定一个事件监听,比如:单击、选中事件等

资源图片区域:用于导入本地的资源文件,在控件中使用,比如:图片

控件结构树区:可以很直观地显示控件间的结构关系

4.来个例子

第 1 步,我们从控件区拖 3 个按钮和 2 个输入框到界面设计区域

第 2 步,选中控件,鼠标右键为控件新增属性,比如:控件内容、控件名称(相当于id),对于一些复杂的属性设置,需要在属性区域单独进行设置

编辑完 UI 界面之后,会在本地生成一个 *.ui 的文件

第 3 步,选择 *.ui 文件,在 Pycharm 中使用 PyUIC 命令,将 ui 文件转换为 py 文件

  1. # ui文件转为py文件
  2. from PyQt5 import QtCore, QtGui, QtWidgets
  3. class Ui_MainWindow(object):
  4. def setupUi(self, MainWindow):
  5. MainWindow.setObjectName("MainWindow")
  6. MainWindow.resize(800, 790)
  7. self.centralwidget = QtWidgets.QWidget(MainWindow)
  8. self.centralwidget.setObjectName("centralwidget")
  9. self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  10. self.pushButton.setGeometry(QtCore.QRect(130, 80, 111, 41))
  11. self.pushButton.setObjectName("pushButton")
  12. self.username = QtWidgets.QLineEdit(self.centralwidget)
  13. self.username.setGeometry(QtCore.QRect(260, 80, 271, 41))
  14. self.username.setObjectName("username")
  15. self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
  16. self.pushButton_2.setGeometry(QtCore.QRect(130, 150, 111, 41))
  17. self.pushButton_2.setObjectName("pushButton_2")
  18. self.password = QtWidgets.QLineEdit(self.centralwidget)
  19. self.password.setGeometry(QtCore.QRect(260, 150, 271, 41))
  20. self.password.setObjectName("password")
  21. self.login = QtWidgets.QPushButton(self.centralwidget)
  22. self.login.setGeometry(QtCore.QRect(260, 230, 141, 61))
  23. self.login.setObjectName("login")
  24. MainWindow.setCentralWidget(self.centralwidget)
  25. self.statusbar = QtWidgets.QStatusBar(MainWindow)
  26. self.statusbar.setObjectName("statusbar")
  27. MainWindow.setStatusBar(self.statusbar)
  28. self.retranslateUi(MainWindow)
  29. QtCore.QMetaObject.connectSlotsByName(MainWindow)
  30. def retranslateUi(self, MainWindow):
  31. _translate = QtCore.QCoreApplication.translate
  32. MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  33. self.pushButton.setText(_translate("MainWindow", "用户名:"))
  34. self.pushButton_2.setText(_translate("MainWindow", "密码:"))
  35. self.login.setText(_translate("MainWindow", "登录"))

第 4 步,为按钮添加点击事件

使用 控件名.信号.connect(槽函数) 的形式,为控件添加一个点击事件的监听

  1. class Ui_MainWindow(object):
  2. def setupUi(self, MainWindow):
  3. # 为登录按钮指定事件
  4. # clicked:信号,login_met:槽函数
  5. self.login.clicked.connect(self.login_met)
  6. self.retranslateUi(MainWindow)
  7. QtCore.QMetaObject.connectSlotsByName(MainWindow)
  8. def login_met(self):
  9. """
  10. 登录事件(槽函数)
  11. :return:
  12. """
  13. # 用户名输入框的内容
  14. username = self.login.text()
  15. # 密码输入框的内容
  16. password = self.password.text()
  17. print("输入的用户名是:", username, "密码是:", password)

第 5 步,展示界面

最后,新建一个 py 文件,实例化一个 QApplication 对象,将上面创建的 MainWindow 展示出来即可。

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow
  3. # 界面文件
  4. from temp import *
  5. class CustomUI(QMainWindow, Ui_MainWindow):
  6. def __init__(self, parent=None):
  7. super(CustomUI, self).__init__(parent)
  8. self.setupUi(self)
  9. if __name__ == '__main__':
  10. app = QApplication(sys.argv)
  11. cutomUI = CustomUI()
  12. cutomUI.show()
  13. sys.exit(app.exec_())

需要注意的是,这部分内容仅仅是调用显示 GUI 界面的逻辑,实际项目开发过程中很少变动。

5.总结

通过上面的例子发现,使用 PyQt5 构建 GUI 真的很方便,大部分的工作都可以在 QtDesigner 设计完成,然后回归到 Pycharm中,转为 py 文件、编写信号和槽函数,就能快速开发 GUI 图形用户界面.

用 PyQt5 快速构建一个简单的 GUI 应用的更多相关文章

  1. 快速构建一个简单的单页vue应用

    技术栈 vue-cli webpack vux,vux-loader less,less-loader vue-jsonp vue-scroller ES6 vue-cli:一个vue脚手架工具,利用 ...

  2. 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)

    [jQuery插件]用jQuery Masonry快速构建一个pinterest网站布局 时间:2011年03月21日作者:愚人码头查看次数:29,744 views评论次数:25条评论 前段时间领导 ...

  3. 【Android Developers Training】 3. 构建一个简单UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. springboot:快速构建一个springboot项目

    前言: springboot作为springcloud的基础,springboot的热度一直很高,所以就有了这个springboot系列,花些时间来了解和学习为自己做技术储备,以备不时之需[手动滑稽] ...

  5. 通过python 构建一个简单的聊天服务器

    构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...

  6. struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb

    在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...

  7. 快速构建一个使用axios的vue应用程序(转)

    英文原文:https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/ 译文:https://segmentfault.com/ ...

  8. 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

    构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...

  9. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

随机推荐

  1. Nginx下载文件指定文件名称

    配置 location ^~/TEMP/ { alias/share/files/; if ($request_uri ~* ^.*\/(.*)\.(txt|doc|pdf|rar|gz|zip|do ...

  2. 08. 树莓派安装MySQL

    1. 配置国内源(如果之前设置过可跳过步骤1~步骤2) vim /etc/apt/sources.list.d/raspi.list 2. 添加源 ,文档内原先的内容在开头加#号注释掉,加上下面这个 ...

  3. Android 图像显示系统 - 导出图层数据的方法介绍(dump GraphicBuffer raw data)

    一.前言 在项目的开发中,为了定位Android显示异常的原因:GPU渲染 or GPU合成 or HWC合成送显异常的问题.我们通常会把图层的原始数据写到文件,然后通过RGB或YUV的软件工具来查看 ...

  4. C#/VB.NET 在Excel单元格中应用多种字体格式

    在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符.如果需要对单元格中某些字符设置样式,则可以参考本文中的方法. ...

  5. DOM操作标签、事件绑定、jQuery框架/类库

    DOM操作标签 ''' 在起变量名的时候 如果该变量指向的是一个标签 那么建议使用 xxxEle eg:aEle\pEle\divEle\spanEle ''' # 动态创建一个a标签并添加到页面指定 ...

  6. 2. 假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据。

    假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实  际数据.编写程序,完成下 ...

  7. 有关状压DP

    [以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] 引言 动态规划虽然已经是对暴力算法的优化,但在某些比较特别的情况下,可以通过一 ...

  8. DirectX11 With Windows SDK--39 阴影技术(VSM、ESM)

    前言 上一章我们介绍了级联阴影贴图.刚开始的时候我尝试了给CSM直接加上PCSS,但不管怎么调难以达到说得过去的效果.然后文章越翻越觉得阴影就是一个巨大的坑,考虑到时间关系,本章只实现了方差阴影贴图( ...

  9. 135_Power Query M语言快捷输入之输入法设置自定义短语

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 因为工作原因,把电脑重装了下,当敲M的时候总感觉那里不对.原来是我的M自定义短语没有同步.由于我的自定义短语还是 ...

  10. Springmvc基础及应用

    SpringMVC简介和环境搭建 SpringMVC简介 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一.在Spring3.0 后全面超越 S ...