1
pages/__init__.py
Normal file
1
pages/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
#
|
||||
BIN
pages/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
pages/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
pages/__pycache__/status_page.cpython-311.pyc
Normal file
BIN
pages/__pycache__/status_page.cpython-311.pyc
Normal file
Binary file not shown.
130
pages/status_page.py
Normal file
130
pages/status_page.py
Normal file
@@ -0,0 +1,130 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user