本文作者官网 白月黑羽教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. pythontcp_TCP编程
  2. 你应该知道的print
  3. gispython定义查询_Python与开源GIS:SpatiaLite 中的基本SQL数据库查询用法
  4. Linux下C++静态库、动态库的制作与使用
  5. 《Android深度探索》(卷1)HAL与驱动开发 第六章心得体会
  6. [Java] 蓝桥杯ADV-203 算法提高 8皇后·改
  7. MPLS virtual private network PE-CE之间的路由协议(静态、RIP、IS-IS)
  8. 生活,不求深刻,只求简单。
  9. 6月27日 OGDF不同的布局算法
  10. Java set重写排序
  11. SQL 常用脚本大全
  12. JavaWeb(二)框架搭建篇
  13. pc电脑上浏览手机网站在线wap浏览器或模拟器软件
  14. 永磁同步电机死区补偿C语言代码
  15. 哈工大CSAPP大作业 2022
  16. html使用第三方标签,不使用第三方框架获取html页面某个标签的某个属性值
  17. 中国人保为嘉德奥通承保产品责任险,为消费者保驾护航!
  18. halcon_halcon图像处理基本运算
  19. 标准解读系列之六:车联网网络安全标准进展
  20. 北理python复试_北理复试及其初试超强总结(转)

热门文章

  1. uniapp微信小程序设置背景渐变
  2. 2023年假期放假安排调休计划可提前用便签软件制定时间规划
  3. 实践 | 百信银行基础设施容器化改造之路
  4. 时间戳转换成日期,少了8小时【问题综合汇总解决】
  5. 软件测试mysql面试题:什么是存储过程?有哪些优缺点?
  6. .NET入行之工作后
  7. 手机做时钟的两种方式
  8. HDU-1520-Anniversary party
  9. angular实现图片懒加载
  10. html 模板 pug