计算器
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 sysfrom PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uicclass 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 # 7self.pushButton_6 = self.ui.pushButton_6 # 8self.pushButton_7 = self.ui.pushButton_7 # 9self.pushButton_8 = self.ui.pushButton_8 # *:乘号self.pushButton_9 = self.ui.pushButton_9 # 4self.pushButton_10 = self.ui.pushButton_10 # 5self.pushButton_11 = self.ui.pushButton_11 # 6self.pushButton_12 = self.ui.pushButton_12 # -:减法self.pushButton_13 = self.ui.pushButton_13 # 1self.pushButton_14 = self.ui.pushButton_14 # 2self.pushButton_15 = self.ui.pushButton_15 # 3self.pushButton_16 = self.ui.pushButton_16 # +:加法self.pushButton_17 = self.ui.pushButton_17 # eself.pushButton_18 = self.ui.pushButton_18 # 0self.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 # 7self.pushButton_6 = self.ui.pushButton_6 # 8self.pushButton_7 = self.ui.pushButton_7 # 9self.pushButton_8 = self.ui.pushButton_8 # *:乘号self.pushButton_9 = self.ui.pushButton_9 # 4self.pushButton_10 = self.ui.pushButton_10 # 5self.pushButton_11 = self.ui.pushButton_11 # 6self.pushButton_12 = self.ui.pushButton_12 # -:减法self.pushButton_13 = self.ui.pushButton_13 # 1self.pushButton_14 = self.ui.pushButton_14 # 2self.pushButton_15 = self.ui.pushButton_15 # 3self.pushButton_16 = self.ui.pushButton_16 # +:加法self.pushButton_17 = self.ui.pushButton_17 # eself.pushButton_18 = self.ui.pushButton_18 # 0self.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()
界面展示
有任何问题可以联系我,欢迎大家来讨论,共同进步。