4.1.1 弹出闹钟
# -*-coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, time
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:])
while QTime.currentTime() < due:
time.sleep(1)
label = QLabel("<font size=72 color=red><b>" + message.decode("gbk") + "</b></font>") # 因为测试环境是windows且参数加了中文,所以加入此行来转换编码, 吐血的2.x版本
label.setWindowFlags(Qt.SplashScreen)
label.show()
app.exec_()
except ValueError:
print "error"
4.2.1 表达式求值
# -*-coding: utf-8 -*-
from __future__ import division
import sys
from math import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent) # 这个参数parent, QDialog有什么用,如果大家看到请告知
self.brower = QTextBrowser()
self.lineedit = QLineEdit(u"输入表达式并按enter键来求值")
self.btn_close = QPushButton(u"关闭")
self.lineedit.selectAll()
layout = QVBoxLayout()
layout.addWidget(self.brower) # 在QVBoxLayout对象里装载进QTextBrowser对象, 即一个大窗口包含一个文本窗口
layout.addWidget(self.lineedit) # 文本窗口下面, 已经有了输入提示框
layout.addWidget(self.btn_close) # 添加关闭按钮
self.setLayout(layout) # 应该是初始化窗口,这句挺重要不然不会有窗口显示
self.lineedit.setFocus()
self.connect(self.lineedit, SIGNAL("returnPressed()"), self.updateUi)
self.connect(self.btn_close, SIGNAL("clicked()"), self.closex)
self.setWindowTitle(u"简易计算器")
def updateUi(self):
try:
text = unicode(self.lineedit.text())
self.brower.append("{0} = <b>{1}</b>".format(text, eval(text))) # 字符串做了一下处理,用format函数更优雅
except:
self.brower.append("<font color=red>{0} 是错误字符,程序不能理解!</font>".format(text))
def closex(self):
exit(0) # 转向内核态, 由系统结束进程
app = QApplication(sys.argv)
form = Form()
form.show()
app.setQuitOnLastWindowClosed(False) # 不销毁程序,只是隐藏
app.exec_()
4.3 当前汇率计算
# -*-coding: utf-8 -*-
from __future__ import division
import sys
import json
import requests
from math import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Form(QDialog):
"""
todo: 货币转换程序,书中的urllib2 操作不符合个人习惯,用requests替换了, 如果要运行请安装它,
由于书中的API已经不能用了,所以API也替换了,数据格式和书中不太一样请注意
"""
def __init__(self, parent=None):
super(Form, self).__init__(parent)
date = self.getdata()
rates = sorted(self.rates.keys())
print rates
dateLabel = QLabel(date)
self.fromComboBox = QComboBox()
self.fromComboBox.addItems(rates)
self.fromSpinBox = QDoubleSpinBox()
self.fromSpinBox.setRange(0.01, 100000000.00)
self.fromSpinBox.setValue(1.00)
self.toComboBox = QComboBox()
self.toComboBox.addItems(rates)
self.toLabel = QLabel("1.00")
grid = QGridLayout() # 使用网格布局
grid.addWidget(dateLabel, 0, 0)
grid.addWidget(self.fromComboBox, 1, 0)
grid.addWidget(self.fromSpinBox, 1, 1)
grid.addWidget(self.toComboBox, 2, 0)
grid.addWidget(self.toLabel, 2, 1)
self.setLayout(grid)
self.connect(self.fromComboBox, SIGNAL("currentIndexChanged(int)"), self.updateUi)
self.connect(self.toComboBox, SIGNAL("currentIndexChanged(int)"), self.updateUi)
self.connect(self.fromSpinBox, SIGNAL("valueChanged(double)"), self.updateUi)
self.setWindowTitle(u"货币转换")
def updateUi(self):
to = unicode(self.toComboBox.currentText())
froms = unicode(self.fromComboBox.currentText()) # from 命名冲突, 更改为froms
amount = (self.rates[to] / self.rates[froms]) * self.fromSpinBox.value()
self.toLabel.setText("{0}".format(round(amount, 2)))
def getdata(self):
self.rates = {}
try:
fh = requests.get("https://api.fixer.io/latest")
if fh.status_code == 200:
fh = fh.content
init_fh = json.loads(fh)
self.rates = init_fh["rates"]
return u"当前汇率日期为:{0}".format(init_fh["date"])
except Exception, e:
return u"错误提示:{0}".format(e)
app = QApplication(sys.argv)
convertForm = Form()
convertForm.show()
app.exec_()
待更新..........