好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 shyoldboy 于 2021-7-31 09:35 编辑
计算器实现可以以一个思维导图的形式表现出来
上面就是我写计算器的思路
下面是我所写的代码
需要下载 PyQt5
cmd到命令行工具
执行下载命令 pip install PyQt5
[Python] 纯文本查看 复制代码 import decimal
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QVBoxLayout,QWidget
import sys
class tWindow(QWidget):
def __init__(self) -> None:
super().__init__()
self.firstnum = '' # 记录输入的第一个数据
self.secondnum = ''# 记录输入的第二个数据
self.fuhao = ''# 记录输入的算数运算符信息
self.beforestr = '' # 记录点击该按钮之前的点击信息
self.inittabUI() # 初始化界面方法
def numys(self): # 对两个数进行操作
if self.fuhao == '+': # '0.12' + '0.21'
return decimal.Decimal(self.firstnum) + decimal.Decimal(self.secondnum)
elif self.fuhao == '-':
return decimal.Decimal(self.firstnum) - decimal.Decimal(self.secondnum)
elif self.fuhao == '*':
return decimal.Decimal(self.firstnum) * decimal.Decimal(self.secondnum)
elif self.fuhao == '/':
return decimal.Decimal(self.firstnum) / decimal.Decimal(self.secondnum)
def click(self): # 所有按钮的点击事件
key = self.sender().text() # 获取所点击按钮的值
# 如果输入的是运算符号,则清空文本框数据并记录
if key in ('+','-','*','/'): # 根据值的不同来确定那个按钮被点击
text = self.qline.text() # 获取文本框的值
'''
和实体计算器一样,文本框默认值是0
本步骤是为了拼接第二个数的逻辑
如果不为0则存储数据和符号'''
if text != '' and self.fuhao == '':
self.firstnum += text # 如果不为0说明,文本框有值,符号为空,说明此次输入为第一次输入。故存储第一个值
self.fuhao = key # 并将符号进行存储
elif text != '' and self.fuhao != '':
self.secondnum = text # 如果符号不为空,且文本框有值
# 将运算结果放在上面
self.qline.setText(self.numys()) #调用运算方法并给文本框进行设置
self.firstnum = self.numys() # 然后将该值赋给第一个值,是为了存储前面的结果给下一次计算使用,功能正在实现中。。。。。
self.beforestr = key # 最后记录本次点击的痕迹
# 如果输入的是等于号,则将运算结果展示在文本框
elif key in ('0','1','2','3','4','5','6','7','8','9','.'):
if self.beforestr in ('+','-','*','/'): #如果上一次输入是运算符,清空,重新输入第二个值
self.qline.clear()
text = self.qline.text()
text += key
while(text[0] == ''):
text = text[1:]
self.qline.setText(text)
else: # 如果不是的话,追加到数值上面
'''追加数字'''
text = self.qline.text()
text += key
while(text[0] == ''):
text = text[1:]
self.qline.setText(text)
self.beforestr = key
# 如果输入的Cls则将 数据清空
elif key == 'Cls':
self.firstnum = ''
self.secondnum = ''
self.fuhao = ''
self.qline.clear() #将所有值清空,将文本框的值设置成默认值
elif key == 'Bck':
text = self.qline.text()
text = text[-len(text):-1] # 利用切片一直切到最后一位
self.qline.setText(text)
elif key == '=':
text = self.qline.text() #如果点等于的话,直接获取文本框的数值
self.secondnum = text
sum = self.numys() # 进行运算
#符号清空
self.qline.setText(str(sum)) # 将总和设置到文本框上面
self.fuhao = '' # 对符号进行清空
self.firstnum = ''
self.secondnum = ''
def inittabUI(self):
# 添加文本框
self.qline = QLineEdit()
self.qline.setPlaceholderText('0')
self.qline.setAlignment(QtCore.Qt.AlignRight)
# self.qline.setEnabled(False)
self.qline.setFocusPolicy(QtCore.Qt.NoFocus)
grid = QGridLayout()
self.setLayout(grid)
names = ['Cls', 'Bck', 'CE', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i,j) for i in range(1,6) for j in range(4)]
grid.addWidget(self.qline,0,0,1,4)
for position,name in zip(positions,names):
button = QPushButton(name)
button.clicked.connect(self.click)
grid.addWidget(button, *position)
# self.move(300, 150)
self.setWindowTitle('Calculator')
# self.setFixedSize(self.width(), self.height());
self.setWindowIcon(QIcon(r'D:\workspace\pyqt入门\b11.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
tw = tWindow()
sys.exit(app.exec_())
计算器仅仅实现了基础的操作,对于一些非法情况未作详细处理
思维导图未对GUI的部分进行详细描述,有想了解的,回复我,再对此做详细制作
对于本篇博客,有什么好的呈现方式,大家可以共同探讨一下。
上次有个大佬说有个方法eval()可以实现,这个函数是对算式(eg:1+2*4+3)进行操作并返回数值的函数
上面的计算器思路是传统计算器,不是这种算式形式,下面的代码借用原有代码 实现了这种算式的操作
代码如下:
[Python] 纯文本查看 复制代码 from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QVBoxLayout,QWidget
import sys
class tWindow(QWidget):
def __init__(self) -> None:
super().__init__()
self.text = ''
self.inittabUI() # 初始化界面方法
def numys(self,str1): # 对两个数进行操作
return str(eval(str1))
# def text_changed(self):
# print('改变了')
def click(self): # 所有按钮的点击事件
key = self.sender().text() # 获取所点击按钮的值
# 如果输入的是运算符号,则清空文本框数据并记录
if key in ('+','-','*','/'): # 根据值的不同来确定那个按钮被点击
self.text = self.qline.text() # 获取文本框的值,进行追加
self.text += key
self.qline.setText(self.text)
# 如果输入的是等于号,则将运算结果展示在文本框
elif key in ('0','1','2','3','4','5','6','7','8','9','.'):
self.text = self.qline.text() # 获取文本框的值,进行追加
self.text += key
self.qline.setText(self.text)
# 如果输入的Cls则将 数据清空
elif key == 'Cls':
self.qline.clear() #将所有值清空,将文本框的值设置成默认值
elif key == 'Bck':
text = self.qline.text()
text = text[-len(text):-1] # 利用切片一直切到最后一位
self.qline.setText(text)
elif key == '=':
text = self.qline.text() #如果点等于的话,直接获取文本框的数值
sum = self.numys(text) # 进行运算
self.qline.setText(sum)
def inittabUI(self):
# 添加文本框
self.qline = QLineEdit()
self.qline.setPlaceholderText('0')
self.qline.setAlignment(QtCore.Qt.AlignRight)
# self.qline.setEnabled(False)
self.qline.setFocusPolicy(QtCore.Qt.NoFocus)
grid = QGridLayout()
self.setLayout(grid)
names = ['Cls', 'Bck', 'CE', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i,j) for i in range(1,6) for j in range(4)]
grid.addWidget(self.qline,0,0,1,4)
for position,name in zip(positions,names):
button = QPushButton(name)
button.clicked.connect(self.click)
grid.addWidget(button, *position)
# self.move(300, 150)
self.setWindowTitle('Calculator')
# self.setFixedSize(self.width(), self.height());
self.setWindowIcon(QIcon(r'D:\workspace\pyqt入门\b11.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
tw = tWindow()
sys.exit(app.exec_())
本次就更新了另一种计算器实现方式
欢迎留言,欢迎批评指正,下次对代码进行重构,使得代码更加美丽,后期会使用面向对象来实现 |
免费评分
-
查看全部评分
|