PyQt6 圆计算器完整程序
完整可直接运行代码
python
# 导入系统模块,用来接收程序启动参数、退出程序
import sys
# 从PyQt6工具包导入需要使用的控件
from PySide6.QtWidgets import (QApplication, QDialog, QLabel,
QLineEdit, QPushButton, QMessageBox)
# 定义窗口类:圆计算器窗口,继承QDialog对话框
class CircleCal(QDialog):
# --------初始化函数:创建窗口的时候,会自动执行这个函数--------
def __init__(self):
# 调用父类QDialog的初始化,固定写法,不能省略
super().__init__()
# 调用自己写的界面搭建函数,把所有界面控件创建出来
self.create_ui()
# --------搭建界面的函数:所有按钮、输入框、文字标签在这里创建--------
def create_ui(self):
# ==========1.创建【半径】文字标签 QLabel只用来显示文字,不能输入==========
# QLabel("显示文字",父窗口),setGeometry(横坐标,纵坐标,宽度,高度)
# 横坐标:距离窗口左边多少像素;纵坐标:距离窗口上边多少像素
QLabel("半径=", self).setGeometry(80, 40, 71, 21)
# ==========2.半径输入框,用来让用户输入数字==========
# self. 代表这个变量是窗口的成员变量,其他函数也可以读取这个输入框内容
self.input_radius = QLineEdit(self)
self.input_radius.setGeometry(140, 40, 113, 21)
# 信号绑定:在输入框按下回车键,就执行计算函数calculate_circle
self.input_radius.returnPressed.connect(self.calculate_circle)
# ==========3.周长标签 + 周长结果显示框(禁止用户修改)==========
QLabel("周长=", self).setGeometry(80, 80, 71, 21)
self.output_length = QLineEdit(self)
self.output_length.setGeometry(140, 80, 113, 21)
self.output_length.setEnabled(False) # False=禁用,用户不能编辑,仅用来展示结果
# ==========4.面积标签 + 面积结果显示框(禁止用户修改)==========
QLabel("面积=", self).setGeometry(80, 120, 71, 21)
self.output_area = QLineEdit(self)
self.output_area.setGeometry(140, 120, 113, 21)
self.output_area.setEnabled(False)
# ==========5.计算按钮==========
self.button_calc = QPushButton("计算", self)
self.button_calc.setGeometry(140, 160, 93, 28)
# 信号绑定:鼠标点击按钮,执行calculate_circle计算函数
self.button_calc.clicked.connect(self.calculate_circle)
# ==========设置窗口整体大小、位置、标题==========
self.resize(350, 200) # 窗口大小:宽350像素,高200像素
self.move(300, 300) # 窗口出现在屏幕坐标:x=300,y=300的位置
self.setWindowTitle("计算圆面积") # 窗口左上角标题文字
# --------计算逻辑函数:按回车 / 点计算按钮都会运行这里--------
def calculate_circle(self):
"""
功能:读取半径,计算圆周长、圆面积
公式:周长 = 2 * π * r;面积 = π * r²,π取3.14159
"""
try:
# 1、读取输入框文字,strip()删掉文字前后多余空格
input_text = self.input_radius.text().strip()
# 把读取到的字符串文字,转换成小数,支持整数和小数输入,例如12、2.5
radius = float(input_text)
# 判断:半径不能小于0
if radius >= 0:
pi = 3.14159
perimeter = 2 * pi * radius # 周长计算
area = pi * radius * radius # 面积计算
# f字符串格式化:.2f代表保留2位小数,放到输出框显示
self.output_length.setText(f"{perimeter:.2f}")
self.output_area.setText(f"{area:.2f}")
else:
# 如果输入负数,弹出警告弹窗
QMessageBox.warning(self, "警告提示", "半径不能是负数!")
self.output_length.clear() # 清空周长输出框
self.output_area.clear() # 清空面积输出框
# 如果输入的不是数字(字母、符号、空内容),会触发这个错误,弹窗提示,程序不会崩溃
except ValueError:
QMessageBox.warning(self, "输入错误", "请输入有效的数字!")
self.output_length.clear()
self.output_area.clear()
# =========程序入口,程序从这里开始运行,固定模板========
if __name__ == "__main__":
# 创建整个QT应用程序对象,一个程序只能有1个
app = QApplication(sys.argv)
# 创建我们自己写的计算器窗口实例,自动执行__init__、create_ui
window = CircleCal()
window.show() # 将窗口显示在屏幕上
sys.exit(app.exec()) # 启动界面循环,等待用户点击、输入;关闭窗口之后程序退出
程序完整设计流程(零基础理解)
流程1:明确要实现什么功能
- 界面上有文字提示:半径、周长、面积
- 用户输入半径数字,可以点击计算按钮 或者敲回车键
- 自动算出圆周长、圆面积,展示在界面
- 周长、面积框只能看,不能手动修改
- 容错:输入字母、负数、空内容,弹出提示,程序不会闪退
流程2:程序结构拆解
| 模块 | 作用 |
|---|---|
| 导入包 | 拿来别人写好的工具,实现窗口、按钮、弹窗功能 |
自定义窗口类CircleCal |
整个对话框窗口,把界面和计算逻辑封装在一起 |
__init__()初始化 |
创建窗口对象时自动调用,启动界面搭建 |
create_ui() |
全部可视化控件(标签、输入框、按钮),布局摆放、绑定事件 |
calculate_circle() |
业务逻辑:读取输入、做数学运算、异常判断、输出结果 |
程序入口if __name__ == "__main__" |
启动QT,创建窗口,显示窗口,开启界面等待循环 |
流程3:运行执行顺序(程序一步一步怎么走)
- 运行脚本,走到最底部
if __name__ == "__main__":,程序正式启动 app = QApplication(sys.argv)创建QT应用window = CircleCal()创建窗口实例- 自动调用
__init__() super().__init__()初始化父窗口- 调用
self.create_ui():生成所有标签、输入框、按钮,摆放位置,绑定事件
- 自动调用
window.show():把窗口绘制显示到屏幕app.exec():程序卡住在这里等待操作 ,监听鼠标点击、键盘输入- 用户点【计算按钮】→触发
calculate_circle() - 用户输入数字敲回车 →触发
calculate_circle()
- 用户点【计算按钮】→触发
- 在
calculate_circle()内部:读取输入 →判断是否合法 →数学计算 →结果写回界面;出错弹出提示框 - 用户点击窗口右上角关闭按钮,退出事件循环,执行
sys.exit(),程序结束
流程4:关键概念通俗解释
- 控件 :窗口上面看得见的零件,
QLabel文字、QLineEdit输入框、QPushButton按钮 - 信号与槽 :PyQt事件机制
- 信号:发生一个动作,例如:按钮
clicked被点击、输入框returnPressed按下回车 - connect(函数名):动作发生,就去执行指定函数
- 信号:发生一个动作,例如:按钮
try ... except异常捕获:防止用户乱输入导致程序直接崩溃,捕获错误弹出提示self.xxx:加上self,变量可以在这个类里面所有函数互相访问;不加self函数执行完变量就消失
测试示例
输入:12
输出周长:75.40,输出面积:452.39
输入负数‑5 →弹窗提示半径不能负数;输入abc字母 →弹窗提示输入有效数字。