131 lines
4.8 KiB
Python
131 lines
4.8 KiB
Python
import os
|
|
import json
|
|
from PyQt6.QtWidgets import (QWidget, QHBoxLayout, QVBoxLayout,
|
|
QPushButton, QLabel, QFrame)
|
|
from PyQt6.QtCore import Qt, QTimer
|
|
|
|
def get_gcode_dir():
|
|
config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json")
|
|
try:
|
|
with open(config_path, "r", encoding="utf-8") as f:
|
|
config = json.load(f)
|
|
return config.get("GCODE_DIR", "/home/lhye200/.octoprint/uploads")
|
|
except:
|
|
return "/home/lhye200/.octoprint/uploads"
|
|
|
|
GCODE_DIR = get_gcode_dir()
|
|
|
|
class StatusPage(QWidget):
|
|
def __init__(self, api_client, parent=None):
|
|
super().__init__(parent)
|
|
self.api_client = api_client
|
|
self.current_file = None
|
|
self.init_ui()
|
|
|
|
# 定时器刷新状态
|
|
self.timer = QTimer(self)
|
|
self.timer.timeout.connect(self.update_status)
|
|
self.timer.start(2000)
|
|
self.update_status()
|
|
|
|
def init_ui(self):
|
|
main_layout = QHBoxLayout(self)
|
|
|
|
# --- 左侧:状态与控制 ---
|
|
self.left_frame = QFrame()
|
|
self.left_frame.setStyleSheet("background-color: #444444; border-radius: 10px;")
|
|
left_layout = QVBoxLayout(self.left_frame)
|
|
|
|
self.lbl_status = QLabel("状态: 未知")
|
|
self.lbl_status.setStyleSheet("color: white; font-size: 24px; border: none;")
|
|
self.lbl_job = QLabel("文件: 无")
|
|
self.lbl_job.setStyleSheet("color: white; font-size: 18px; border: none;")
|
|
self.lbl_progress = QLabel("进度: 0%")
|
|
self.lbl_progress.setStyleSheet("color: white; font-size: 18px; border: none;")
|
|
|
|
left_layout.addWidget(self.lbl_status)
|
|
left_layout.addWidget(self.lbl_job)
|
|
left_layout.addWidget(self.lbl_progress)
|
|
left_layout.addStretch()
|
|
|
|
btn_layout = QHBoxLayout()
|
|
self.btn_pause = QPushButton("暂停/恢复")
|
|
self.btn_pause.setStyleSheet(self.btn_style())
|
|
self.btn_pause.clicked.connect(self.toggle_pause)
|
|
self.btn_pause.setMinimumHeight(60)
|
|
|
|
self.btn_stop = QPushButton("停止")
|
|
self.btn_stop.setStyleSheet(self.btn_style())
|
|
self.btn_stop.clicked.connect(self.stop_print)
|
|
self.btn_stop.setMinimumHeight(60)
|
|
|
|
btn_layout.addWidget(self.btn_pause)
|
|
btn_layout.addWidget(self.btn_stop)
|
|
left_layout.addLayout(btn_layout)
|
|
|
|
# --- 右侧:预览 ---
|
|
self.right_frame = QFrame()
|
|
self.right_frame.setStyleSheet("background-color: #444444; border-radius: 10px;")
|
|
right_layout = QVBoxLayout(self.right_frame)
|
|
self.lbl_preview = QLabel("暂无预览...")
|
|
self.lbl_preview.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
self.lbl_preview.setStyleSheet("color: white; font-size: 18px; border: none;")
|
|
right_layout.addWidget(self.lbl_preview)
|
|
|
|
main_layout.addWidget(self.left_frame, 1)
|
|
main_layout.addWidget(self.right_frame, 1)
|
|
|
|
def btn_style(self):
|
|
return """
|
|
QPushButton {
|
|
background-color: #555555;
|
|
color: white;
|
|
border: 2px solid #666666;
|
|
border-radius: 5px;
|
|
font-size: 20px;
|
|
padding: 10px;
|
|
}
|
|
QPushButton:pressed {
|
|
background-color: #333333;
|
|
border: 2px solid #4CAF50;
|
|
}
|
|
"""
|
|
|
|
def toggle_pause(self):
|
|
self.api_client.pause_print()
|
|
|
|
def stop_print(self):
|
|
self.api_client.stop_print()
|
|
|
|
def update_status(self):
|
|
data = self.api_client.get_status()
|
|
if data:
|
|
status = data.get("status", {})
|
|
job = data.get("job", {})
|
|
|
|
state_str = status.get("state", {}).get("text", "离线")
|
|
self.lbl_status.setText(f"状态: {state_str}")
|
|
|
|
file_name_node = job.get("job", {}).get("file", {})
|
|
file_name = file_name_node.get("name") if file_name_node else "无"
|
|
if not file_name:
|
|
file_name = "无"
|
|
self.lbl_job.setText(f"文件: {file_name}")
|
|
|
|
progress_node = job.get("progress", {})
|
|
progress = progress_node.get("completion") if progress_node else 0
|
|
if progress is None: progress = 0
|
|
self.lbl_progress.setText(f"进度: {progress:.1f}%")
|
|
|
|
if file_name and file_name != "无" and file_name != self.current_file:
|
|
self.current_file = file_name
|
|
self.render_preview(file_name)
|
|
|
|
def render_preview(self, filename):
|
|
filepath = os.path.join(GCODE_DIR, filename)
|
|
if not os.path.exists(filepath):
|
|
self.lbl_preview.setText(f"未找到对应的GCode文件:\n{filename}")
|
|
return
|
|
|
|
self.lbl_preview.setText(f"预览渲染成功:\n{filename}")
|