4.1 25行弹出式闹钟
import sys
import time
from PyQt5.QtCore import *
from PyQt5.QtGui import *
app = QApplication(sys.argv)
每个PyQt GUI应用程序都必须有一个QApplication对象。这个对象会提供访问全局信息的能力,如应用程序的目录、屏幕大小(以及对于多线程系统来说,这个应用程序是在哪个屏幕上)等。这个对象还会提供时间循环。
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("<fonr color = red size = 72><b>" + message + "</b></font>")
label = setWindowFlags(Qt.SplashScreen)
label.show()
QTimer.singleShot(60000,app.quit) # 1 minute
app.exec_()
一个GUI程序需要一些窗口部件,这样就需要用一个标签(label)来显示该消息。
4.2 30行的表达式求值程序
类会用表单(form)的形式来进行表示,用来响应用户交互的行为会由方法进行处理,而程序的‘main’部分则会很短小。
from __future__ import division
import sys
from math import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Form(QDialog):
def __init__(self,parent = None):
super(Form,self).__init__(parent)
self.browser = QTextBrowser()
self.lineedit = QLineEdit("Type an expression and press Enter")
self.lineedit.selectAll()
layout = QVBoxLayout()
layout.addWidget(self.browser)
layout.addWidget(self.lineedit)
self.setLayout(layout)
self.lineedit.setFocus()
self.connect(self.lineedit,SIGNAL("returnPressed()"),self.updateUi)
self.setWindowTitle("Calculate")
def updateUi(self):
try:
text = unicode(self.lineedit.text())
self.browser.append("%s = <b>%s</b>" % (text,eval(text)))
except:
self.browser.append("<font color=red> %s is invalid!</font>" %text)
app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()