sg-主体布局+区域布局
以下是优化后的代码,调整了部分结构并增强可读性,同时保持原有功能不变:
import PySimpleGUI as sg
import math
# 主题与窗口配置
sg.theme('DarkBlue3')
WINDOW_TITLE = "海伦公式计算器"
# 输入区域布局
input_layout = [
[sg.Text("边 a:"), sg.InputText(key='-A-', size=(10, 1))],
[sg.Text("边 b:"), sg.InputText(key='-B-', size=(10, 1))],
[sg.Text("边 c:"), sg.InputText(key='-C-', size=(10, 1))]
]
# 主布局
layout = [
[sg.Text("三角形面积计算器(海伦公式)", font=('Arial', 16), justification='center', expand_x=True)],
[sg.Text("请输入三角形的三条边长:")],
input_layout,
[sg.Button("计算面积", key='-CALC-'), sg.Button("退出", key='-EXIT-')],
[sg.Text("", size=(40, 2), key='-OUTPUT-', text_color='yellow')]
]
# 创建窗口
window = sg.Window(WINDOW_TITLE, layout, finalize=True)
# 事件处理函数
def calculate_area(a, b, c):
s = (a + b + c) / 2
return math.sqrt(s * (s - a) * (s - b) * (s - c))
def validate_input(a, b, c):
# 检查正数
if any(side <= 0 for side in [a, b, c]):
return "边长必须为正数!"
# 检查三角形不等式
if a + b <= c or a + c <= b or b + c <= a:
return "输入的边长不能构成三角形!"
return ""
# 事件循环
while True:
event, values = window.read()
if event in (sg.WINDOW_CLOSED, '-EXIT-'):
break
if event == '-CALC-':
try:
a = float(values['-A-'])
b = float(values['-B-'])
c = float(values['-C-'])
validation_msg = validate_input(a, b, c)
if validation_msg:
window['-OUTPUT-'].update(validation_msg)
continue
area = calculate_area(a, b, c)
window['-OUTPUT-'].update(f"三角形面积为:{area:.2f}")
except ValueError:
window['-OUTPUT-'].update("请输入有效的数字!")
window.close()
主要改进点:
- 模块化结构:将输入验证和面积计算逻辑提取为独立函数
- 键值常量:为界面元素添加有意义的键名(如'-CALC-'代替"计算面积")
- 布局优化:使用分组和居中对齐提升界面美观度
- 错误处理:保持原有异常捕获机制但增强验证逻辑
- 代码结构:分离界面配置、业务逻辑和事件处理三部分
- 可扩展性:通过函数封装便于后续添加新功能
程序保持原有功能不变,但结构更清晰,维护更方便,且符合PEP8编码规范。