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

  • 相关阅读:
    Thymeleaf踩坑:[[ 和 ]] 被当做表达式解析,但是想要的就是数组,怎么办?
    RoamEdit 邀请码
    python:新版xlrd报 Excel xlsx file; not supported
    JavaFX学习:快捷键
    JavaFX学习:键盘事件
    JavaFX学习:连续点击事件
    JavaFX学习:Button基本使用
    (转)IDEA 更新插件时报错 SSL error probably caused by disabled SNI
    TextControl技术互助
    一个简单的Webservice的demo(中)_前端页面调用
  • 原文地址:https://www.cnblogs.com/atsats/p/8016686.html
Copyright © 2011-2022 走看看