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程序会有一个一直在运行的事件循环,检查诸如鼠标点击/键盘按下或定时器超时、窗口绘制等系统事件,并且可以在需要程序终止时结束程序。

posted @ 2017-12-10 16:52  aiTest  阅读(1188)  评论(0编辑  收藏  举报