Python Qt 学习笔记(二) 一个案例:统计薪资
目标
开发一个程序,让用户输入一段文本包含:员工姓名、薪资、年龄。
把薪资在 2万 以上、以下的人员名单分别打印出来。
薛蟠 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
制作界面
1 from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit 2 3 # QApplication提供了整个图形界面程序的底层管理功能,如初始化、事件的发送 4 app = QApplication([]) 5 6 # 创建主窗口类的实例 7 window = QMainWindow() 8 window.resize(500, 400) 9 window.move(300, 310) 10 window.setWindowTitle('薪资统计') 11 12 # 指定QPlainTextEdit的父控件对象为QMainWindow 13 textEdit = QPlainTextEdit(window) 14 textEdit.setPlaceholderText("请输入薪资表") 15 textEdit.move(10, 25) 16 textEdit.resize(300, 350) 17 18 button = QPushButton('统计', window) 19 button.move(380, 80) 20 21 window.show() 22 23 # exec_()方法的作用是进入程序的主循环直到exit()被调用,可以简单理解为不让程序闪退 24 app.exec_()
运行
界面动作处理 (signal 和 slot)
首先要解决第一个问题:用户点击了统计按钮,怎么通知给程序
这里用到了Qt的信号与槽的机制
我们在程序中定义一个这样的函数,按钮被点击后,打印这段话
def handleCalc(): print('统计按钮被点击了')
再添加一个按钮事件
button.clicked.connect(handleCalc)
完整代码
1 from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit 2 3 4 def handleCalc(): 5 print("统计按钮被点击了") 6 7 8 app = QApplication([]) 9 10 window = QMainWindow() 11 window.resize(500, 400) 12 window.move(300, 310) 13 window.setWindowTitle('薪资统计') 14 15 textEdit = QPlainTextEdit(window) 16 textEdit.setPlaceholderText("请输入薪资表") 17 textEdit.move(10, 25) 18 textEdit.resize(300, 350) 19 20 button = QPushButton('统计', window) 21 button.move(380, 80) 22 button.clicked.connect(handleCalc) 23 24 window.show() 25 26 app.exec_()
点击按钮后
实现
splitlines()方法
按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
语法:
str.splitlines([keepends])
strip()方法
用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
split()方法
通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
语法:
str.split(str="", num=string.count(str)).
-
str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
-
num -- 分割次数。默认为 -1, 即分隔所有。
返回分割后的字符串列表。
1 from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, \ 2 QPlainTextEdit, QMessageBox 3 4 5 def handleCalc(): 6 info = textEdit.toPlainText() 7 8 salary_above_20k = "" 9 salary_below_20k = "" 10 for line in info.splitlines(): 11 if not line.strip(): 12 continue 13 parts = line.split(" ") 14 parts = [p for p in parts if p] 15 name, salary, age = parts 16 if int(salary) >= 20000: 17 salary_above_20k += name + "\n" 18 else: 19 salary_below_20k += name + "\n" 20 21 QMessageBox.about(window, "统计结果", 22 f'''薪资 20000 以上的有:\n{salary_above_20k} 23 \n薪资 20000 一下的有:\n{salary_below_20k}''' 24 ) 25 26 27 app = QApplication([]) 28 29 window = QMainWindow() 30 window.resize(500, 400) 31 window.move(300, 310) 32 window.setWindowTitle('薪资统计') 33 34 textEdit = QPlainTextEdit(window) 35 textEdit.setPlaceholderText("请输入薪资表") 36 textEdit.move(10, 25) 37 textEdit.resize(300, 350) 38 39 button = QPushButton('统计', window) 40 button.move(380, 80) 41 button.clicked.connect(handleCalc) 42 43 window.show() 44 45 # exec_()方法的作用是进入程序的主循环直到exit()被调用,可以简单理解为不让程序闪退 46 app.exec_()
封装到类中
通常把 一个窗口和其包含的控件,对应的代码全部封装到类中,有利于代码的模块化
1 from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit, QMessageBox 2 3 4 class Stats(): 5 def __init__(self): 6 self.window = QMainWindow() 7 self.window.resize(500, 400) 8 self.window.move(300, 300) 9 self.window.setWindowTitle('薪资统计') 10 11 self.textEdit = QPlainTextEdit(self.window) 12 self.textEdit.setPlaceholderText("请输入薪资表") 13 self.textEdit.move(10, 25) 14 self.textEdit.resize(300, 350) 15 16 self.button = QPushButton('统计', self.window) 17 self.button.move(380, 80) 18 19 self.button.clicked.connect(self.handleCalc) 20 21 def handleCalc(self): 22 info = self.textEdit.toPlainText() 23 24 # 薪资20000 以上 和 以下 的人员名单 25 salary_above_20k = '' 26 salary_below_20k = '' 27 for line in info.splitlines(): 28 if not line.strip(): 29 continue 30 parts = line.split(' ') 31 # 去掉列表中的空字符串内容 32 parts = [p for p in parts if p] 33 name, salary, age = parts 34 if int(salary) >= 20000: 35 salary_above_20k += name + '\n' 36 else: 37 salary_below_20k += name + '\n' 38 39 QMessageBox.about(self.window, 40 '统计结果', 41 f'''薪资20000 以上的有:\n{salary_above_20k} 42 \n薪资20000 以下的有:\n{salary_below_20k}''' 43 ) 44 45 46 app = QApplication([]) 47 stats = Stats() 48 stats.window.show() 49 app.exec_()