【PyQt】超级超级笨的pyqt计算器案例
计算器
1.QT Designer设计外观
- 1.pushButton
- 2.textEdit
- 3.groupBox
- 4.布局设计
2.加载ui文件
导入模块:
-
sys:用于处理命令行参数。
-
QApplication:PyQt5 应用程序类。
-
QWidget:窗口基类。
-
uic:用于加载 .ui 文件。
-
QIcon:用于设置窗口图标。
MyWindow 类:
-
继承自 QWidget,用于创建主窗口。
-
init 方法中调用 self.init_ui() 初始化界面。
-
init_ui 方法中加载 .ui 文件并设置窗口图标和标题。
加载 .ui 文件:
-
使用 uic.loadUi(“./计算器.ui”) 加载 .ui 文件,并将其赋值给 self.ui。
-
self.ui 是一个包含 .ui 文件中所有控件的对象。
设置窗口图标和标题:
-
使用 setWindowIcon 设置窗口图标。
-
使用 setWindowTitle 设置窗口标题。
显示窗口:
- 在 if name == “main”: 中创建 QApplication 和 MyWindow 实例,并调用 w.ui.show() 显示窗口。
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./计算器.ui")
print(self.ui.__dict__) # 查看ui文件中有哪些控件
self.ui.setWindowIcon(QIcon('img.png'))
self.ui.setWindowTitle("傻瓜计算器") # 修改标题的名称
if __name__=="__main__":
app = QApplication(sys.argv)
w = MyWindow()
# 展示窗口
w.ui.show()
app.exec()
代码解释
超级呆瓜的初始化,刚开始学习QT有点呆,欢迎大家讨论,共同进步
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./计算器.ui",self)
# print(self.ui.__dict__) # 查看ui文件中有哪些控件
self.ui.setWindowIcon(QIcon('img.png'))
self.ui.setWindowTitle("计算器") # 修改标题的名称
self.x = ""
# 初始化控件
self.textEdit = self.ui.textEdit # 计算过程框
self.textEdit_2 = self.ui.textEdit_2 # 计算结果框
self.pushButton_1=self.ui.pushButton_1 # C :清零
self.pushButton_2 = self.ui.pushButton_2 # X:后退一格
self.pushButton_3 = self.ui.pushButton_3 # %:百分号
self.pushButton_4 = self.ui.pushButton_4 # /:除号
self.pushButton_5 = self.ui.pushButton_5 # 7
self.pushButton_6 = self.ui.pushButton_6 # 8
self.pushButton_7 = self.ui.pushButton_7 # 9
self.pushButton_8 = self.ui.pushButton_8 # *:乘号
self.pushButton_9 = self.ui.pushButton_9 # 4
self.pushButton_10 = self.ui.pushButton_10 # 5
self.pushButton_11 = self.ui.pushButton_11 # 6
self.pushButton_12 = self.ui.pushButton_12 # -:减法
self.pushButton_13 = self.ui.pushButton_13 # 1
self.pushButton_14 = self.ui.pushButton_14 # 2
self.pushButton_15 = self.ui.pushButton_15 # 3
self.pushButton_16 = self.ui.pushButton_16 # +:加法
self.pushButton_17 = self.ui.pushButton_17 # e
self.pushButton_18 = self.ui.pushButton_18 # 0
self.pushButton_19 = self.ui.pushButton_19 # .
self.pushButton_20 = self.ui.pushButton_20 # =:等号
# 设置框的样式
self.textEdit.setText("0")
self.textEdit.setAlignment(Qt.AlignRight) # # 设置文本右对齐
self.textEdit.setReadOnly(True) # 只能进行读取
self.textEdit.setStyleSheet("font-size: 24px; height: 60px;") # 设置字体样式
self.textEdit_2.setText("result")
self.textEdit_2.setAlignment(Qt.AlignRight) # # 设置文本右对齐
self.textEdit_2.setReadOnly(True) # 只能进行读取
self.textEdit_2.setStyleSheet("font-size: 24px; height: 60px;") # 设置字体样式
# 设置按钮格式
for i in range(20):
x = f"pushButton_{i+1}"
self.pushButton_name = getattr(self, x) # 动态访问按钮对象
self.pushButton_name.setStyleSheet("font-size: 18px; padding: 10px;")
self.text = self.pushButton_name.text()
self.pushButton_name.clicked.connect(lambda _, t=self.text: self.on_button_click(t))
简单的计算功能
- 清零
- 计算结果
- 显示文本
def on_button_click(self, text):
# 可以获取所有符号
print(text)
if text == 'C':
self.reset_calculator()
elif text == '=':
self.calculate_result()
else:
self.text_shaw(text)
清零
def reset_calculator(self):
self.textEdit.clear()
self.textEdit.setText("0")
self.textEdit.setAlignment(Qt.AlignRight) # 设置文本右对齐
self.textEdit.setReadOnly(True) # 只能进行读取
self.textEdit_2.setText("....")
self.textEdit_2.setAlignment(Qt.AlignRight) # 设置文本右对齐
self.textEdit_2.setReadOnly(True) # 只能进行读取
self.x = ""
计算结果
def calculate_result(self):
all_text = self.textEdit.toPlainText()
print(all_text)
print(type(all_text))
try:
result = sp.sympify(all_text)
print(f"表达式 '{all_text}' 的计算结果是: {result}")
self.textEdit_2.setText(f"{result}")
self.textEdit_2.setAlignment(Qt.AlignRight)
except sp.SympifyError as e:
print(f"无法解析表达式: {e}")
显示文本
def text_shaw(self,text):
self.x += f"{text}"
self.textEdit.setText(self.x)
self.textEdit.setAlignment(Qt.AlignRight)
键盘输出
def keyPressEvent(self, event):
key = event.text()
print(key)
if key in '0123456789.+-*/':
self.on_button_click(key)
print(key)
elif event.key() in (Qt.Key_Enter, Qt.Key_Return):
self.on_button_click('=')
elif event.key() == Qt.Key_Escape:
self.reset_calculator()
整体代码
import sys
import re
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
from PyQt5 import uic
import sympy as sp #计算的库,可以实现四则运算
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./计算器.ui",self)
# print(self.ui.__dict__) # 查看ui文件中有哪些控件
self.ui.setWindowIcon(QIcon('img.png'))
self.ui.setWindowTitle("计算器") # 修改标题的名称
self.x = ""
# 初始化控件
self.textEdit = self.ui.textEdit # 计算过程框
self.textEdit_2 = self.ui.textEdit_2 # 计算结果框
self.pushButton_1=self.ui.pushButton_1 # C :清零
self.pushButton_2 = self.ui.pushButton_2 # X:后退一格
self.pushButton_3 = self.ui.pushButton_3 # %:百分号
self.pushButton_4 = self.ui.pushButton_4 # /:除号
self.pushButton_5 = self.ui.pushButton_5 # 7
self.pushButton_6 = self.ui.pushButton_6 # 8
self.pushButton_7 = self.ui.pushButton_7 # 9
self.pushButton_8 = self.ui.pushButton_8 # *:乘号
self.pushButton_9 = self.ui.pushButton_9 # 4
self.pushButton_10 = self.ui.pushButton_10 # 5
self.pushButton_11 = self.ui.pushButton_11 # 6
self.pushButton_12 = self.ui.pushButton_12 # -:减法
self.pushButton_13 = self.ui.pushButton_13 # 1
self.pushButton_14 = self.ui.pushButton_14 # 2
self.pushButton_15 = self.ui.pushButton_15 # 3
self.pushButton_16 = self.ui.pushButton_16 # +:加法
self.pushButton_17 = self.ui.pushButton_17 # e
self.pushButton_18 = self.ui.pushButton_18 # 0
self.pushButton_19 = self.ui.pushButton_19 # .
self.pushButton_20 = self.ui.pushButton_20 # =:等号
# 设置框的样式
self.textEdit.setText("0")
self.textEdit.setAlignment(Qt.AlignRight) # # 设置文本右对齐
self.textEdit.setReadOnly(True) # 只能进行读取
self.textEdit.setStyleSheet("font-size: 24px; height: 60px;") # 设置字体样式
self.textEdit_2.setText("result")
self.textEdit_2.setAlignment(Qt.AlignRight) # # 设置文本右对齐
self.textEdit_2.setReadOnly(True) # 只能进行读取
self.textEdit_2.setStyleSheet("font-size: 24px; height: 60px;") # 设置字体样式
# 设置按钮格式
for i in range(20):
x = f"pushButton_{i+1}"
self.pushButton_name = getattr(self, x) # 动态访问按钮对象
self.pushButton_name.setStyleSheet("font-size: 18px; padding: 10px;")
self.text = self.pushButton_name.text()
self.pushButton_name.clicked.connect(lambda _, t=self.text: self.on_button_click(t))
# 实现了按键显示
def on_button_click(self, text):
# 可以获取所有符号
print(text)
if text == 'C':
self.reset_calculator()
elif text == '=':
self.calculate_result()
else:
self.text_shaw(text)
def reset_calculator(self):
self.textEdit.clear()
self.textEdit.setText("0")
self.textEdit.setAlignment(Qt.AlignRight) # 设置文本右对齐
self.textEdit.setReadOnly(True) # 只能进行读取
self.textEdit_2.setText("....")
self.textEdit_2.setAlignment(Qt.AlignRight) # 设置文本右对齐
self.textEdit_2.setReadOnly(True) # 只能进行读取
self.x = ""
def calculate_result(self):
all_text = self.textEdit.toPlainText()
print(all_text)
print(type(all_text))
try:
result = sp.sympify(all_text)
print(f"表达式 '{all_text}' 的计算结果是: {result}")
self.textEdit_2.setText(f"{result}")
self.textEdit_2.setAlignment(Qt.AlignRight)
except sp.SympifyError as e:
print(f"无法解析表达式: {e}")
result = re.split(r"([+*/-])", all_text) # 保留分隔符
print(result)
def text_shaw(self,text):
self.x += f"{text}"
self.textEdit.setText(self.x)
self.textEdit.setAlignment(Qt.AlignRight)
def keyPressEvent(self, event):
key = event.text()
print(key)
if key in '0123456789.+-*/':
self.on_button_click(key)
print(key)
elif event.key() in (Qt.Key_Enter, Qt.Key_Return):
self.on_button_click('=')
elif event.key() == Qt.Key_Escape:
self.reset_calculator()
if __name__=="__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.ui.show()
app.exec()
界面展示
有任何问题可以联系我,欢迎大家来讨论,共同进步。