本文作者官网 白月黑羽教Python

从一个示例开始

点击这里,边看视频讲解,边学习以下内容

现在我们要开发一个程序,让用户输入一段文本包含:员工姓名、薪资、年龄。

格式如下:

薛蟠     4560 25
薛蝌     4460 25
薛宝钗   35776 23
薛宝琴   14346 18
王夫人   43360 45
王熙凤   24460 25
王子腾   55660 45
王仁     15034 65
尤二姐   5324 24
贾芹     5663 25
贾兰     13443 35
贾芸     4522 25
尤三姐   5905 22
贾珍     54603 35

该程序可以把薪资在 2万 以上、以下的人员名单分别打印出来。

当然我们可以像以前一样,开发命令行程序(准确的说应该叫字符终端程序,因为UI是字符终端),让用户在字符终端输入。

但是如果我们能开发下面这样的图形界面程序,就更酷了

能吗?

能,用 Python Qt,开发上面的界面就只要下面这短短的程序即可

from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEditapp = QApplication([])window = QMainWindow()
window.resize(500, 400)
window.move(300, 310)
window.setWindowTitle('薪资统计')textEdit = QPlainTextEdit(window)
textEdit.setPlaceholderText("请输入薪资表")
textEdit.move(10,25)
textEdit.resize(300,350)button = QPushButton('统计', window)
button.move(380,80)window.show()app.exec_()

大家可以运行一下看看。

QApplication提供了整个图形界面程序的底层管理功能,比如:

初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等…

对 QApplication 细节比较感兴趣的话,可以点击这里参考官方网站

既然QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它。

QMainWindow、QPlainTextEdit、QPushButton 是3个控件类,分别对应界面的主窗口、文本框、按钮

他们都是控件基类对象QWidget的子类。

要在界面上 创建一个控件,就需要在程序代码中 创建这个 控件对应类的一个 实例对象

在 Qt 系统中,控件(widget)是 层层嵌套的,除了最顶层的控件,其他的控件都有父控件。

QPlainTextEdit、QPushButton 实例化时,都有一个参数window,如下

QPlainTextEdit(window)
QPushButton('统计', window)

就是指定它的父控件对象 是 window 对应的QMainWindow 主窗口。

而 实例化 QMainWindow 主窗口时,却没有指定 父控件, 因为它就是最上层的控件了。

控件对象的 move 方法决定了这个控件显示的位置。

比如

window.move(300, 310)就决定了 主窗口的 左上角坐标在 相对屏幕的左上角的X横坐标300像素, Y纵坐标310像素这个位置。

textEdit.move(10,25)就决定了文本框的 左上角坐标在 相对父窗口的左上角的X横坐标10像素, Y纵坐标25像素这个位置。

控件对象的 resize 方法决定了这个控件显示的大小。

比如

window.resize(500, 400)就决定了 主窗口的 宽度为500像素,高度为400像素。

textEdit.resize(300,350)就决定了文本框的 宽度为300像素,高度为350像素。

放在主窗口的控件,要能全部显示在界面上, 必须加上下面这行代码

window.show()

最后 ,通过下面这行代码

app.exec_()

进入QApplication的事件处理循环,接收用户的输入事件(),并且分配给相应的对象去处理。

界面动作处理 (signal 和 slot)

点击这里,边看视频讲解,边学习以下内容

接下来,我们要实现具体的统计功能:

当用户点击 统计 按钮时, 从界面控件 QPlainTextEdit 里面获取 用户输入的字符串内容,进行处理。

首先第一个问题: 用户什么点击了 统计 按钮,怎么通知程序? 因为只有程序被通知了这个点击,才能做出相应的处理。

在 Qt 系统中, 当界面上一个控件被操作时,比如 被点击、被输入文本、被鼠标拖拽等, 就会发出 信号,英文叫 signal。就是表明一个事件(比如被点击、被输入文本)发生了。

我们可以预先在代码中指定 处理这个 signal 的函数,这个处理 signal 的函数 叫做 slot

比如,我们可以像下面这样定义一个函数

def handleCalc():print('统计按钮被点击了')

然后, 指定 如果 发生了button 按钮被点击 的事情,需要让 handleCalc来处理,像这样

button.clicked.connect(handleCalc)

用QT的术语来解释上面这行代码,就是:把 button 被 点击(clicked) 的信号(signal), 连接(connect)到了 handleCalc 这样的一个 slot上

大白话就是:让 handleCalc 来 处理 button 被 点击的操作。

但是上面这行代码运行后,只能在字符窗口 打印出 统计按钮被点击了, 还不能处理分析任务。

要处理分析任务,我们还得从 textEdit 对应的 文本框中 获取用户输入的文本,并且分析薪资范围,最终弹出对话框显示统计结果。

我们修改后,代码如下

from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit,QMessageBoxdef handleCalc():info = textEdit.toPlainText()# 薪资20000 以上 和 以下 的人员名单salary_above_20k = ''salary_below_20k = ''for line in info.splitlines():if not line.strip():continueparts = line.split(' ')# 去掉列表中的空字符串内容parts = [p for p in parts if p]name,salary,age = partsif int(salary) >= 20000:salary_above_20k += name + '\n'else:salary_below_20k += name + '\n'QMessageBox.about(window,'统计结果',f'''薪资20000 以上的有:\n{salary_above_20k}\n薪资20000 以下的有:\n{salary_below_20k}''')app = QApplication([])window = QMainWindow()
window.resize(500, 400)
window.move(300, 300)
window.setWindowTitle('薪资统计')textEdit = QPlainTextEdit(window)
textEdit.setPlaceholderText("请输入薪资表")
textEdit.move(10,25)
textEdit.resize(300,350)button = QPushButton('统计', window)
button.move(380,80)
button.clicked.connect(handleCalc)window.show()app.exec_()

运行后,你会发现结果如下

封装到类中

上面的代码把控件对应的变量名全部作为全局变量。

如果要设计稍微复杂一些的程序,就会出现太多的控件对应的变量名。

而且这样也不利于 代码的模块化。

所以,我们通常应该把 一个窗口和其包含的控件,对应的代码 全部封装到类中,如下所示

from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit,QMessageBoxclass Stats():def __init__(self):self.window = QMainWindow()self.window.resize(500, 400)self.window.move(300, 300)self.window.setWindowTitle('薪资统计')self.textEdit = QPlainTextEdit(self.window)self.textEdit.setPlaceholderText("请输入薪资表")self.textEdit.move(10, 25)self.textEdit.resize(300, 350)self.button = QPushButton('统计', self.window)self.button.move(380, 80)self.button.clicked.connect(self.handleCalc)def handleCalc(self):info = self.textEdit.toPlainText()# 薪资20000 以上 和 以下 的人员名单salary_above_20k = ''salary_below_20k = ''for line in info.splitlines():if not line.strip():continueparts = line.split(' ')# 去掉列表中的空字符串内容parts = [p for p in parts if p]name,salary,age = partsif int(salary) >= 20000:salary_above_20k += name + '\n'else:salary_below_20k += name + '\n'QMessageBox.about(self.window,'统计结果',f'''薪资20000 以上的有:\n{salary_above_20k}\n薪资20000 以下的有:\n{salary_below_20k}''')app = QApplication([])
stats = Stats()
stats.window.show()
app.exec_()

这样代码的可读性是不是好多了?

Python Qt 一个案例相关推荐

  1. 白月黑羽教python excel_一个案例

    从一个示例开始 现在我们要开发一个程序,让用户输入一段文本包含:员工姓名.薪资.年龄. 格式如下: 薛蟠 4560 25 薛蝌 4460 25 薛宝钗 35776 23 薛宝琴 14346 18 王夫 ...

  2. matlab完整脚本模板,在PyCharm中给Python脚本设置默认的代码模板和活动模板,文末有一个案例(MATLAB GUI和Qt对比做一个界面)...

    前几天学到了这个,感觉挺方便的,记录下来. 先说默认的代码模板把: 它就是每当你新建一个Python脚本后,就会立马出现的一些代码,感觉一般都是用来记录作者和日期等.比如下面这样的: "&q ...

  3. 第15.32节 PyQt(Python+Qt)入门学习:containers容器类部件QToolBox工具箱介绍及使用案例

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  4. 用python做简单的地理聚类分析案例_用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 本文就来自编程教室一位"小"读者的投稿(互助学习1群里的同学 ...

  5. python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    <从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例>要点: 本文介绍了从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例,希望对您有用.如果有疑问,可 ...

  6. 转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    注: 转自 微信公众号"高可用架构":从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一 ...

  7. 用Python+Qt+Java整一个百宝箱

    用Python+Qt+Java整一个百宝箱 需求分析 课堂期末大作业,需要用Python做一个小项目.我自己有一些小的想法以及网上也有许多好玩.有用的通过Python实现的小工具,于是打算做一个百宝箱 ...

  8. 如何用Python操作Excel自动化办公?一个案例教会你openpyxl——读取数据

    欢迎大家关注我,我是拾陆,关注同名"二八Data" 数据分析工作最难搞的是处理数据的过程,不然不会有专门的ETL(数据抽取.转换.加载)工程师了.如果是企业级数据处理可能数据库直接 ...

  9. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

    目录 1. 水平布局类(QHBoxLayout) 2.垂直布局类(QVBoxLayout) 3.网格布局类(QGridLayout) 3.1.单一的网络布局 3.2.跨越行.列的网络布局 4.表单布局 ...

最新文章

  1. spring cloud微服务分布式云架构--hystrix的使用
  2. linux指令 2>1 到底是个啥
  3. djanjo 使用a标签跳转_django页面跳转怎么写
  4. 浅析当下专业网站优化公司所具有的特性
  5. 【VM单机模拟系列】VMware P2V简单实现
  6. Linux——进程间通信(总结)
  7. 【云炬大学生创业基础笔记】第1章第3节 什么是创业的讨论
  8. 30 校准_校准or质控,傻傻分不清楚
  9. 嵌入式C开发中用到的位域结构体
  10. 企业实战_11_MyCat垂直拆分相关配置
  11. 远程线程需要注意的问题
  12. MySQL length函数使用详解
  13. Hadoop-MR实现日志清洗(三)
  14. 【操作指导】安捷伦数据采集器开机自检/通讯接口设置说明
  15. VISA 通信command总结
  16. pr cpu100%_PR插件Neat Video5.0.2安装教程
  17. 2019\National _C_C++_A\试题 A: 三升序列
  18. PS制作压印效果的logo等
  19. nove6怎么升级鸿蒙系统,华为手机怎么升级鸿蒙,华为鸿蒙系统支持手机型号大全...
  20. 龙芯mips64el 微信客户端 ubuntu 微信客户端

热门文章

  1. 草戒指、钻石戒指哪个更重要
  2. 【AirSim】03.可视化轨迹
  3. sinee303a变频器说明书_sinee em303a变频器用户手册新.pdf
  4. 理解“same-site“ 和 “same-origin“
  5. 看今年第一季度在线音频市场迅猛发展!
  6. Java post路径请求和图片下载、压缩分享给你们!!干货
  7. 陶渊明劝学——勤学如春起之苗
  8. 图片处理——基于openCV实现美颜相机
  9. 英语语音篇 - 语音语调
  10. 入冬最冷的上海——致在外漂泊的孩子