使用Qt Designer和PyCharm Python3.7实现简易计算器
一、使用Qt Designer设计UI界面
首先在pycharn上面添加pyqt框架,使用其qt designer工具,推荐安装博客:
https://blog.csdn.net/mawei7510/article/details/81450032?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-3&spm=1001.2101.3001.4242
拥有了Qt Designer后,首先我们用它设计一个计算器界面。
打开Qt Designe:
然后进入后我们使用pushButton作为数字和运算符的按钮,而显示屏使用LCD Number组件。
如图:
再简单的对其使用水平和垂直布局,然后对每一个pushButon进行命名,我们简单的命名成o1,o2…plus,sub,mul,div,equ,lcd等。下一步是建立每一个按钮的信号-槽关系,就是点击这个按钮执行的函数。这里我们对数字和小数点使用相同的函数digit(),运算符对应的函数为operator(),清除对应的是clear()函数,等于号单独对应equal()函数。设计完成后的界面是:
以上就是设计界面的简要过程,下面就是具体代码实现功能。
二、计算器功能实现
界面设计完会生成一个.ui文件,在本文一开始推荐的博客里面有将.ui文件转化成.py的方法,生成的python代码为:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
lcdstring = ''
operator = ''
nownumber = 0
pernumber = 0
result = 0
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(10)
MainWindow.setFont(font)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lcd = QtWidgets.QLCDNumber(self.centralwidget)
self.lcd.setGeometry(QtCore.QRect(150, 32, 399, 61))
self.lcd.setDigitCount(10)
self.lcd.setObjectName("lcd")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(150, 110, 401, 232))
self.widget.setObjectName("widget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.o1 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o1.setFont(font)
self.o1.setObjectName("o1")
self.horizontalLayout.addWidget(self.o1)
self.o2 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o2.setFont(font)
self.o2.setObjectName("o2")
self.horizontalLayout.addWidget(self.o2)
self.o3 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o3.setFont(font)
self.o3.setObjectName("o3")
self.horizontalLayout.addWidget(self.o3)
self.div = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.div.setFont(font)
self.div.setObjectName("div")
self.horizontalLayout.addWidget(self.div)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.o4 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o4.setFont(font)
self.o4.setObjectName("o4")
self.horizontalLayout_2.addWidget(self.o4)
self.o5 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o5.setFont(font)
self.o5.setObjectName("o5")
self.horizontalLayout_2.addWidget(self.o5)
self.o6 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o6.setFont(font)
self.o6.setObjectName("o6")
self.horizontalLayout_2.addWidget(self.o6)
self.mul = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.mul.setFont(font)
self.mul.setObjectName("mul")
self.horizontalLayout_2.addWidget(self.mul)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.o7 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o7.setFont(font)
self.o7.setObjectName("o7")
self.horizontalLayout_3.addWidget(self.o7)
self.o8 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o8.setFont(font)
self.o8.setObjectName("o8")
self.horizontalLayout_3.addWidget(self.o8)
self.o9 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o9.setFont(font)
self.o9.setObjectName("o9")
self.horizontalLayout_3.addWidget(self.o9)
self.sub = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.sub.setFont(font)
self.sub.setObjectName("sub")
self.horizontalLayout_3.addWidget(self.sub)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.clear1 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.clear1.setFont(font)
self.clear1.setObjectName("clear1")
self.horizontalLayout_4.addWidget(self.clear1)
self.o0 = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.o0.setFont(font)
self.o0.setObjectName("o0")
self.horizontalLayout_4.addWidget(self.o0)
self.point = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.point.setFont(font)
self.point.setObjectName("point")
self.horizontalLayout_4.addWidget(self.point)
self.plus = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setPointSize(14)
self.plus.setFont(font)
self.plus.setObjectName("plus")
self.horizontalLayout_4.addWidget(self.plus)
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.horizontalLayout_5.addLayout(self.verticalLayout)
self.verticalLayout_2.addLayout(self.horizontalLayout_5)
self.equ = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setFamily("宋体")
font.setPointSize(14)
self.equ.setFont(font)
self.equ.setObjectName("equ")
self.verticalLayout_2.addWidget(self.equ)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.clear1.clicked.connect(self.clear)
self.equ.clicked.connect(self.equal)
self.sub.clicked.connect(self.opera)
self.mul.clicked.connect(self.opera)
self.div.clicked.connect(self.opera)
self.o1.clicked.connect(self.digit)
self.o2.clicked.connect(self.digit)
self.o3.clicked.connect(self.digit)
self.o4.clicked.connect(self.digit)
self.o5.clicked.connect(self.digit)
self.o6.clicked.connect(self.digit)
self.o7.clicked.connect(self.digit)
self.o8.clicked.connect(self.digit)
self.o9.clicked.connect(self.digit)
self.o0.clicked.connect(self.digit)
self.point.clicked.connect(self.digit)
self.plus.clicked.connect(self.opera)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "计算器"))
self.o1.setText(_translate("MainWindow", "1"))
self.o2.setText(_translate("MainWindow", "2"))
self.o3.setText(_translate("MainWindow", "3"))
self.div.setText(_translate("MainWindow", "/"))
self.o4.setText(_translate("MainWindow", "4"))
self.o5.setText(_translate("MainWindow", "5"))
self.o6.setText(_translate("MainWindow", "6"))
self.mul.setText(_translate("MainWindow", "*"))
self.o7.setText(_translate("MainWindow", "7"))
self.o8.setText(_translate("MainWindow", "8"))
self.o9.setText(_translate("MainWindow", "9"))
self.sub.setText(_translate("MainWindow", "-"))
self.clear1.setText(_translate("MainWindow", "清除"))
self.o0.setText(_translate("MainWindow", "0"))
self.point.setText(_translate("MainWindow", "."))
self.plus.setText(_translate("MainWindow", "+"))
self.equ.setText(_translate("MainWindow", "="))
注意将connect后面的MainWindow改成self否则会报错,然后就是实现计算器的加减乘除功能,首先在函数里添加五个对象接收lcd内容的lcdstring,两个数字nownumber,pernumber,运算符operator和结果result,具体细节不再赘述,代码:`
def clear(self):
self.lcdstring = ''
self.operator = ''
self.nownumber = 0
self.pernumber = 0
self.result = 0
self.lcd.display(0)#全部置零,显示为零
def opera(self):
self.pernumber = self.nownumber
self.nownumber = 0
self.lcdstring = ''
self.operator = self.lcd.sender().objectName()#本身的项目名就是运算符
def equal(self):
if self.operator == 'plus':
self.result = self.pernumber + self.nownumber
self.lcd.display(self.result)
if self.operator == 'sub':
self.result = self.pernumber - self.nownumber
self.lcd.display(self.result)
if self.operator == 'mul':
self.result = self.pernumber * self.nownumber
self.lcd.display(self.result)
if self.operator == 'div':
if self.nownumber == 0:#如果除数为零则输出错误
self.lcd.display("ERROR")
else:
self.result = self.pernumber / self.nownumber
self.lcd.display(self.result)
self.nownumber = self.result
self.lcdstring = ''
def digit(self):
if len(self.lcdstring) <= 9:#保证lcd屏只能输入10个数
self.lcdstring = self.lcdstring + self.lcd.sender().text()
self.lcd.display(self.lcdstring)
self.nownumber = float(self.lcdstring)`
以上就是功能实现,然后建立主函数文件,调用这个类:
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
from calculator import *
if __name__=='__main__':
app=QApplication(sys.argv)
mainWindow = QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
以上就是代码实现。
三、打包成.exe文件
现在在Pycharm已经可以运行了:
但是这要基于有python环境的计算器,现在我们要将其打包成.exe文件,可以独立在其他平台运行。方法是使用python的pyinstaller库,安装这个库的方法推荐博客:
https://www.jb51.net/article/181438.htm
安装完成后在pycharm的Terminal窗口执行命令
pyinstaller -F -w 主函数名.py
会在dist文件下生成.exe文件,这时候复制出来就可以在没有python环境的情况下运行了。
第一次写博客,哈哈哈,错误之处,还请轻点打。