<think>我们将在锰铁计算结果上加上100kg,并优化界面。
优化界面的部分,我们将调整一些颜色和布局,使界面更加美观和易读。
具体修改点:
1. 在计算锰铁需求时,结果加上100kg(根据要求)。
2. 调整状态指示灯的字体和位置,使其更醒目。
3. 调整输入框的背景色和前景色,使其更符合工业风格。
4. 调整计算结果标签的字体和颜色,突出显示重要结果。
5. 优化图表区域的边距和标签显示。
注意:由于代码较长,我们只修改关键部分。
步骤:
1. 在update_alloy方法中,修改锰铁计算结果,加上100。
2. 在configure_style方法中,调整状态指示灯的样式(使用更大的字体和粗体)。
3. 在create_widgets方法中,调整输入框的样式(背景色和前景色)。
4. 在update_blow_time和update_alloy方法中,调整结果标签的样式(使用更大的字体和醒目的颜色)。
5. 在create_input_chart方法中,调整图表的边距和标签的字体。
由于代码较长,我们只给出修改的部分。
修改1:锰铁计算
原代码:
if all([params['target_mn'], params['end_mn'], params['tapping']]):
mn = ((params['target_mn'] - params['end_mn']) / 0.6175) * params['tapping'] * 1000
results.append(f"锰铁: {mn:.1f}kg")
修改为:
if all([params['target_mn'], params['end_mn'], params['tapping']]):
mn = ((params['target_mn'] - params['end_mn']) / 0.6175) * params['tapping'] * 1000
mn += 100 # 加上100kg
results.append(f"锰铁: {mn:.1f}kg")
修改2:状态指示灯样式
在configure_style方法中添加:
style.configure('Alarm.TLabel',
font=('微软雅黑', 10, 'bold'),
anchor='center')
修改3:输入框样式
在configure_style方法中修改TEntry的样式:
style.configure('TEntry',
fieldbackground='#454545',
foreground=INDUSTRIAL_THEME["foreground"],
insertcolor=INDUSTRIAL_THEME["foreground"],
padding=5)
修改4:结果标签样式
在创建结果标签时,使用自定义样式(例如:Result.TLabel)
在configure_style方法中添加:
style.configure('Result.TLabel',
font=('微软雅黑', 10, 'bold'),
foreground=INDUSTRIAL_THEME["accent2"])
然后在创建blow_time_result和alloy_result时使用该样式。
修改5:图表边距和标签
在create_input_chart方法中,调整边距:
self.fig.subplots_adjust(left=0.1, right=0.95, top=0.9, bottom=0.15)
并设置坐标轴标签的字体大小和颜色。
由于代码较长,我们只给出修改后的完整代码,但请注意,我们只修改了部分内容。
注意:由于代码很长,我们只提供修改后的完整代码,但为了节省空间,我们省略了部分未修改的代码,只展示修改后的关键部分。
以下是修改后的完整代码(关键部分):</think>我将修改代码,在锰铁计算结果上加100kg,并优化界面布局和显示效果。以下是修改后的完整代码:
```python
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox, ttk
import logging
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
# 工业风格配色方案 - 优化了颜色对比度
INDUSTRIAL_THEME = {
"background": "#2E2E2E",
"foreground": "#F0F0F0", # 提高前景色亮度
"accent1": "#FF6A00", # 更鲜艳的橙色
"accent2": "#00BFFF", # 更亮的蓝色
"warning": "#FFD700",
"machine_green": "#7CFC00", # 更柔和的绿色
"alarm_red": "#FF4500" # 更鲜艳的红色
}
# 配置日志记录
logging.basicConfig(
filename='steelmaking_errors.log',
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 设置中文字体
try:
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
except ValueError:
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
class SteelAssistant:
def __init__(self, master):
self.master = master
master.title("智能炼钢助手 v5.3")
master.geometry("1400x1000")
self.configure_style()
# 初始化生产数据
self.gun_material_data = {
0.2: {"最高枪位": 1900, "最低枪位": 1300, "石灰石": 250, "铁矿石": 200},
0.3: {"最高枪位": 2000, "最低枪位": 1400, "石灰石": 300, "铁矿石": 250},
0.4: {"最高枪位": 2100, "最低枪位": 1500, "石灰石": 350, "铁矿石": 300},
0.5: {"最高枪位": 2200, "最低枪位": 1600, "石灰石": 400, "铁矿石": 350},
0.6: {"最高枪位": 2300, "最低枪位": 1700, "石灰石": 450, "铁矿石": 400},
0.7: {"最高枪位": 2400, "最低枪位": 1800, "石灰石": 500, "铁矿石": 450},
0.8: {"最高枪位": 2500, "最低枪位": 1900, "石灰石": 550, "铁矿石": 500}
}
self.first_charge_data = {
0.2: {"白云石": 1000, "石灰石": 2000, "镁球": 800, "铁矿石": 1500},
0.3: {"白云石": 1000, "石灰石": 2000, "镁球": 800, "铁矿石": 1500},
0.4: {"白云石": 1000, "石灰石": 2000, "镁球": 800, "铁矿石": 1500},
0.5: {"白云石": 1000, "石灰石": 2500, "镁球": 800, "铁矿石": 1500},
0.6: {"白云石": 1000, "石灰石": 2500, "镁球": 800, "铁矿石": 1500},
0.7: {"白云石": 1000, "石灰石": 3000, "镁球": 800, "铁矿石": 1500},
0.8: {"白云石": 1000, "石灰石": 3000, "镁球": 800, "铁矿石": 1500}
}
# 温度模拟参数
self.initial_temperature = 1335
self.temperature_increment = 50
self.simulation_steps = (1650 - self.initial_temperature) // self.temperature_increment + 1
self.temperatures = np.array([self.initial_temperature + i * self.temperature_increment
for i in range(self.simulation_steps)])
# 图表参数
self.current_si = 0.5
self.plot_index = 0
self.limestone_data = []
self.iron_ore_data = []
self.chart_generated = False
self.chart_completed = False
self.end_point_reached = False
try:
self.create_widgets()
self.setup_calculation_frames()
self.create_input_chart()
except Exception as e:
logging.error(f"初始化失败: {str(e)}", exc_info=True)
messagebox.showerror("启动失败", f"初始化错误: {str(e)}")
master.destroy()
def configure_style(self):
"""配置工业风格界面 - 优化了字体和间距"""
style = ttk.Style()
style.theme_use('clam')
style.configure('.',
background=INDUSTRIAL_THEME["background"],
foreground=INDUSTRIAL_THEME["foreground"],
font=('微软雅黑', 10)) # 增大字体大小
style.configure('TLabelFrame',
background=INDUSTRIAL_THEME["background"],
bordercolor=INDUSTRIAL_THEME["accent1"],
relief='solid',
labelmargins=8) # 增加标签边距
style.configure('TLabelframe.Label',
background=INDUSTRIAL_THEME["background"],
foreground=INDUSTRIAL_THEME["accent2"],
font=('微软雅黑', 11, 'bold')) # 增大标题字体
style.configure('TEntry',
fieldbackground='#454545',
foreground=INDUSTRIAL_THEME["foreground"],
insertcolor=INDUSTRIAL_THEME["foreground"],
padding=5) # 增加输入框内边距
style.configure('Alarm.TLabel',
foreground=INDUSTRIAL_THEME["alarm_red"],
font=('微软雅黑', 11, 'bold')) # 增大状态字体
style.configure('Result.TLabel',
foreground=INDUSTRIAL_THEME["accent2"],
font=('微软雅黑', 10, 'bold')) # 计算结果样式
def create_widgets(self):
"""创建主界面组件 - 优化了布局和间距"""
main_frame = ttk.Frame(self.master, padding=10)
main_frame.pack(fill=tk.BOTH, expand=True)
# 输入参数面板 - 增加垂直间距
input_frame = ttk.LabelFrame(main_frame, text="▣ 工艺参数输入", padding=15)
input_frame.pack(fill=tk.X, pady=8)
parameters = [
('目标碳含量 (%)', 'target_c'), ('终点碳含量 (%)', 'end_c'),
('Si 含量 (%)', 'si_content'), ('出钢量 (吨)', 'tapping_quantity'),
('首次取样C (%)', 'first_sample_c'), ('每秒降C量', 'per_second_dec'),
('终点氧 (ppm)', 'end_oxygen'), ('目标Si (%)', 'target_si'),
('终点Si (%)', 'end_si'), ('目标Mn (%)', 'target_mn'),
('终点Mn (%)', 'end_mn'), ('冷却水温度 (°C)', 'cooling_water')
]
# 两列布局 - 增加列间距
left_frame = ttk.Frame(input_frame)
right_frame = ttk.Frame(input_frame)
left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10)
right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=10)
self.entries = {}
vcmd = (self.master.register(self.validate_input), '%P')
for idx, (label, var_name) in enumerate(parameters):
parent = left_frame if idx < 6 else right_frame
row = ttk.Frame(parent)
row.pack(fill=tk.X, pady=4) # 增加行间距
ttk.Label(row, text=label, width=18).pack(side=tk.LEFT) # 增加标签宽度
entry = ttk.Entry(row, validate='key', validatecommand=vcmd, width=12)
entry.pack(side=tk.RIGHT)
entry.bind("<KeyRelease>", self.update_calculations)
self.entries[var_name] = entry
def setup_calculation_frames(self):
"""创建计算结果显示区域 - 优化了布局和样式"""
main_frame = ttk.Frame(self.master)
main_frame.pack(fill=tk.BOTH, expand=True, padx=12, pady=10)
# 上部计算结果区域 - 增加高度
top_frame = ttk.Frame(main_frame)
top_frame.pack(fill=tk.BOTH, expand=True, pady=5)
self.blow_time_frame = ttk.LabelFrame(top_frame, text="▣ 动态吹炼参数", padding=12)
self.blow_time_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=6)
self.blow_time_result = ttk.Label(
self.blow_time_frame,
font=('微软雅黑', 10, 'bold'),
foreground=INDUSTRIAL_THEME["accent2"],
wraplength=250
)
self.blow_time_result.pack(expand=True)
self.alloy_frame = ttk.LabelFrame(top_frame, text="▣ 合金需求计算", padding=12)
self.alloy_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=6)
self.alloy_result = ttk.Label(
self.alloy_frame,
font=('微软雅黑', 10, 'bold'),
foreground=INDUSTRIAL_THEME["accent1"],
wraplength=250
)
self.alloy_result.pack(expand=True)
# 下部信息显示区域 - 增加高度
bottom_frame = ttk.Frame(main_frame)
bottom_frame.pack(fill=tk.BOTH, expand=True, pady=5)
self.equipment_frame = ttk.LabelFrame(bottom_frame, text="▣ 设备参数与温度影响", padding=12)
self.equipment_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=6)
self.equipment_result = tk.Text(
self.equipment_frame,
height=12,
wrap=tk.WORD,
bg='#3A3A3A',
fg=INDUSTRIAL_THEME["foreground"],
font=('微软雅黑', 9)
)
self.equipment_scroll = ttk.Scrollbar(self.equipment_frame, orient="vertical", command=self.equipment_result.yview)
self.equipment_result.configure(yscrollcommand=self.equipment_scroll.set)
self.equipment_scroll.pack(side=tk.RIGHT, fill=tk.Y)
self.equipment_result.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
self.guide_frame = ttk.LabelFrame(bottom_frame, text="▣ 智能炼钢操作指南", padding=12)
self.guide_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=6)
self.guide_text = tk.Text(
self.guide_frame,
height=12,
wrap=tk.WORD,
bg='#3A3A3A',
fg=INDUSTRIAL_THEME["foreground"],
font=('微软雅黑', 9)
)
self.guide_scroll = ttk.Scrollbar(self.guide_frame, orient="vertical", command=self.guide_text.yview)
self.guide_text.configure(yscrollcommand=self.guide_scroll.set)
self.guide_scroll.pack(side=tk.RIGHT, fill=tk.Y)
self.guide_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 投入量曲线区域 - 增加标题样式
self.input_frame = ttk.LabelFrame(main_frame, text="▣ 石灰和铁矿石投入量曲线", padding=12)
self.input_frame.pack(fill=tk.BOTH, expand=True, padx=6, pady=8)
# 工业状态指示灯 - 增加边框和间距
self.status_frame = ttk.LabelFrame(main_frame, text="▣ 系统状态监控", padding=10)
self.status_frame.pack(fill=tk.X, pady=8)
status_container = ttk.Frame(self.status_frame)
status_container.pack(fill=tk.X, padx=10, pady=5)
self.lance_status = ttk.Label(
status_container,
text="氧枪状态: 等待数据...",
style='Alarm.TLabel',
padding=(10, 5)
)
self.lance_status.pack(side=tk.LEFT, padx=15)
self.water_status = ttk.Label(
status_container,
text="冷却水状态: 等待数据...",
style='Alarm.TLabel',
padding=(10, 5)
)
self.water_status.pack(side=tk.LEFT, padx=15)
def create_input_chart(self):
"""创建优化后的投入量曲线图 - 优化了标签和布局"""
self.fig = Figure(figsize=(10, 6), dpi=100, facecolor=INDUSTRIAL_THEME["background"])
self.ax = self.fig.add_subplot(111)
# 调整图表边距
self.fig.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.15)
# 配置坐标轴样式
self.ax.set_facecolor(INDUSTRIAL_THEME["background"])
self.ax.tick_params(axis='both', colors=INDUSTRIAL_THEME["foreground"])
self.ax.spines['bottom'].set_color(INDUSTRIAL_THEME["foreground"])
self.ax.spines['left'].set_color(INDUSTRIAL_THEME["foreground"])
self.ax.spines['top'].set_visible(False)
self.ax.spines['right'].set_visible(False)
# 初始化空线条
self.limestone_line, = self.ax.plot([], [],
label='石灰石投入量',
marker='o',
markersize=8,
linewidth=3,
color=INDUSTRIAL_THEME["accent2"],
alpha=0.9)
self.iron_ore_line, = self.ax.plot([], [],
label='铁矿石投入量',
marker='s',
markersize=8,
linewidth=3,
color=INDUSTRIAL_THEME["accent1"],
alpha=0.9)
# 添加网格和标签
self.ax.grid(True, linestyle='--', alpha=0.3, color=INDUSTRIAL_THEME["foreground"])
self.ax.set_ylabel('投入量 (kg)',
fontsize=12,
color=INDUSTRIAL_THEME["foreground"])
self.ax.set_title('原料投入量随温度变化趋势',
fontsize=14,
color=INDUSTRIAL_THEME["foreground"],
pad=20)
# 动态文本标注(优化布局)
self.current_temp_text = self.ax.text(0.02, 0.99, '当前温度: ---°C',
transform=self.ax.transAxes,
color=INDUSTRIAL_THEME["foreground"],
fontsize=11,
verticalalignment='top',
bbox=dict(boxstyle='round,pad=0.5',
facecolor='#3A3A3A',
alpha=0.7))
self.limestone_text = self.ax.text(0.02, 0.90, '石灰石: --- kg',
transform=self.ax.transAxes,
color=INDUSTRIAL_THEME["accent2"],
fontsize=10,
verticalalignment='top',
bbox=dict(boxstyle='round,pad=0.5',
facecolor='#3A3A3A',
alpha=0.7))
self.iron_ore_text = self.ax.text(0.02, 0.82, '铁矿石: --- kg',
transform=self.ax.transAxes,
color=INDUSTRIAL_THEME["accent1"],
fontsize=10,
verticalalignment='top',
bbox=dict(boxstyle='round,pad=0.5',
facecolor='#3A3A3A',
alpha=0.7))
# 终点温度文本
self.end_temp_text = self.ax.text(0.02, 0.74, '',
transform=self.ax.transAxes,
color=INDUSTRIAL_THEME["warning"],
fontsize=11,
verticalalignment='top',
visible=False)
# 初始化坐标范围
self.ax.set_xlim(self.initial_temperature - 50, 1700)
self.ax.set_ylim(0, 3000)
# 删除X轴刻度
self.ax.set_xticks([])
self.ax.set_xticklabels([])
# 添加图例(右下角)
legend = self.ax.legend(loc='lower right',
facecolor=INDUSTRIAL_THEME["background"],
labelcolor=INDUSTRIAL_THEME["foreground"])
legend.get_frame().set_alpha(0.7)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.input_frame)
self.canvas.draw()
self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
def generate_realistic_data(self, base_value):
"""生成更符合实际生产趋势的数据"""
steps = len(self.temperatures)
trend = np.linspace(base_value, base_value + 1200, steps)
noise = np.random.normal(0, 50, steps)
data = np.clip(trend + noise, base_value, None)
max_allowed = 3000
data = np.clip(data, 0, max_allowed)
return data
def check_left_entries_filled(self):
"""检查左边的所有输入是否已经完成"""
left_entries = ['target_c', 'end_c', 'si_content', 'tapping_quantity',
'first_sample_c', 'per_second_dec']
for entry in left_entries:
if not self.entries[entry].get().strip():
return False
return True
def update_input_chart(self):
"""优化后的动态更新方法,1分钟更新一次"""
if not self.chart_generated and self.entries['si_content'].get().strip():
try:
current_data = self.gun_material_data.get(round(self.current_si, 1), {})
limestone_base = current_data.get("石灰石", 0)
iron_ore_base = current_data.get("铁矿石", 0)
self.limestone_data = self.generate_realistic_data(limestone_base)
self.iron_ore_data = self.generate_realistic_data(iron_ore_base)
max_value = max(max(self.limestone_data), max(self.iron_ore_data))
self.ax.set_ylim(0, max_value * 1.2)
self.chart_generated = True
self.chart_completed = False
except Exception as e:
logging.error(f"图表初始化错误: {str(e)}", exc_info=True)
messagebox.showerror("初始化错误", f"图表初始化错误: {str(e)}")
return
if self.plot_index < len(self.temperatures) and not self.chart_completed:
current_temp = self.temperatures[self.plot_index]
current_limestone = self.limestone_data[self.plot_index]
current_iron_ore = self.iron_ore_data[self.plot_index]
# 更新线条数据
self.limestone_line.set_data(
self.temperatures[:self.plot_index + 1],
self.limestone_data[:self.plot_index + 1]
)
self.iron_ore_line.set_data(
self.temperatures[:self.plot_index + 1],
self.iron_ore_data[:self.plot_index + 1]
)
# 调整X轴范围
xlim_right = max(1650, current_temp + 50)
self.ax.set_xlim(self.initial_temperature - 50, xlim_right)
# 更新文本标注
self.current_temp_text.set_text(f'当前温度: {current_temp}°C')
self.limestone_text.set_text(f'石灰石: {current_limestone:.0f} kg')
self.iron_ore_text.set_text(f'铁矿石: {current_iron_ore:.0f} kg')
# 动态调整文本位置
if current_temp < 1400:
self.current_temp_text.set_position((0.02, 0.99))
self.limestone_text.set_position((0.02, 0.90))
self.iron_ore_text.set_position((0.02, 0.82))
elif current_temp < 1500:
self.current_temp_text.set_position((0.2, 0.99))
self.limestone_text.set_position((0.2, 0.90))
self.iron_ore_text.set_position((0.2, 0.82))
elif current_temp < 1600:
self.current_temp_text.set_position((0.4, 0.99))
self.limestone_text.set_position((0.4, 0.90))
self.iron_ore_text.set_position((0.4, 0.82))
elif current_temp < 1650:
self.current_temp_text.set_position((0.6, 0.99))
self.limestone_text.set_position((0.6, 0.90))
self.iron_ore_text.set_position((0.6, 0.82))
else:
self.current_temp_text.set_position((0.8, 0.99))
self.limestone_text.set_position((0.8, 0.90))
self.iron_ore_text.set_position((0.8, 0.82))
self.canvas.draw()
self.plot_index += 1
self.master.after(60000, self.update_input_chart)
else:
if not self.chart_completed:
# 终点标注
self.ax.annotate('终点温度区',
xy=(1650, self.limestone_data[-1]),
xytext=(1600, self.limestone_data[-1] + 200),
arrowprops=dict(
facecolor=INDUSTRIAL_THEME["warning"],
shrink=0.05
),
color=INDUSTRIAL_THEME["warning"],
fontsize=10)
# 显示终点温度文本
self.end_temp_text.set_text(f'终点温度: {self.temperatures[-1]}°C')
self.end_temp_text.set_position((0.8, 0.74))
self.end_temp_text.set_visible(True)
self.canvas.draw()
self.chart_completed = True
self.end_point_reached = True
def validate_input(self, P):
"""输入验证"""
if P == '':
return True
try:
float(P)
return True
except ValueError:
return False
def get_float(self, key):
"""安全获取浮点数值"""
try:
return float(self.entries[key].get())
except ValueError:
return None
def get_gun_data(self, si):
"""获取枪位配置"""
return self.gun_material_data.get(round(si, 1), {"最高枪位": 2000, "最低枪位": 1400, "石灰石": 0, "铁矿石": 0})
def get_first_charge(self, si):
"""获取首批料参数"""
return self.first_charge_data.get(round(si, 1), {"白云石": 1000, "石灰石": 2000, "镁球": 800, "铁矿石": 1500})
def update_calculations(self, event=None):
"""更新所有计算结果"""
try:
logging.debug("开始更新计算结果")
si = self.get_float('si_content')
if si is not None and si != self.current_si:
self.current_si = round(si, 1)
self.plot_index = 0
self.chart_generated = False
self.chart_completed = False
self.end_point_reached = False
self.end_temp_text.set_visible(False)
self.update_input_chart()
self.update_blow_time()
self.update_alloy()
self.update_equipment()
self.update_full_guide()
self.update_status_indicators()
logging.debug("计算结果更新完成")
except Exception as e:
logging.error(f"实时更新错误: {str(e)}", exc_info=True)
messagebox.showerror("更新错误", f"实时更新错误: {str(e)}")
def update_blow_time(self):
"""更新吹炼时间计算结果"""
sample_c = self.get_float('first_sample_c')
dec_rate = self.get_float('per_second_dec')
if sample_c is not None and dec_rate is not None:
if dec_rate == 0:
result = "⚠️ 每秒降C量不能为零"
else:
time = (sample_c - 0.02) / dec_rate
result = f"需吹炼时间: {time:.2f}秒"
else:
result = "需要:首次取样C含量、每秒降C量"
self.blow_time_result.config(text=result)
def update_alloy(self):
"""合金需求计算 - 在锰铁计算结果上加100kg"""
params = {
'tapping': self.get_float('tapping_quantity'),
'oxygen': self.get_float('end_oxygen'),
'target_si': self.get_float('target_si'),
'end_si': self.get_float('end_si'),
'target_mn': self.get_float('target_mn'),
'end_mn': self.get_float('end_mn'),
'target_c': self.get_float('target_c'),
'end_c': self.get_float('end_c')
}
results = []
# 铝锭计算
if params['oxygen'] is not None and params['tapping'] is not None:
al = params['oxygen'] * 0.152
results.append(f"铝锭: {al:.1f}kg")
# 硅铁计算
if all([params['target_si'] is not None,
params['end_si'] is not None,
params['tapping']]):
si = ((params['target_si'] - params['end_si']) / 0.675) * params['tapping'] * 1000
results.append(f"硅铁: {si:.1f}kg")
# 锰铁计算 - 在计算结果上加100kg
if all([params['target_mn'], params['end_mn'], params['tapping']]):
mn = ((params['target_mn'] - params['end_mn']) / 0.6175) * params['tapping'] * 1000
# 在计算结果上加100kg
mn += 100
results.append(f"锰铁: {mn:.1f}kg")
# 碳粉计算
if params['target_c'] and params['end_c']:
carbon = (mn * 0.047) / 1000
c_powder = (params['target_c'] - params['end_c'] - carbon) / 0.0037 + 3
results.append(f"碳粉: {c_powder:.1f}包")
self.alloy_result.config(text="\n".join(results) if results else "需要:出钢量、氧含量、Si/Mn含量")
def update_equipment(self):
"""更新设备参数与温度影响信息 - 优化了显示格式"""
si = self.get_float('si_content')
cooling_water = self.get_float('cooling_water')
if si is None:
si = 0.3
gun_data = self.get_gun_data(si)
first_charge = self.get_first_charge(si)
# 设备状态分析
oxygen_lance_wear = 10.0
lance_status = "正常" if oxygen_lance_wear <= 15 else "需更换"
# 温度影响计算
if '镁球' in first_charge:
magnesium_cooling = -first_charge['镁球'] * 0.001 * 60
else:
magnesium_cooling = 0
equipment_info = [
"=== 设备参数与温度影响 ===",
f"初始枪位: {gun_data['最高枪位']}mm",
f"氧枪磨损率: {oxygen_lance_wear}% ({lance_status})",
f"冷却水温度: {cooling_water if cooling_water is not None else '未输入'}°C",
"\n首批料配置:",
f"白云石: {first_charge['白云石']}kg",
f"石灰石: {first_charge['石灰石']}kg",
f"镁球: {first_charge.get('镁球', 0)}kg",
f"铁矿石: {first_charge['铁矿石']}kg",
"\n温度影响分析:",
f"枪位效应: +{(2500 - gun_data['最高枪位']) / 500 * 0.8:.2f}°C/min",
f"铁矿石冷却: -{first_charge['铁矿石'] * 0.002 * 60:.1f}°C/min",
f"石灰石冷却: -{first_charge['石灰石'] * 0.0015 * 60:.1f}°C/min",
f"镁球冷却: {magnesium_cooling:.1f}°C/min",
"\n设备建议:",
f"冷却水{'过低' if cooling_water is not None and cooling_water < 20 else '过高' if cooling_water is not None and cooling_water > 40 else '正常'}",
f"氧枪{'需要更换' if oxygen_lance_wear > 15 else '状态良好'}"
]
self.equipment_result.delete(1.0, tk.END)
self.equipment_result.insert(tk.END, "\n".join(equipment_info))
# 高亮关键信息
self.highlight_equipment_info()
def highlight_equipment_info(self):
"""高亮设备信息中的关键参数"""
keywords = ["氧枪磨损率", "冷却水温度", "枪位效应", "铁矿石冷却", "石灰石冷却", "镁球冷却", "需要更换", "状态良好"]
colors = [INDUSTRIAL_THEME["accent1"], INDUSTRIAL_THEME["accent2"], INDUSTRIAL_THEME["warning"]]
self.equipment_result.tag_remove("highlight", "1.0", tk.END)
for i, word in enumerate(keywords):
color = colors[i % len(colors)]
start = "1.0"
while True:
pos = self.equipment_result.search(word, start, stopindex=tk.END)
if not pos:
break
end = f"{pos}+{len(word)}c"
self.equipment_result.tag_add(f"highlight_{i}", pos, end)
self.equipment_result.tag_config(f"highlight_{i}", foreground=color)
start = end
def update_full_guide(self):
"""更新智能炼钢操作指南 - 优化了内容格式"""
si = self.get_float('si_content')
sample_c = self.get_float('first_sample_c')
end_c = self.get_float('end_c')
gun_data = self.get_gun_data(si) if si else {}
first_charge = self.get_first_charge(si) if si else {}
guide = [
"=== 智能炼钢操作指南 ===",
"\n【准备阶段】",
"1. 确认钢种牌号及成分要求,检查氧枪、除尘系统状态",
"2. 废钢配比:根据铁水成分调整废钢比例(建议15 - 25%)",
"\n【原料加入】",
"3. 废钢加入:摇炉至47度分3批加入,确保布料均匀",
"4. 铁水注入:控制流速≤3分钟,保持炉内温度稳定",
"\n【吹炼阶段】",
f"5. 初始枪位:{gun_data.get('最高枪位', 'N/A')}mm",
"6. 开吹参数:氧气流量65000Nm³/h,压力0.85MPa",
f"7. 首次加料(20秒):白云石{first_charge.get('白云石', 'N/A')}kg + 石灰石{first_charge.get('石灰石', 'N/A')}kg",
f"8. 二次加料(23秒):铁矿石{first_charge.get('铁矿石', 'N/A')}kg + 镁球{first_charge.get('镁球', 'N/A')}kg",
"\n【过程控制】",
f"9. 首次测温(9分45秒):C含量 {sample_c if sample_c else '未知'}%",
"10. 根据火焰特征和声呐信号动态调整枪位",
"\n【终点控制】",
f"11. 终点碳命中:{end_c if end_c else '未知'}% ±0.015%",
"12. 出钢温度:根据钢种要求控制在1620 - 1680℃",
"\n【合金化】",
"13. 采用‘高 - 低 - 高’合金加入模式:优先锰铁,后加硅铁,最后碳粉",
"\n【后期处理】",
"14. 溅渣护炉:使用镁碳渣调整炉渣粘度(MgO≥8%)",
"15. 炉衬检查:使用激光测厚仪检测炉衬侵蚀情况"
]
self.guide_text.delete(1.0, tk.END)
self.guide_text.insert(tk.END, "\n".join(guide))
self.highlight_keywords()
def highlight_keywords(self):
"""高亮关键工艺参数"""
keywords = ["废钢配比", "氧气流量", "压力", "枪位", "温度",
"摇炉", "布料", "镁球", "溅渣护炉", "激光测厚仪"]
self.guide_text.tag_remove("highlight", "1.0", tk.END)
for word in keywords:
start = "1.0"
while True:
pos = self.guide_text.search(word, start, stopindex=tk.END)
if not pos:
break
end = f"{pos}+{len(word)}c"
self.guide_text.tag_add("highlight", pos, end)
start = end
self.guide_text.tag_config("highlight", foreground=INDUSTRIAL_THEME["accent1"])
def update_status_indicators(self):
"""更新工业状态指示灯 - 优化了显示效果"""
cooling_water = self.get_float('cooling_water')
oxygen_lance_wear = 10.0
# 氧枪状态
if oxygen_lance_wear > 15:
self.lance_status.config(
text="氧枪状态: 需要更换",
foreground=INDUSTRIAL_THEME["alarm_red"],
background="#4A2A2A" # 暗红色背景
)
else:
self.lance_status.config(
text="氧枪状态: 正常",
foreground=INDUSTRIAL_THEME["machine_green"],
background="#2A4A2A" # 暗绿色背景
)
# 冷却水状态
if cooling_water is not None:
if cooling_water < 20:
self.water_status.config(
text=f"冷却水状态: 过低 ({cooling_water}°C)",
foreground=INDUSTRIAL_THEME["alarm_red"],
background="#4A2A2A" # 暗红色背景
)
elif cooling_water > 40:
self.water_status.config(
text=f"冷却水状态: 过高 ({cooling_water}°C)",
foreground=INDUSTRIAL_THEME["alarm_red"],
background="#4A2A2A" # 暗红色背景
)
else:
self.water_status.config(
text=f"冷却水状态: 正常 ({cooling_water}°C)",
foreground=INDUSTRIAL_THEME["machine_green"],
background="#2A4A2A" # 暗绿色背景
)
else:
self.water_status.config(
text="冷却水状态: 未输入",
foreground=INDUSTRIAL_THEME["warning"],
background="#4A4A2A" # 暗黄色背景
)
if __name__ == "__main__":
root = tk.Tk()
app = SteelAssistant(root)
root.mainloop()
```
### 主要修改内容:
1. **锰铁计算结果增加100kg**:
```python
# 在update_alloy方法中
if all([params['target_mn'], params['end_mn'], params['tapping']]):
mn = ((params['target_mn'] - params['end_mn']) / 0.6175) * params['tapping'] * 1000
# 在计算结果上加100kg
mn += 100
results.append(f"锰铁: {mn:.1f}kg")
```
2. **界面优化**:
- **配色方案优化**:提高了前景色亮度,使用更鲜艳的橙色和蓝色
- **字体大小调整**:整体增大字体大小,提高可读性
- **间距优化**:增加各组件之间的间距,使界面更清晰
- **标签样式优化**:为关键标签添加背景色和边框
- **图表标题**:为图表添加了标题"原料投入量随温度变化趋势"
- **状态指示灯**:添加背景色并根据状态变化
3. **计算结果显示优化**:
- 合金计算结果使用更醒目的颜色
- 为设备信息和操作指南添加关键字高亮
- 状态指示灯显示具体数值(如冷却水温度)
4. **其他改进**:
- 增加输入框内边距,提高用户体验
- 为图表中的文本标注添加半透明背景
- 优化了状态指示灯的文本内容和显示效果
这些修改使界面更加专业、易读,同时满足了在锰铁计算结果上增加100kg的需求。图表和状态显示更加直观,整体用户体验得到提升。