PyQt4 25行的弹出式闹钟

应用特点

  • 控制台启动
  • 没有装饰栏
  • 没有标题栏
  • 没有系统菜单
  • 没有关闭按钮

运行效果

启动后,程序会在后台默默运行,仅是简单地记录时间直到达到给定的时间。此时,程序会弹出一个文本消息窗口。大约窗口显示后一分钟,程序会自动终止。

源代码

# encoding:utf-8

import sys
import time

from PyQt4 import QtCore
from PyQt4 import QtGui

# sys.argv用于访问命令行参数
app = QtGui.QApplication(sys.argv)

# handle the argv
try:
    due = QtCore.QTime.currentTime()
    message = 'Alert!'
    if len(sys.argv) < 2:
        raise ValueError
    hours, mins = sys.argv[1].split(':')
    due = QtCore.QTime(int(hours), int(mins))
    if not due.isValid():
        raise ValueError
    if len(sys.argv) > 2:
        message = ' '.join(sys.argv[2:])
except ValueError:
    # 24hr clock
    message = 'Usage: alarm_clock.py HH:MM [optional message]'

while QtCore.QTime.currentTime() < due:
    # 20 seconds
    time.sleep(20)

label = QtGui.QLabel('<font color=red size=72><b>' + message + '</b></font>')
label.setWindowFlags(QtCore.Qt.SplashScreen)
label.show()
# 1 minute
QtCore.QTimer.singleShot(60000, app.quit)

app.exec_()

解析

import sys
import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *

导入sys模块,是因为我们想访问包含在sys.argv列表中的那些命令行参数,导入·模块,则是因为我们需要它的sleep()函数;而导人这两个PyQt模块,则是因为需要使用 GUIQTime类。

# sys.argv用于访问命令行参数
app = QtGui.QApplication(sys.argv)

先从创建QApplication对象开始。每个PyQt GUI应用程序都必须有一个QApplication对象。这个对象会提供访问全局信息的能力,如应用程序的目录、屏幕大小(以及对于多线程 系统来说,这个应用程序是在哪个屏上)等。这个对象还会提供稍后要讨论的事件循环。

在创建QApplication对象时,给它传递了命令行参数;这是因为,PyQt可以识别一些 自己的参数,如-geometry-style,所以需要给一个让它读到这些参数的机会。如果 QApplication能够识别任意一个参数,它就会对它们进行一些操作,并将其从给定的参数 列表中移除掉。QApplication能够识别的那些参数列示在QApplication的初始化文档中。

当程序中存在上述语句时,会报错如下:

QWidget: Must construct a QApplication before a QPaintDevice

参数处理:

# handle the argv
try:
    due = QtCore.QTime.currentTime()
    message = 'Alert!'
    if len(sys.argv) < 2:
        raise ValueError
    hours, mins = sys.argv[1].split(':')
    due = QtCore.QTime(int(hours), int(mins))
    if not due.isValid():
        raise ValueError
    if len(sys.argv) > 2:
        message = ' '.join(sys.argv[2:])
except ValueError:
    # 24hr clock
    message = 'Usage: alarm_clock.py HH:MM [optional message]'

在比较靠后的地方,这个程序需要一个时间点,所以把due变量值设定为现在的时间。我们 还提供了一个默认消息。如果用户没有给定哪怕至少一个的命令行参数值(时间),就会抛出 (raise)一个ValueError异常。这样就会显示一个当前时间,并且会给出含有“用法”错误的消息

如果第一个参数不含冒号,那么在尝试调用split将两个元素解包时,就将触发一个ValueError的异常。如果小时数和分钟数不是有效的数字,那么int()将会触发一个ValueError异常; 而如果小时数和分钟数超限,导致成了无效的QTime, 那么就需要自 己来触 发一个ValueError异常。尽管Python提供了自己的datetime类,但PyQtdatetime类通常会显得更为方便些,所以推荐使用PyQt的这些类。

如果该time有效,那么就把这条消息与其他命令行参数(如果还有的话)用空格分隔开; 如果没有其他参数,就用开头设置的默认信息“Alert!”来代替之(当一个程序是用命令行方式 启动时,会给定一系列的参数,第一个称为调用名,而剩下的其他非空字符,也就是输人命令 行中的其他每个单词,都称为字符序列。这些字符序列或许会被shell改变,例如,可能会用 通配符进行匹配。Python自己的字符序列位于sys.argv列表中)。

while QtCore.QTime.currentTime() < due:
    # 20 seconds
    time.sleep(20)

把当前时间和目标时间连续不断地进行循环比较。如果当前时间超过了目标时间,循环就会停止。原本是可以在循环体内放一个pass声明(statement)的,但如果是这样的话,Python就 会非常快地一遍遍执行这个循环,而过多地占用处理器可不是什么好现象,time.sleep()命令会让Python暂停处理一段时间后再继续处理,这里暂停的时间是20秒。这样就可以让机器上的其他程序也能够得到更多的运行机会,因为我们也不想在等这个程序到达截止时间的期间什么也不做。暂且先不提创建QApplication对象,目前所做的仅仅就是标准的控制台程序设计工作。

label = QtGui.QLabel('<font color=red size=72><b>' + message + '</b></font>')
label.setWindowFlags(QtCore.Qt.SplashScreen)
label.show()
# 1 minute
QtCore.QTimer.singleShot(60000, app.quit)

app.exec_()

在创建了 QApplication对象后,就会显示一条消息,因为截止时间已到,所以现在就可以 创建程序了。一个GUI程序需要一些窗口部件,这样就需要用有一个标签(labe)来显示该消 息。QLabel可以接收HTML文本,所以就给它一个HTML字符串,让它能够将这段消息显示 为加黑、红色、大小为72点素(point)①。

PyQt中,任何窗口部件都可以作为顶级窗口,即使是按钮和标签都行。当窗口部件这么用的时候,PyQt就会自动给它加一个标题栏。在这个应用程序中,并不想要一个标题栏,所 以要把该标签的各个窗口标记(flag)均设置为闪屏(splash screen)模式,因为这种模式不会有标题栏了。一旦把要作为窗口的标签设置完毕,就可以对其调用show()函数了。此时,该标 签窗口却没有显示出来show ()的调用仅仅是计划执行一个“重绘事件”(paim event),也就 是说,show ()会向QApplication对象的事件队列中添加一个新的事件,以请求对特定的窗口部件进行绘制。

接下来,会设置一个单次定时器(single-shot timer)。这是因为Python库的time.sleep 函数使用的时间是秒,而QTiraer.singleShot()函数使用的是毫秒。给singleShot()方法 两个参数:让这个时间需要持续多长(这里是1分钟),时间到期后调用哪个函数或者方法。

PyQt的术语来说,上述给出的方法或者函数叫做“槽"(slot),尽管在PyQt的文档中,也会用术语“可调用”(callable)、“ Python 槽”(Python slot)和“Qt”槽(Qt slot)来区分 Python_slots_,这是在Python语言指南(Python Language Reference)中给出的一个新特性类。所以现在要计划执行两个事件:一个是需要立即执行的绘制(paint)事件,一个是需要在一分钟后执行的定时器(timer)超时事件。

调用app.exec_()会开始执行QApplication对象的事件循环①。第一个事件就是绘制事件,所以标签窗口会带着给定的消息显示在屏幕上。大约一分钟之后,会发生定时器的超时 事件,此时会调用QApplication.quit方法。这个方法会干净地结束掉该GUI应用程序。 它会关闭所有已打开的窗口,释放所有占用的资源,然后退出程序。

时间: 2024-08-02 20:26:20

PyQt4 25行的弹出式闹钟的相关文章

IOS 弹出式 POPMenuView

//MenuView.h // //  MenuView.h //  RockPopMenu // //  Created by zhuang chaoxiao on 14-6-26. //  Copyright (c) 2014年 zhuang chaoxiao. All rights reserved. // #import <UIKit/UIKit.h> @protocol MenuViewDelegate @optional @end @interface MenuView : UIV

PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框

零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提供编辑类 弹出式和下拉式是如何实现的呢,这需要为属性提供一个专门的编辑类..Net为我们提供了一个System.Drawing.Design.UITypeEditor类,它是所有编辑类的基类,从他继承出了诸如ColorEditor.FontEditor的类,因此我们可以在属性框中编辑颜色和字体.定义

c#应用程序如何添加弹出式广告功能

使用c#语言,如何实现像搜狗输入法以及灵格斯翻译软件的屏幕右下角弹出式广告呢? c#code如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Run

从仿QQ消息提示框来谈弹出式对话框

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45896477 [导航] - 自定义弹出式对话框的简单用法 列举各种常见的对话框实现方案 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一

c#桌面应用程序如何添加弹出式广告

c#写的软件很多,如何添加诸如像搜狗输入法软件与灵格斯翻译软件的屏幕右下角弹出式广告呢. c#代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.

Operating System-Thread(5)弹出式线程&amp;&amp;使单线程代码多线程化会产生那些问题

本文主要内容 弹出式线程(Pop-up threads) 使单线程代码多线程化会产生那些问题 一.弹出式线程(Pop-up threads) 以在一个http到达之后一个Service的处理为例子来介绍弹出式线程. 上面的例子中传统的做法有可能是在Service中有一个线程一直在等待request的到达,等request到达后这个线程会开始检查请求最后在进行处理.当这个线程在处理request的时候,后面来的request会被block,一直到线程处理完当前request为止.如下图所示. 弹出

JavaScript弹出式日历控件 无jquery

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" cont

导航条——弹出式悬浮菜单

1.概述 采用弹出式悬浮菜单,不但可以使网站的导航内容更加清晰,而且不影响页面的整体效果.运行本实例,如图1所示,当鼠标移动到一级导航菜单的标题上时,将弹出悬浮菜单显示该菜单对应的子菜单,鼠标移出时,将隐藏悬浮菜单. 2.技术要点 本实例主要是在JavaScript中,动态改变<div>标签对象的style属性的display属性值来实现动态显示和隐藏二级导航菜单.其实,每一个一级菜单下的二级菜单内容是已经添加在网页的<div>标签中,只是此时设置了<div>不显示.所

让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面

其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么功能? 你先看看下面的图片,休息片刻,我再接下去为你简单说明下吧. 下载地址:登陆oa.ooofc.com,系统设置,用户中心设置,就可以看到了.要是看到见,请睁大眼睛噢. 账目号到期模板(用户到期,被限制上网的通告): 本页面使用红色和粉色搭配,让用户有较大的视角感受,同时同供二维码标识,您可以放