PyQt5学习笔记2-GUI编程简介-1
通过三个简单软件程序分析,找到PyQt GUI编程的感觉!
(源自《Rapid GUI Programming with Python and Qt》,本文将示例由Qt4改成Qt5版本)
软件一:闹钟
1. 需求说明
a. 软件启动后,在后台运行,一旦到了事先给定的目标时间,弹出一条文本信息。
b. 弹出的信息,10秒后自动关闭,软件终止运行。
c. 类似使用命令行这样运行软件:
$ python3 alert.py 12:00 Have a rest
2. 实现代码
a. 未注释版本,尝试看看是否理解?
import sys import time from PyQt5.QtCore import * from PyQt5.QtWidgets import * app = QApplication(sys.argv) try: due = QTime.currentTime() message = "Alert!" if len(sys.argv) < 2: raise ValueError hours, mins = sys.argv[1].split(":") due = QTime(int(hours), int(mins)) if not due.isValid(): raise ValueError if len(sys.argv) > 2: message = " ".join(sys.argv[2:]) except ValueError: message = "Usage: alert.pyw HH:MM [optional message]" # 24hr clock while QTime.currentTime() < due: time.sleep(20) # 20 seconds label = QLabel("<font color=red size=72><b>{}</b></font>" .format(message)) label.setWindowFlags(Qt.SplashScreen) label.show() QTimer.singleShot(30000, app.quit) app.exec_()
b. 带注释的版本
1 import sys # 导入sys模块是需要读取sys.argv列表中的命令行参数信息 2 import time # 导入time模块是要使用sleep()函数 3 from PyQt5.QtCore import * # 要使用QTime类 4 from PyQt5.QtWidgets import * # 要使用图形控件QLabel类 5 6 # 每个PyQt GUI应用程序都必须有一个QApplication对象。 7 # 这个对象提供访问全局信息的能力,如程序目录、屏幕大小等。 8 # 还会提供事件循环 9 app = QApplication(sys.argv) 10 11 try: 12 due = QTime.currentTime() # 初始化目标时间为当前时间 13 message = "Alert!" # 初始化默认的提示信息 14 15 # 若未给定命令行参数,则抛出此异常,给出一条提示信息说明"用法" 16 if len(sys.argv) < 2: 17 raise ValueError 18 19 hours, mins = sys.argv[1].split(":") 20 due = QTime(int(hours), int(mins)) 21 22 # 若目标时间参数格式无效,则抛出此异常 23 if not due.isValid(): 24 raise ValueError 25 26 if len(sys.argv) > 2: 27 message = " ".join(sys.argv[2:]) 28 29 # 抛出异常时的处理,给出"用法"提示 30 except ValueError: 31 message = "Usage: alert.pyw HH:MM [optional message]" # 24hr clock 32 33 # 把当前时间和目标循环的进行比较,一旦超过了目标时间,循环就停止。 34 while QTime.currentTime() < due: 35 print(due.toString(), QTime.currentTime().toString()) 36 time.sleep(10) # 每隔20秒比较一次,等待期间cpu可给其他应用程序使用 37 38 # 窗口控件QLabel可处理HTML文本,这里为加黑、红色、大小为72像素 39 # 在PyQt中任何窗口控件都可以作为顶级窗口,标签/按钮等都可以 40 label = QLabel("<font color=red size=72><b>{}</b></font>" 41 .format(message)) 42 #label.setWindowFlags(Qt.SplashScreen) 43 label.show() # 显示标签信息,会触发绘制事件paint 44 45 # 启动定时器,等待30秒后触发超时事件,用于执行slot: app.quit,以终止程序。 46 QTimer.singleShot(30000, app.quit) 47 48 # 调用app.exec_()会开始执行QApplication对象的事件循环。 49 # 第一个事件是绘制事件, 标签会带着指定的信息显示在屏幕上。 50 # 第二个事件是定时器超时事件,即30秒后调用QApplication.quit()关闭窗口、释放资源、退出程序。 51 app.exec_()
3. 小结
GUI应用程序不同于普通的批处理程序,GUI程序会有一个一直在运行的事件循环,检查诸如鼠标点击/键盘按下或定时器超时、窗口绘制等系统事件,并且可以在需要程序终止时结束程序。