使用PySide6这个强大的Python库来创建一个简单的计算器小程序。PySide6是Qt应用程序框架的Python绑定,非常适合开发跨平台的GUI应用程序。下面我们就开始吧!
QtDesigner是创建新的ui项目。
QtDesignerEdit是修改已存在的ui项目
使用Qt Designer设计一个简单的计算器界面,包含以下元素:
设计完成后,保存为compute.ui文件。接下来,我们需要将UI文件转换为Python代码。
下面是我们的计算器小程序的主体代码:
from PySide6.QtWidgets import QWidget, QApplication
from ui.compute import Ui_Form
class MyWidget(QWidget, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.bind()
self.result = ''
def bind(self):
self.pushButton_0.clicked.connect(lambda: self.addNumber('0'))
self.pushButton_1.clicked.connect(lambda: self.addNumber('1'))
self.pushButton_2.clicked.connect(lambda: self.addNumber('2'))
self.pushButton_3.clicked.connect(lambda: self.addNumber('3'))
self.pushButton_4.clicked.connect(lambda: self.addNumber('4'))
self.pushButton_5.clicked.connect(lambda: self.addNumber('5'))
self.pushButton_6.clicked.connect(lambda: self.addNumber('6'))
self.pushButton_7.clicked.connect(lambda: self.addNumber('7'))
self.pushButton_8.clicked.connect(lambda: self.addNumber('8'))
self.pushButton_9.clicked.connect(lambda: self.addNumber('9'))
self.pushButton_add.clicked.connect(lambda: self.addNumber('+'))
self.pushButton_minus.clicked.connect(lambda: self.addNumber('-'))
self.pushButton_plus.clicked.connect(lambda: self.addNumber('*'))
self.pushButton_divide.clicked.connect(lambda: self.addNumber('/'))
self.pushButton_dot.clicked.connect(lambda: self.addNumber('.'))
self.pushButton_back.clicked.connect(lambda: self.back())
self.pushButton_clear.clicked.connect(lambda: self.cleared())
self.pushButton_compute.clicked.connect(lambda: self.compute())
def addNumber(self, num):
# self.lineEdit.clear()
self.result += num
self.setLineEditText()
def compute(self):
numResult = eval(self.result)
self.lineEdit_2.setText(str(numResult))
def cleared(self):
self.result = ''
self.setLineEditText()
def back(self):
if self.result:
self.result = self.result[:-1]
self.setLineEditText()
def setLineEditText(self):
self.lineEdit.setText(self.result)
self.lineEdit_2.clear()
if __name__ == '__main__':
app = QApplication([])
window = MyWidget()
window.show()
app.exec()
在这段代码中,我们定义了一个MyWidget类,它继承自QWidget和Ui_Form。Ui_Form是从UI文件转换而来的,包含了界面元素的定义。
在MyWidget类的构造函数__init__中,我们首先调用super().__init__()来初始化基类QWidget。然后,我们调用setupUi(self)来设置UI界面,这是由Qt Designer生成的代码提供的。接着,我们调用bind()方法来绑定按钮的点击事件,并初始化一个空字符串self.result来存储用户输入的表达式。
在bind方法中,我们为每个按钮绑定了点击事件,这样当用户点击按钮时,会触发相应的函数。
addNumber方法用于将用户点击的数字或运算符添加到结果字符串中,并更新显示。
compute方法使用Python内置的eval函数来计算结果字符串的值,并将结果显示在界面上。
cleared和back方法分别用于清空输入和删除最后一个字符。
setLineEditText方法用于更新lineEdit的文本内容。
ui生成的代码:
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'compute.ui'
##
## Created by: Qt User Interface Compiler version 6.7.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QHBoxLayout, QLineEdit, QPushButton,
QSizePolicy, QVBoxLayout, QWidget)
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(609, 428)
self.lineEdit = QLineEdit(Form)
self.lineEdit.setObjectName(u"lineEdit")
self.lineEdit.setGeometry(QRect(20, 20, 561, 81))
self.layoutWidget = QWidget(Form)
self.layoutWidget.setObjectName(u"layoutWidget")
self.layoutWidget.setGeometry(QRect(20, 180, 567, 184))
self.verticalLayout = QVBoxLayout(self.layoutWidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4 = QHBoxLayout()
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
self.pushButton_clear = QPushButton(self.layoutWidget)
self.pushButton_clear.setObjectName(u"pushButton_clear")
self.horizontalLayout_4.addWidget(self.pushButton_clear)
self.pushButton_back = QPushButton(self.layoutWidget)
self.pushButton_back.setObjectName(u"pushButton_back")
self.horizontalLayout_4.addWidget(self.pushButton_back)
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.pushButton_7 = QPushButton(self.layoutWidget)
self.pushButton_7.setObjectName(u"pushButton_7")
self.horizontalLayout.addWidget(self.pushButton_7)
self.pushButton_8 = QPushButton(self.layoutWidget)
self.pushButton_8.setObjectName(u"pushButton_8")
self.horizontalLayout.addWidget(self.pushButton_8)
self.pushButton_9 = QPushButton(self.layoutWidget)
self.pushButton_9.setObjectName(u"pushButton_9")
self.horizontalLayout.addWidget(self.pushButton_9)
self.pushButton_minus = QPushButton(self.layoutWidget)
self.pushButton_minus.setObjectName(u"pushButton_minus")
self.horizontalLayout.addWidget(self.pushButton_minus)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.pushButton_4 = QPushButton(self.layoutWidget)
self.pushButton_4.setObjectName(u"pushButton_4")
self.horizontalLayout_2.addWidget(self.pushButton_4)
self.pushButton_5 = QPushButton(self.layoutWidget)
self.pushButton_5.setObjectName(u"pushButton_5")
self.horizontalLayout_2.addWidget(self.pushButton_5)
self.pushButton_6 = QPushButton(self.layoutWidget)
self.pushButton_6.setObjectName(u"pushButton_6")
self.horizontalLayout_2.addWidget(self.pushButton_6)
self.pushButton_plus = QPushButton(self.layoutWidget)
self.pushButton_plus.setObjectName(u"pushButton_plus")
self.horizontalLayout_2.addWidget(self.pushButton_plus)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3 = QHBoxLayout()
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.pushButton_1 = QPushButton(self.layoutWidget)
self.pushButton_1.setObjectName(u"pushButton_1")
self.horizontalLayout_3.addWidget(self.pushButton_1)
self.pushButton_2 = QPushButton(self.layoutWidget)
self.pushButton_2.setObjectName(u"pushButton_2")
self.horizontalLayout_3.addWidget(self.pushButton_2)
self.pushButton_3 = QPushButton(self.layoutWidget)
self.pushButton_3.setObjectName(u"pushButton_3")
self.horizontalLayout_3.addWidget(self.pushButton_3)
self.pushButton_divide = QPushButton(self.layoutWidget)
self.pushButton_divide.setObjectName(u"pushButton_divide")
self.horizontalLayout_3.addWidget(self.pushButton_divide)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout_5 = QHBoxLayout()
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.pushButton_0 = QPushButton(self.layoutWidget)
self.pushButton_0.setObjectName(u"pushButton_0")
self.horizontalLayout_5.addWidget(self.pushButton_0)
self.pushButton_dot = QPushButton(self.layoutWidget)
self.pushButton_dot.setObjectName(u"pushButton_dot")
self.horizontalLayout_5.addWidget(self.pushButton_dot)
self.pushButton_compute = QPushButton(self.layoutWidget)
self.pushButton_compute.setObjectName(u"pushButton_compute")
self.horizontalLayout_5.addWidget(self.pushButton_compute)
self.pushButton_add = QPushButton(self.layoutWidget)
self.pushButton_add.setObjectName(u"pushButton_add")
self.horizontalLayout_5.addWidget(self.pushButton_add)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.lineEdit_2 = QLineEdit(Form)
self.lineEdit_2.setObjectName(u"lineEdit_2")
self.lineEdit_2.setGeometry(QRect(20, 120, 561, 41))
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"\u8ba1\u7b97", None))
self.pushButton_clear.setText(QCoreApplication.translate("Form", u"\u6e05\u7a7a", None))
self.pushButton_back.setText(QCoreApplication.translate("Form", u"\u56de\u9000", None))
self.pushButton_7.setText(QCoreApplication.translate("Form", u"7", None))
self.pushButton_8.setText(QCoreApplication.translate("Form", u"8", None))
self.pushButton_9.setText(QCoreApplication.translate("Form", u"9", None))
self.pushButton_minus.setText(QCoreApplication.translate("Form", u"-", None))
self.pushButton_4.setText(QCoreApplication.translate("Form", u"4", None))
self.pushButton_5.setText(QCoreApplication.translate("Form", u"5", None))
self.pushButton_6.setText(QCoreApplication.translate("Form", u"6", None))
self.pushButton_plus.setText(QCoreApplication.translate("Form", u"*", None))
self.pushButton_1.setText(QCoreApplication.translate("Form", u"1", None))
self.pushButton_2.setText(QCoreApplication.translate("Form", u"2", None))
self.pushButton_3.setText(QCoreApplication.translate("Form", u"3", None))
self.pushButton_divide.setText(QCoreApplication.translate("Form", u"/", None))
self.pushButton_0.setText(QCoreApplication.translate("Form", u"0", None))
self.pushButton_dot.setText(QCoreApplication.translate("Form", u".", None))
self.pushButton_compute.setText(QCoreApplication.translate("Form", u"\u8ba1\u7b97", None))
self.pushButton_add.setText(QCoreApplication.translate("Form", u"+", None))
# retranslateUi
如果你的代码没有问题,你应该能看到一个简单的计算器界面。现在,你可以尝试使用这个计算器进行简单的数算了!
如果你的计算器需要支持更复杂的运算,比如三角函数或对数,你可以添加更多的按钮和对应的处理逻辑。
你可以使用Qt Designer来进一步改进UI,比如添加字体、颜色、图标等,使计算器看起来更美观。
通过这个简单的计算器项目,我们学习了如何使用PySide6创建一个GUI应用程序。虽然这个计算器相对简单,但它展示了GUI编程的基本概念,包括事件处理、UI布局和状态管理。
在未来的学习中,你可以探索更多PySide6的功能,比如信号和槽的高级用法、自定义窗口小部件、以及多线程等,来创建更复杂和功能丰富的应用程序。
希望这个教程能够帮助你迈出使用PySide6进行GUI编程的第一步。如果你有任何问题或想法,欢迎在评论区留言交流!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务