rom tkinter import *
from tkinter import ttk, filedialog
import os
import subprocess
import sys
class WindLoadCalculator:
def __init__(self, root):
self.root = root
self.root.title("聚之义美标风荷载计算1.0-应用研发")
# 设置窗口图标
try:
if getattr(sys, 'frozen', False):
application_path = os.path.dirname(sys.executable)
else:
application_path = os.path.dirname(os.path.abspath(__file__))
icon_path = os.path.join(application_path, "source", "amwind.ico")
if os.path.exists(icon_path):
self.root.iconbitmap(icon_path)
except:
pass
# 设置窗口尺寸并禁止修改
width, height = 800, 650
self.root.geometry(f"{width}x{height}")
self.root.resizable(False, False)
# 居中显示窗口
screen_width = self.root.winfo_screenwidth()
screen_height = self.root.winfo_screenheight()
x = (screen_width - width) // 2
y = (screen_height - height) // 2
self.root.geometry(f"+{x}+{y}")
# 设置中文字体
self.style = ttk.Style()
self.style.configure(".", font=("SimHei", 10))
# 创建输入框架
input_frame = ttk.LabelFrame(root, text="输入参数")
input_frame.pack(fill="x", padx=10, pady=10)
# 风速输入
ttk.Label(input_frame, text="3秒时距风速 (m/s):").grid(row=0, column=0, sticky=W, padx=5, pady=5)
self.wind_speed = DoubleVar(value=30)
ttk.Entry(input_frame, textvariable=self.wind_speed, width=10).grid(row=0, column=1, sticky=W, padx=5, pady=5)
# 暴露等级选择
ttk.Label(input_frame, text="暴露等级:").grid(row=1, column=0, sticky=W, padx=5, pady=5)
self.exposure_class = StringVar(value="B")
ttk.Combobox(input_frame, textvariable=self.exposure_class, values=["B", "C", "D"], width=9).grid(row=1,
column=1,
sticky=W,
padx=5,
pady=5)
# 山地坡度选择
ttk.Label(input_frame, text="山地坡度:").grid(row=2, column=0, sticky=W, padx=5, pady=5)
self.slope = StringVar(value="0%")
ttk.Combobox(input_frame, textvariable=self.slope, values=["0%", "5%", "10%", "15%", "20%", "25%", "30%"],
width=9).grid(row=2, column=1, sticky=W, padx=5, pady=5)
# 海拔高度输入
ttk.Label(input_frame, text="海拔高度 (m):").grid(row=3, column=0, sticky=W, padx=5, pady=5)
self.altitude = DoubleVar(value=0)
ttk.Entry(input_frame, textvariable=self.altitude, width=10).grid(row=3, column=1, sticky=W, padx=5, pady=5)
# 光伏支架倾角输入
ttk.Label(input_frame, text="光伏支架倾角 (度):").grid(row=4, column=0, sticky=W, padx=5, pady=5)
self.tilt_angle = DoubleVar(value=30)
ttk.Entry(input_frame, textvariable=self.tilt_angle, width=10).grid(row=4, column=1, sticky=W, padx=5, pady=5)
# 创建计算按钮和帮助按钮
button_frame = ttk.Frame(root)
button_frame.pack(fill="x", padx=10, pady=10)
ttk.Button(button_frame, text="计算", command=self.calculate).pack(side=LEFT, padx=5)
ttk.Button(button_frame, text="计算书", command=self.export_calculation_results).pack(side=LEFT, padx=5)
# 创建结果框架
result_frame = ttk.LabelFrame(root, text="计算结果")
result_frame.pack(fill="both", expand=True, padx=10, pady=10)
# 创建输入参数结果区域
input_result_frame = ttk.Frame(result_frame)
input_result_frame.pack(fill="x", padx=5, pady=5)
ttk.Label(input_result_frame, text="风速:").grid(row=0, column=0, sticky=W, padx=5, pady=2)
self.wind_speed_result = self.create_readonly_text(input_result_frame)
self.wind_speed_result.grid(row=0, column=1, sticky=W, padx=5, pady=2)
ttk.Label(input_result_frame, text="暴露等级:").grid(row=0, column=2, sticky=W, padx=5, pady=2)
self.exposure_result = self.create_readonly_text(input_result_frame)
self.exposure_result.grid(row=0, column=3, sticky=W, padx=5, pady=2)
ttk.Label(input_result_frame, text="山地坡度:").grid(row=1, column=0, sticky=W, padx=5, pady=2)
self.slope_result = self.create_readonly_text(input_result_frame)
self.slope_result.grid(row=1, column=1, sticky=W, padx=5, pady=2)
ttk.Label(input_result_frame, text="海拔高度:").grid(row=1, column=2, sticky=W, padx=5, pady=2)
self.altitude_result = self.create_readonly_text(input_result_frame)
self.altitude_result.grid(row=1, column=3, sticky=W, padx=5, pady=2)
ttk.Label(input_result_frame, text="光伏支架倾角:").grid(row=2, column=0, sticky=W, padx=5, pady=2)
self.tilt_angle_result = self.create_readonly_text(input_result_frame)
self.tilt_angle_result.grid(row=2, column=1, sticky=W, padx=5, pady=2)
# 创建中间系数结果区域
coeff_frame = ttk.LabelFrame(result_frame, text="中间系数")
coeff_frame.pack(fill="x", padx=5, pady=5)
ttk.Label(coeff_frame, text="速度压力暴露系数(kz):").grid(row=0, column=0, sticky=W, padx=5, pady=2)
self.kz_result = self.create_readonly_text(coeff_frame)
self.kz_result.grid(row=0, column=1, sticky=W, padx=5, pady=2)
ttk.Label(coeff_frame, text="山形系数(kzt):").grid(row=0, column=2, sticky=W, padx=5, pady=2)
self.kzt_result = self.create_readonly_text(coeff_frame)
self.kzt_result.grid(row=0, column=3, sticky=W, padx=5, pady=2)
ttk.Label(coeff_frame, text="地面高程系数(ke):").grid(row=1, column=0, sticky=W, padx=5, pady=2)
self.ke_result = self.create_readonly_text(coeff_frame)
self.ke_result.grid(row=1, column=1, sticky=W, padx=5, pady=2)
ttk.Label(coeff_frame, text="风向因子(kd):").grid(row=1, column=2, sticky=W, padx=5, pady=2)
self.kd_result = self.create_readonly_text(coeff_frame)
self.kd_result.grid(row=1, column=3, sticky=W, padx=5, pady=2)
ttk.Label(coeff_frame, text="阵风效应系数(G):").grid(row=2, column=0, sticky=W, padx=5, pady=2)
self.G_result = self.create_readonly_text(coeff_frame)
self.G_result.grid(row=2, column=1, sticky=W, padx=5, pady=2)
# 创建0度风向角结果区域
wind_0_frame = ttk.LabelFrame(result_frame, text="0度风向角")
wind_0_frame.pack(fill="x", padx=5, pady=5)
# Case A
case_a_0_frame = ttk.LabelFrame(wind_0_frame, text="Case A")
case_a_0_frame.grid(row=0, column=0, sticky="nsew", padx=5, pady=5)
ttk.Label(case_a_0_frame, text="CNW:").grid(row=0, column=0, sticky=W, padx=5, pady=2)
self.cnw_0_a_result = self.create_readonly_text(case_a_0_frame)
self.cnw_0_a_result.grid(row=0, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_a_0_frame, text="CNL:").grid(row=0, column=2, sticky=W, padx=5, pady=2)
self.cnl_0_a_result = self.create_readonly_text(case_a_0_frame)
self.cnl_0_a_result.grid(row=0, column=3, sticky=W, padx=5, pady=2)
ttk.Label(case_a_0_frame, text="PNW:").grid(row=1, column=0, sticky=W, padx=5, pady=2)
self.pnw_0_a_result = self.create_readonly_text(case_a_0_frame)
self.pnw_0_a_result.grid(row=1, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_a_0_frame, text="PNL:").grid(row=1, column=2, sticky=W, padx=5, pady=2)
self.pnl_0_a_result = self.create_readonly_text(case_a_0_frame)
self.pnl_0_a_result.grid(row=1, column=3, sticky=W, padx=5, pady=2)
# Case B
case_b_0_frame = ttk.LabelFrame(wind_0_frame, text="Case B")
case_b_0_frame.grid(row=0, column=1, sticky="nsew", padx=5, pady=5)
ttk.Label(case_b_0_frame, text="CNW:").grid(row=0, column=0, sticky=W, padx=5, pady=2)
self.cnw_0_b_result = self.create_readonly_text(case_b_0_frame)
self.cnw_0_b_result.grid(row=0, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_b_0_frame, text="CNL:").grid(row=0, column=2, sticky=W, padx=5, pady=2)
self.cnl_0_b_result = self.create_readonly_text(case_b_0_frame)
self.cnl_0_b_result.grid(row=0, column=3, sticky=W, padx=5, pady=2)
ttk.Label(case_b_0_frame, text="PNW:").grid(row=1, column=0, sticky=W, padx=5, pady=2)
self.pnw_0_b_result = self.create_readonly_text(case_b_0_frame)
self.pnw_0_b_result.grid(row=1, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_b_0_frame, text="PNL:").grid(row=1, column=2, sticky=W, padx=5, pady=2)
self.pnl_0_b_result = self.create_readonly_text(case_b_0_frame)
self.pnl_0_b_result.grid(row=1, column=3, sticky=W, padx=5, pady=2)
# 创建180度风向角结果区域
wind_180_frame = ttk.LabelFrame(result_frame, text="180度风向角")
wind_180_frame.pack(fill="x", padx=5, pady=5)
# Case A
case_a_180_frame = ttk.LabelFrame(wind_180_frame, text="Case A")
case_a_180_frame.grid(row=0, column=0, sticky="nsew", padx=5, pady=5)
ttk.Label(case_a_180_frame, text="CNW:").grid(row=0, column=0, sticky=W, padx=5, pady=2)
self.cnw_180_a_result = self.create_readonly_text(case_a_180_frame)
self.cnw_180_a_result.grid(row=0, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_a_180_frame, text="CNL:").grid(row=0, column=2, sticky=W, padx=5, pady=2)
self.cnl_180_a_result = self.create_readonly_text(case_a_180_frame)
self.cnl_180_a_result.grid(row=0, column=3, sticky=W, padx=5, pady=2)
ttk.Label(case_a_180_frame, text="PNW:").grid(row=1, column=0, sticky=W, padx=5, pady=2)
self.pnw_180_a_result = self.create_readonly_text(case_a_180_frame)
self.pnw_180_a_result.grid(row=1, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_a_180_frame, text="PNL:").grid(row=1, column=2, sticky=W, padx=5, pady=2)
self.pnl_180_a_result = self.create_readonly_text(case_a_180_frame)
self.pnl_180_a_result.grid(row=1, column=3, sticky=W, padx=5, pady=2)
# Case B
case_b_180_frame = ttk.LabelFrame(wind_180_frame, text="Case B")
case_b_180_frame.grid(row=0, column=1, sticky="nsew", padx=5, pady=5)
ttk.Label(case_b_180_frame, text="CNW:").grid(row=0, column=0, sticky=W, padx=5, pady=2)
self.cnw_180_b_result = self.create_readonly_text(case_b_180_frame)
self.cnw_180_b_result.grid(row=0, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_b_180_frame, text="CNL:").grid(row=0, column=2, sticky=W, padx=5, pady=2)
self.cnl_180_b_result = self.create_readonly_text(case_b_180_frame)
self.cnl_180_b_result.grid(row=0, column=3, sticky=W, padx=5, pady=2)
ttk.Label(case_b_180_frame, text="PNW:").grid(row=1, column=0, sticky=W, padx=5, pady=2)
self.pnw_180_b_result = self.create_readonly_text(case_b_180_frame)
self.pnw_180_b_result.grid(row=1, column=1, sticky=W, padx=5, pady=2)
ttk.Label(case_b_180_frame, text="PNL:").grid(row=1, column=2, sticky=W, padx=5, pady=2)
self.pnl_180_b_result = self.create_readonly_text(case_b_180_frame)
self.pnl_180_b_result.grid(row=1, column=3, sticky=W, padx=5, pady=2)
# 初始化显示说明
self.display_instructions()
# 加载并显示图片(使用绝对坐标定位,确保在顶层)
try:
# 获取应用程序路径
if getattr(sys, 'frozen', False):
application_path = os.path.dirname(sys.executable)
else:
application_path = os.path.dirname(os.path.abspath(__file__))
# 构建图片路径
image_path = os.path.join(application_path, "source", "AMWIND.GIF")
# 检查图片文件是否存在
if os.path.exists(image_path):
# 加载图片
self.logo_image = PhotoImage(file=image_path)
# 创建一个Label来显示图片,使用place方法进行绝对定位
self.image_label = Label(self.root, image=self.logo_image, bg="white")
self.image_label.place(x=width - self.logo_image.width() - 10, y=10)
# 将图片Label提升到顶层
self.image_label.lift()
except Exception as e:
print(f"加载图片时出错: {e}")
def create_readonly_text(self, parent):
"""创建只读文本框,通过背景色区分可编辑和不可编辑文本框"""
text = Text(parent, height=1, width=15, state="disabled", bg="#f0f0f0")
return text
def display_instructions(self):
"""显示程序说明"""
self.set_text_widget(self.wind_speed_result, "请输入风速")
self.set_text_widget(self.exposure_result, "请选择暴露等级")
self.set_text_widget(self.slope_result, "请选择山地坡度")
self.set_text_widget(self.altitude_result, "请输入海拔高度")
self.set_text_widget(self.tilt_angle_result, "请输入光伏支架倾角")
self.clear_result_widgets()
def clear_result_widgets(self):
"""清空所有结果文本框"""
for widget in [
self.kz_result, self.kzt_result, self.ke_result, self.kd_result, self.G_result,
self.cnw_0_a_result, self.cnl_0_a_result, self.pnw_0_a_result, self.pnl_0_a_result,
self.cnw_0_b_result, self.cnl_0_b_result, self.pnw_0_b_result, self.pnl_0_b_result,
self.cnw_180_a_result, self.cnl_180_a_result, self.pnw_180_a_result, self.pnl_180_a_result,
self.cnw_180_b_result, self.cnl_180_b_result, self.pnw_180_b_result, self.pnl_180_b_result
]:
self.set_text_widget(widget, "")
def set_text_widget(self, widget, text):
"""设置文本框内容"""
widget.config(state="normal")
widget.delete(1.0, END)
widget.insert(END, text)
widget.config(state="disabled")
def calculate(self):
"""执行风荷载计算并显示结果"""
try:
v = self.wind_speed.get()
exposure = self.exposure_class.get()
slope_str = self.slope.get()
altitude = self.altitude.get()
tilt_angle = self.tilt_angle.get()
self.set_text_widget(self.wind_speed_result, f"{v} m/s")
self.set_text_widget(self.exposure_result, exposure)
self.set_text_widget(self.slope_result, slope_str)
self.set_text_widget(self.altitude_result, f"{altitude} m")
self.set_text_widget(self.tilt_angle_result, f"{tilt_angle}°")
kz_values = {"B": 0.57, "C": 0.85, "D": 1.03}
kz = kz_values[exposure]
slope_percentage = int(slope_str.strip('%'))
slope_values = {0: 1, 5: 1.08, 10: 1.16, 15: 1.362, 20: 1.691, 25: 2.15, 30: 2.15}
kzt = slope_values[slope_percentage]
ke = 1 - altitude * 0.0001147541
kd = 0.85
G = 1.0
self.set_text_widget(self.kz_result, str(kz))
self.set_text_widget(self.kzt_result, str(kzt))
self.set_text_widget(self.ke_result, f"{ke:.6f}")
self.set_text_widget(self.kd_result, str(kd))
self.set_text_widget(self.G_result, str(G))
# 计算CNW和CNL
cnw_0_case_a, cnl_0_case_a = self.get_cn_values(tilt_angle, 0, "A")
cnw_0_case_b, cnl_0_case_b = self.get_cn_values(tilt_angle, 0, "B")
cnw_180_case_a, cnl_180_case_a = self.get_cn_values(tilt_angle, 180, "A")
cnw_180_case_b, cnl_180_case_b = self.get_cn_values(tilt_angle, 180, "B")
# 计算风荷载标准值
pnw_0_case_a = 0.613 * kz * kzt * ke * kd * G * cnw_0_case_a * (v ** 2) / 1000
pnl_0_case_a = 0.613 * kz * kzt * ke * kd * G * cnl_0_case_a * (v ** 2) / 1000
pnw_0_case_b = 0.613 * kz * kzt * ke * kd * G * cnw_0_case_b * (v ** 2) / 1000
pnl_0_case_b = 0.613 * kz * kzt * ke * kd * G * cnl_0_case_b * (v ** 2) / 1000
pnw_180_case_a = 0.613 * kz * kzt * ke * kd * G * cnw_180_case_a * (v ** 2) / 1000
pnl_180_case_a = 0.613 * kz * kzt * ke * kd * G * cnl_180_case_a * (v ** 2) / 1000
pnw_180_case_b = 0.613 * kz * kzt * ke * kd * G * cnw_180_case_b * (v ** 2) / 1000
pnl_180_case_b = 0.613 * kz * kzt * ke * kd * G * cnl_180_case_b * (v ** 2) / 1000
# 显示计算结果
self.set_text_widget(self.cnw_0_a_result, str(cnw_0_case_a))
self.set_text_widget(self.cnl_0_a_result, str(cnl_0_case_a))
self.set_text_widget(self.pnw_0_a_result, f"{pnw_0_case_a:.4f} kN/m²")
self.set_text_widget(self.pnl_0_a_result, f"{pnl_0_case_a:.4f} kN/m²")
self.set_text_widget(self.cnw_0_b_result, str(cnw_0_case_b))
self.set_text_widget(self.cnl_0_b_result, str(cnl_0_case_b))
self.set_text_widget(self.pnw_0_b_result, f"{pnw_0_case_b:.4f} kN/m²")
self.set_text_widget(self.pnl_0_b_result, f"{pnl_0_case_b:.4f} kN/m²")
self.set_text_widget(self.cnw_180_a_result, str(cnw_180_case_a))
self.set_text_widget(self.cnl_180_a_result, str(cnl_180_case_a))
self.set_text_widget(self.pnw_180_a_result, f"{pnw_180_case_a:.4f} kN/m²")
self.set_text_widget(self.pnl_180_a_result, f"{pnl_180_case_a:.4f} kN/m²")
self.set_text_widget(self.cnw_180_b_result, str(cnw_180_case_b))
self.set_text_widget(self.cnl_180_b_result, str(cnl_180_case_b))
self.set_text_widget(self.pnw_180_b_result, f"{pnw_180_case_b:.4f} kN/m²")
self.set_text_widget(self.pnl_180_b_result, f"{pnl_180_case_b:.4f} kN/m²")
except Exception as e:
self.clear_result_widgets()
self.set_text_widget(self.wind_speed_result, f"计算出错: {str(e)}")
self.set_text_widget(self.exposure_result, "")
self.set_text_widget(self.slope_result, "")
self.set_text_widget(self.altitude_result, "")
self.set_text_widget(self.tilt_angle_result, "")
def get_cn_values(self, tilt_angle, wind_direction, case_type):
"""根据倾角、风向角和case类型获取CNW和CNL值"""
# 0度风向角
if wind_direction == 0:
if tilt_angle < 7.5:
if case_type == "A":
return 1.2, 0.3
else:
return -1.1, -0.1
elif tilt_angle == 7.5:
if case_type == "A":
return -0.6, -1.0
else:
return -1.4, 0
elif tilt_angle == 15:
if case_type == "A":
return -0.9, -1.3
else:
return -1.9, 0
elif tilt_angle == 22.5:
if case_type == "A":
return -1.5, -1.6
else:
return -2.4, -0.3
elif tilt_angle == 30:
if case_type == "A":
return -1.8, -1.8
else:
return -2.5, -0.5
elif tilt_angle == 37.5:
if case_type == "A":
return -1.8, -1.8
else:
return -2.4, -0.6
elif tilt_angle == 45:
if case_type == "A":
return -1.6, -1.8
else:
return -2.3, -0.7
else:
angles = [7.5, 15, 22.5, 30, 37.5, 45]
closest_angle = min(angles, key=lambda x: abs(x - tilt_angle))
return self.get_cn_values(closest_angle, wind_direction, case_type)
# 180度风向角
elif wind_direction == 180:
if tilt_angle < 7.5:
if case_type == "A":
return 1.2, 0.3
else:
return -1.1, -0.1
elif tilt_angle == 7.5:
if case_type == "A":
return 0.9, 1.5
else:
return 1.6, 0.3
elif tilt_angle == 15:
if case_type == "A":
return 1.3, 1.6
else:
return 1.8, 0.6
elif tilt_angle == 22.5:
if case_type == "A":
return 1.7, 1.8
else:
return 2.2, 0.7
elif tilt_angle == 30:
if case_type == "A":
return 2.1, 2.1
else:
return 2.6, 1.0
elif tilt_angle == 37.5:
if case_type == "A":
return 2.1, 2.2
else:
return 2.7, 1.1
elif tilt_angle == 45:
if case_type == "A":
return 2.2, 2.5
else:
return 2.6, 1.4
else:
angles = [7.5, 15, 22.5, 30, 37.5, 45]
closest_angle = min(angles, key=lambda x: abs(x - tilt_angle))
return self.get_cn_values(closest_angle, wind_direction, case_type)
def export_calculation_results(self):
"""导出计算结果到TXT文件"""
# 检查是否已计算
if "请输入风速" in self.get_text_widget(self.wind_speed_result):
self.show_message("请先进行计算")
return
# 打开文件夹选择对话框
folder_path = filedialog.askdirectory(title="选择保存计算书的文件夹")
if not folder_path:
return # 用户取消选择
try:
# 构建文件路径
file_path = os.path.join(folder_path, "JSF.TXT")
# 收集计算结果
result_text = self.generate_calculation_report()
# 写入文件
with open(file_path, "w", encoding="utf-8") as f:
f.write(result_text)
self.show_message(f"计算书已成功保存至:\n{file_path}")
except Exception as e:
self.show_message(f"保存计算书时出错:\n{str(e)}")
def generate_calculation_report(self):
"""生成计算报告文本"""
# 收集输入参数
v = self.get_text_widget(self.wind_speed_result)
exposure = self.get_text_widget(self.exposure_result)
slope = self.get_text_widget(self.slope_result)
altitude = self.get_text_widget(self.altitude_result)
tilt_angle = self.get_text_widget(self.tilt_angle_result)
# 收集中间系数
kz = self.get_text_widget(self.kz_result)
kzt = self.get_text_widget(self.kzt_result)
ke = self.get_text_widget(self.ke_result)
kd = self.get_text_widget(self.kd_result)
G = self.get_text_widget(self.G_result)
# 收集0度风向角结果
cnw_0_a = self.get_text_widget(self.cnw_0_a_result)
cnl_0_a = self.get_text_widget(self.cnl_0_a_result)
pnw_0_a = self.get_text_widget(self.pnw_0_a_result)
pnl_0_a = self.get_text_widget(self.pnl_0_a_result)
cnw_0_b = self.get_text_widget(self.cnw_0_b_result)
cnl_0_b = self.get_text_widget(self.cnl_0_b_result)
pnw_0_b = self.get_text_widget(self.pnw_0_b_result)
pnl_0_b = self.get_text_widget(self.pnl_0_b_result)
# 收集180度风向角结果
cnw_180_a = self.get_text_widget(self.cnw_180_a_result)
cnl_180_a = self.get_text_widget(self.cnl_180_a_result)
pnw_180_a = self.get_text_widget(self.pnw_180_a_result)
pnl_180_a = self.get_text_widget(self.pnl_180_a_result)
cnw_180_b = self.get_text_widget(self.cnw_180_b_result)
cnl_180_b = self.get_text_widget(self.cnl_180_b_result)
pnw_180_b = self.get_text_widget(self.pnw_180_b_result)
pnl_180_b = self.get_text_widget(self.pnl_180_b_result)
# 生成报告内容
report = f"""美标风荷载计算书
=======================
一、输入参数
-----------------------
3秒时距风速: {v}
暴露等级: {exposure}
山地坡度: {slope}
海拔高度: {altitude}
光伏支架倾角: {tilt_angle}
二、中间计算参数
-----------------------
速度压力暴露系数(kz): {kz}
山形系数(kzt): {kzt}
地面高程系数(ke): {ke}
风向因子(kd): {kd}
阵风效应系数(G): {G}
三、0度风向角计算结果
-----------------------
Case A:
CNW: {cnw_0_a}
CNL: {cnl_0_a}
PNW: {pnw_0_a}
PNL: {pnl_0_a}
Case B:
CNW: {cnw_0_b}
CNL: {cnl_0_b}
PNW: {pnw_0_b}
PNL: {pnl_0_b}
四、180度风向角计算结果
-----------------------
Case A:
CNW: {cnw_180_a}
CNL: {cnl_180_a}
PNW: {pnw_180_a}
PNL: {pnl_180_a}
Case B:
CNW: {cnw_180_b}
CNL: {cnl_180_b}
PNW: {pnw_180_b}
PNL: {pnl_180_b}
=======================
计算完成时间: {self.get_current_time()}
"""
return report
def get_text_widget(self, widget):
"""获取文本框内容"""
widget.config(state="normal")
text = widget.get(1.0, END).strip()
widget.config(state="disabled")
return text
def show_message(self, message):
"""显示消息对话框"""
message_window = Toplevel(self.root)
message_window.title("提示")
message_window.geometry("300x150")
message_window.resizable(False, False)
# 居中显示
screen_width = message_window.winfo_screenwidth()
screen_height = message_window.winfo_screenheight()
x = (screen_width - 300) // 2
y = (screen_height - 150) // 2
message_window.geometry(f"+{x}+{y}")
ttk.Label(message_window, text=message).pack(padx=20, pady=20)
ttk.Button(message_window, text="确定", command=message_window.destroy).pack(pady=10)
def get_current_time(self):
"""获取当前时间"""
import datetime
return datetime.datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")
if __name__ == "__main__":
root = Tk()
app = WindLoadCalculator(root)
root.mainloop() 将其修改成page1.dart,去掉生成新文件功能,改成按键跳转一个计算书新界面result_page.dart,并将计算书生成到result_page.dart界面的一个控件中
最新发布