经过前面5章的学习,学习了按钮控件QPushButton、可控文本控件QLineEdit以及提示消息框控件QMessageBox的应用。
这一章通过实践学习写一个功能完全的计算器小软件,进一步加强以上三个控件的学习及应用。
与此同时,还要学习一个新的静态文本控件的应用。
接下来,先让我们了解一下计算器小软件的风采:
源代码,臣妾双手奉上 :
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout, QMessageBox, QLabel, QFrame
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
import math
class Example(QWidget):
def __init__(self):
super().__init__()
self.Init_UI()
# 定义存储在文本中的变量
self.resultStr = ''
def Init_UI(self):
grid = QGridLayout()
self.setLayout(grid)
self.setGeometry(300,300,400,360)
self.setWindowTitle('我与PyQt5有个约会 -- 简易计算器')
self.setWindowIcon(QIcon('myico.ico'))
rowSpan = 5
self.calcQLabel = QLabel(self)
self.calcQLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
self.calcQLabel.setAlignment(Qt.AlignBottom | Qt.AlignRight)
self.calcQLabel.setStyleSheet("font-size:36px")
grid.addWidget(self.calcQLabel, 0, 0, rowSpan, 0)
grid.setSpacing(10)
names = ['7', '8', '9', 'DEL', 'AC',
'4', '5', '6', '*', '/',
'1', '2', '3', '+', '-',
'0', '%', 'PI', 'e', 'sqrt',
'^', 'sin', 'cos', 'tan', 'log',
'ln', '(', ')', '.', '=']
positions = [(y, x) for y in range(rowSpan + 1, rowSpan + 7) for x in range(0, 5)]
for position, name in zip(positions, names):
if name == '':
continue
button = QPushButton(name)
grid.addWidget(button, *position)
button.clicked.connect(self.OnQBtnClick)
self.show()
def OnQBtnClick(self):
mathFunc = ['sqrt', 'sin', 'cos', 'tan']
result = 'Error'
sender = self.sender().text()
print('sender is {}' .format(sender))
if sender == '=':
print("=")
for func in mathFunc:
if func in self.resultStr:
try:
result = str(eval('math.'+self.resultStr))
break
except: pass
if '^' in self.resultStr:
try:
temp = self.resultStr.split('^')
result = str(eval('pow('+temp[0]+','+temp[1]+')'))
except: pass
elif 'ln' in self.resultStr:
try:
result = str(eval('math.log'+self.resultStr[2:]))
except: pass
elif 'log' in self.resultStr:
try:
result = str(eval('math.log'+self.resultStr[3:]+'/math.log(10)'))
except: pass
else:
try:
result = str(eval(self.resultStr))
except: pass
print('result = {}' .format(result))
self.calcQLabel.setText(result)
elif sender == 'AC' :
'''click button "AC" to clear screen'''
self.resultStr = ''
self.calcQLabel.setText(self.resultStr)
elif sender == 'DEL' :
'''click button "DEL" to Undo'''
self.resultStr = self.resultStr[:-1]
self.calcQLabel.setText(self.resultStr)
elif sender == 'e' :
'''e=math.e'''
self.resultStr += str(math.e)
self.calcQLabel.setText(self.resultStr)
elif sender == 'PI' :
'''pi=3.1416'''
self.resultStr += str(math.pi)
self.calcQLabel.setText(self.resultStr)
else:
self.resultStr += sender
self.calcQLabel.setText(self.resultStr)
# 关闭程序
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
app.exit(app.exec_())
新增代码解析 :
# 创建一个静态文本QLabel控件
self.calcQLabel = QLabel(self)
# 给QLabel控件添加风格
self.calcQLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)
# 文字在QLabel控件中的放置位置
self.calcQLabel.setAlignment(Qt.AlignBottom | Qt.AlignRight)
# 文字在QLabel控件中的显示大小
self.calcQLabel.setStyleSheet("font-size:36px")
计算其中所有功能的实现:
def OnQBtnClick(self):
mathFunc = ['sqrt', 'sin', 'cos', 'tan']
result = 'Error'
sender = self.sender().text()
print('sender is {}' .format(sender))
if sender == '=':
print("=")
for func in mathFunc:
if func in self.resultStr:
try:
result = str(eval('math.'+self.resultStr))
break
except: pass
if '^' in self.resultStr:
try:
temp = self.resultStr.split('^')
result = str(eval('pow('+temp[0]+','+temp[1]+')'))
except: pass
elif 'ln' in self.resultStr:
try:
result = str(eval('math.log'+self.resultStr[2:]))
except: pass
elif 'log' in self.resultStr:
try:
result = str(eval('math.log'+self.resultStr[3:]+'/math.log(10)'))
except: pass
else:
try:
result = str(eval(self.resultStr))
except: pass
print('result = {}' .format(result))
self.calcQLabel.setText(result)
elif sender == 'AC' :
'''click button "AC" to clear screen'''
self.resultStr = ''
self.calcQLabel.setText(self.resultStr)
elif sender == 'DEL' :
'''click button "DEL" to Undo'''
self.resultStr = self.resultStr[:-1]
self.calcQLabel.setText(self.resultStr)
elif sender == 'e' :
'''e=math.e'''
self.resultStr += str(math.e)
self.calcQLabel.setText(self.resultStr)
elif sender == 'PI' :
'''pi=3.1416'''
self.resultStr += str(math.pi)
self.calcQLabel.setText(self.resultStr)
else:
self.resultStr += sender
self.calcQLabel.setText(self.resultStr)
这一章没有过多的解释,因为很多时候,授人以鱼,不如授之以渔,授人以鱼只救一时之急,授人以渔则可解一生之需。
不懂的地方,可以留言或者私信给我,看到后,我会第一时间解答。
谢谢,这一章就到这里。