从一个示例开始

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

格式如下:

薛蟠 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, QPlainTextEdit

app = 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,QMessageBox

def handleCalc():

info = textEdit.toPlainText()

# 薪资20000 以上 和 以下 的人员名单

salary_above_20k = ''

salary_below_20k = ''

for line in info.splitlines():

if not line.strip():

continue

parts = line.split(' ')

# 去掉列表中的空字符串内容

parts = [p for p in parts if p]

name,salary,age = parts

if 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,QMessageBox

class 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():

continue

parts = line.split(' ')

# 去掉列表中的空字符串内容

parts = [p for p in parts if p]

name,salary,age = parts

if 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 excel_一个案例相关推荐

  1. 白月黑羽教python excel_发布程序

    正式发布程序 前面,我们开发好了一个HTTP协议测试程序,但是这个程序是Python程序,运行它需要Python解释器. 如果我们要发布程序给客户使用,当然不能要求别人去安装Python解释器,并且敲 ...

  2. 白月黑羽教python之pytest:课后练习

    本博客记录了白月黑羽教python的pytest课后作业的代码,方便以后查看,希望可以帮助看到这篇博客的人,最后感谢白月黑羽老师的免费教程,讲的非常清楚! 目录 1.测试用例表 2.代码文件布局 3. ...

  3. 白月黑羽教python之selenium:课后练习作业二

    白月黑羽教python之selenium:课后练习 最近自学了白月黑羽老师的自动化测试课程,并非课后作业的准确答案,只是为了个人学习记录,如有不足欢迎留言指点,谢谢大家. 前置条件,使用正确的管理员账 ...

  4. 白月黑羽教python之selenium:课后练习

    本博客记录了白月黑羽教python的selenium课后作业的代码,方便以后查看,希望可以帮助看到这篇博客的人,最后感谢白月黑羽老师的免费教程,讲的非常清楚! 目录 1.测试用例及代码 2.注意点 3 ...

  5. 白月黑羽教python之selenium:课后练习作业一

    白月黑羽教python之selenium:课后练习 最近自学了白月黑羽老师的自动化测试课程,并非课后作业的准确答案,只是为了个人学习记录,如有不足欢迎留言指点,谢谢大家. 测试用例截图 个人完成代码 ...

  6. 白月黑羽教python_其他 | 白月黑羽教Python

    都说Python执行效率不高,为什么还要学习它? 就像你买了一辆汽车,有人却说, 汽车开的比飞机慢多了,买什么汽车啊. 然而,生活中大部分的场合,用汽车比用飞机方便的多. 同样的道理通常你开发的程序( ...

  7. 白月黑羽教python_白月黑羽Python在线教程

    推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程,帮助大家迅速掌握程序开发技能. http://www.python3.vip/doc/tutorial/p ...

  8. Python Qt 一个案例

    本文作者官网 白月黑羽教Python 从一个示例开始 点击这里,边看视频讲解,边学习以下内容 现在我们要开发一个程序,让用户输入一段文本包含:员工姓名.薪资.年龄. 格式如下: 薛蟠 4560 25 ...

  9. 白月黑羽python_白月黑羽Python在线教程

    推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程,帮助大家迅速掌握程序开发技能. http://www.python3.vip/doc/tutorial/p ...

最新文章

  1. Android 使用 ellipsize 实现文字横向移动效果(跑马灯效果)
  2. iSCSI原理和实现
  3. 图像分割综述【深度学习方法】
  4. solr怎么设置搜索结果排名靠前?
  5. arrive get
  6. 编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
  7. linux - 虚拟机的自动安装与dhcp
  8. numpy支持比python更多的数据类型_NumPy数据类型
  9. Python实现单向链表
  10. 机器学习爬大树之决策树(CART与剪枝)
  11. (收集)vim72 .vimrc的一个样本
  12. ElasticSearch的基本用法与集群搭建
  13. java并发编程(二)synchronized
  14. k2p路由器搭建php,K2P新手教程之openwrt cc 基础设置
  15. 【操作系统】GPT和MBR分区的区别
  16. 数据库应用之关系代数(relational algebra)
  17. 移动端日历插件_好用的记事日历本桌面日历
  18. montypython买火柴_python nltk 笔记(持续更新)
  19. C#零基础入门运动控制学习教程(3)--定长加减速运动实验
  20. hx-2.4g-rx-2_Rx-如果话务员可以讲话!

热门文章

  1. Socket代理神器客户端Proxifier+服务端ss5
  2. java中的方法递归
  3. tryParse的用法。
  4. 各种PLC电缆的制作方法1_过路老熊_新浪博客
  5. h2ouve工具使用_‎证照采集星-超好用的证件照批量采集工具 v App Storu
  6. java鸭子类型_语言设计中的鸭子类型风格
  7. GitHub上最牛逼的10个Java项目,号称Star收割机,Dubbo只能排 12
  8. linux系统下升级pip
  9. Mac 系统占用100G+解决办法(详细步骤)
  10. img标签图片加载失败时兜底图的设置