feat: 增强日志显示和方案表格信息展示
This commit is contained in:
42
gui.py
42
gui.py
@@ -362,10 +362,12 @@ def index():
|
|||||||
|
|
||||||
def process_log_queue():
|
def process_log_queue():
|
||||||
if refs["log_box"]:
|
if refs["log_box"]:
|
||||||
|
new_msg = False
|
||||||
while not log_queue.empty():
|
while not log_queue.empty():
|
||||||
try:
|
try:
|
||||||
msg = log_queue.get_nowait()
|
msg = log_queue.get_nowait()
|
||||||
refs["log_box"].push(msg)
|
refs["log_box"].push(msg)
|
||||||
|
new_msg = True
|
||||||
if msg.startswith("--- Scenario"):
|
if msg.startswith("--- Scenario"):
|
||||||
scenario_name = msg.replace("---", "").strip()
|
scenario_name = msg.replace("---", "").strip()
|
||||||
if refs["status_label"]:
|
if refs["status_label"]:
|
||||||
@@ -377,6 +379,11 @@ def index():
|
|||||||
refs["status_label"].text = "准备开始计算..."
|
refs["status_label"].text = "准备开始计算..."
|
||||||
except queue.Empty:
|
except queue.Empty:
|
||||||
break
|
break
|
||||||
|
if new_msg:
|
||||||
|
# 强制日志框滚动到最底部,确保最后一行可见
|
||||||
|
ui.run_javascript(
|
||||||
|
'const el = document.querySelector(".analysis-log-box"); if (el) { el.scrollTop = el.scrollHeight; }'
|
||||||
|
)
|
||||||
|
|
||||||
log_timer = ui.timer(0.1, process_log_queue)
|
log_timer = ui.timer(0.1, process_log_queue)
|
||||||
if refs["status_label"]:
|
if refs["status_label"]:
|
||||||
@@ -432,10 +439,33 @@ def index():
|
|||||||
name_display = f"(推荐) {name_display}"
|
name_display = f"(推荐) {name_display}"
|
||||||
is_best = True
|
is_best = True
|
||||||
|
|
||||||
|
# 生成备注信息
|
||||||
|
note = ""
|
||||||
|
original_name = res["name"]
|
||||||
|
|
||||||
|
# 识别算法
|
||||||
|
if "MST Method" in original_name:
|
||||||
|
note += "最小生成树算法(无容量约束基准); "
|
||||||
|
elif "Base" in original_name:
|
||||||
|
note += "基础扇区扫描(单次扫描); "
|
||||||
|
elif "Rotational" in original_name:
|
||||||
|
note += "旋转扫描优化(全局最优角度); "
|
||||||
|
elif "Esau-Williams" in original_name:
|
||||||
|
note += "Esau-Williams启发式算法(权衡距离与容量); "
|
||||||
|
|
||||||
|
# 识别电缆策略
|
||||||
|
if "Standard" in original_name:
|
||||||
|
note += "不包含可选电缆型号。"
|
||||||
|
elif "With Optional" in original_name:
|
||||||
|
note += "含可选电缆型号。"
|
||||||
|
elif "No Max" in original_name:
|
||||||
|
note += "不包含可选电缆型号,且可使用的最大截面电缆降一档截面。"
|
||||||
|
|
||||||
row_dict = {
|
row_dict = {
|
||||||
"name": name_display,
|
"name": name_display,
|
||||||
"cost_wan": round(res["cost"] / 10000, 2),
|
"cost_wan": f"{res['cost'] / 10000:.2f}",
|
||||||
"loss_kw": round(res["loss"], 2),
|
"loss_kw": f"{res['loss']:.2f}",
|
||||||
|
"note": note,
|
||||||
"original_name": res["name"],
|
"original_name": res["name"],
|
||||||
}
|
}
|
||||||
table_data.append(row_dict)
|
table_data.append(row_dict)
|
||||||
@@ -471,7 +501,7 @@ def index():
|
|||||||
"w-full mt-4 text-sm"
|
"w-full mt-4 text-sm"
|
||||||
):
|
):
|
||||||
refs["log_box"] = ui.log(max_lines=100).classes(
|
refs["log_box"] = ui.log(max_lines=100).classes(
|
||||||
"w-full h-32 text-xs font-mono bg-black text-green-400"
|
"w-full h-32 text-xs font-mono bg-black text-green-400 analysis-log-box"
|
||||||
)
|
)
|
||||||
processing_dialog.props("persistent")
|
processing_dialog.props("persistent")
|
||||||
|
|
||||||
@@ -538,6 +568,12 @@ def index():
|
|||||||
"field": "loss_kw",
|
"field": "loss_kw",
|
||||||
"sortable": True,
|
"sortable": True,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "note",
|
||||||
|
"label": "备注",
|
||||||
|
"field": "note",
|
||||||
|
"align": "left",
|
||||||
|
},
|
||||||
]
|
]
|
||||||
# 使用内置的 selection='single' 结合行点击事件实现背景高亮
|
# 使用内置的 selection='single' 结合行点击事件实现背景高亮
|
||||||
# 这样可以完全由 Python 事件逻辑控制,不依赖 CSS 伪类
|
# 这样可以完全由 Python 事件逻辑控制,不依赖 CSS 伪类
|
||||||
|
|||||||
Reference in New Issue
Block a user