diff --git a/config/compound_eye.png b/config/compound_eye.png index 87f1b92..0aed2a3 100644 Binary files a/config/compound_eye.png and b/config/compound_eye.png differ diff --git a/gripper_control_02/__pycache__/visualizer.cpython-311.pyc b/gripper_control_02/__pycache__/visualizer.cpython-311.pyc index 8a21bf8..d2f071c 100644 Binary files a/gripper_control_02/__pycache__/visualizer.cpython-311.pyc and b/gripper_control_02/__pycache__/visualizer.cpython-311.pyc differ diff --git a/gripper_control_02/__pycache__/visualizer.cpython-313.pyc b/gripper_control_02/__pycache__/visualizer.cpython-313.pyc index 26822ed..b9a52ce 100644 Binary files a/gripper_control_02/__pycache__/visualizer.cpython-313.pyc and b/gripper_control_02/__pycache__/visualizer.cpython-313.pyc differ diff --git a/gripper_control_02/visualizer.py b/gripper_control_02/visualizer.py index d94d186..84bf41a 100644 --- a/gripper_control_02/visualizer.py +++ b/gripper_control_02/visualizer.py @@ -25,11 +25,12 @@ _fix_qt_plugin_path() _QT_IMPORT_ERROR = None try: - from PyQt5.QtCore import Qt, QTimer + from PyQt5.QtCore import QEasingCurve, QPropertyAnimation, Qt, QTimer from PyQt5.QtGui import QFont, QImage, QPixmap from PyQt5.QtWidgets import ( QApplication, QFrame, + QGraphicsOpacityEffect, QGridLayout, QHBoxLayout, QLabel, @@ -41,10 +42,10 @@ try: ) except Exception as exc: _QT_IMPORT_ERROR = exc - Qt = QTimer = QFont = QImage = QPixmap = QApplication = None + Qt = QTimer = QPropertyAnimation = QEasingCurve = QFont = QImage = QPixmap = QApplication = None QGridLayout = QHBoxLayout = QLabel = QPushButton = QSizePolicy = None QVBoxLayout = QWidget = None - QFrame = QMainWindow = object + QFrame = QGraphicsOpacityEffect = QMainWindow = object try: import pyqtgraph as pg @@ -158,46 +159,87 @@ QFrame#Panel { border-radius: 4px; } QPushButton { - background-color: #1a1a1a; - color: #a8a8a8; - border: 1px solid #333333; + background-color: #171717; + color: #d8d8d8; + border: 1px solid #363636; border-radius: 4px; padding: 7px 16px; font-size: 13px; } QPushButton:hover { - background-color: #262626; - color: #d4d4d4; - border: 1px solid #555555; + background-color: #242424; + color: #ffffff; + border: 1px solid #5a5a5a; +} +QPushButton:pressed { + background-color: #0f0f0f; + border: 1px solid #8a8a8a; + padding-top: 8px; + padding-bottom: 6px; +} +QPushButton:disabled { + background-color: #101010; + color: #606060; + border: 1px solid #242424; } QPushButton#StartButton { - background-color: #0d2818; - color: #67d79a; - border: 1px solid #1a4d30; + background-color: #171717; + color: #d8d8d8; + border: 1px solid #363636; } QPushButton#StopButton { - background-color: #2b1010; - color: #f07070; - border: 1px solid #4d1a1a; + background-color: #171717; + color: #d8d8d8; + border: 1px solid #363636; } QPushButton#RestartButton { - background-color: #1d1d12; - color: #e0c96a; - border: 1px solid #4d4520; + background-color: #171717; + color: #d8d8d8; + border: 1px solid #363636; } QPushButton#ManualButton { - background-color: #101822; - color: #9cc8ff; - border: 1px solid #23405f; + background-color: #171717; + color: #d8d8d8; + border: 1px solid #363636; } QPushButton#HoldButton { - background-color: #102019; - color: #7ee0a2; - border: 1px solid #24573a; + background-color: #171717; + color: #d8d8d8; + border: 1px solid #363636; } """ +if QPushButton is not None: + class AnimatedButton(QPushButton): + def __init__(self, text=""): + super().__init__(text) + self._opacity = QGraphicsOpacityEffect(self) + self._opacity.setOpacity(1.0) + self.setGraphicsEffect(self._opacity) + self._animation = QPropertyAnimation(self._opacity, b"opacity", self) + self._animation.setEasingCurve(QEasingCurve.OutCubic) + + def _animate_opacity(self, target, duration): + self._animation.stop() + self._animation.setDuration(duration) + self._animation.setStartValue(self._opacity.opacity()) + self._animation.setEndValue(target) + self._animation.start() + + def mousePressEvent(self, event): + if self.isEnabled(): + self._animate_opacity(0.72, 70) + super().mousePressEvent(event) + + def mouseReleaseEvent(self, event): + if self.isEnabled(): + self._animate_opacity(1.0, 140) + super().mouseReleaseEvent(event) +else: + AnimatedButton = None + + class MetricBox(QFrame): def __init__(self, title, value="--", sub=""): super().__init__() @@ -286,23 +328,23 @@ class GripperDemo02Viewer(QMainWindow): self.status_chip.setObjectName("StatusChip") self.action_chip = QLabel("action=--") self.action_chip.setObjectName("ActionChip") - self.start_button = QPushButton("启动") + self.start_button = AnimatedButton("启动") self.start_button.setObjectName("StartButton") self.start_button.clicked.connect(self.start_control) - self.stop_button = QPushButton("停止") + self.stop_button = AnimatedButton("停止") self.stop_button.setObjectName("StopButton") self.stop_button.clicked.connect(self.stop_control) self.stop_button.setEnabled(False) - self.restart_button = QPushButton("重启") + self.restart_button = AnimatedButton("重启") self.restart_button.setObjectName("RestartButton") self.restart_button.clicked.connect(self.restart_control) - self.manual_open_button = QPushButton("夹爪张开") + self.manual_open_button = AnimatedButton("夹爪张开") self.manual_open_button.setObjectName("ManualButton") self.manual_open_button.clicked.connect(lambda: self.send_manual_command("open")) - self.manual_close_button = QPushButton("夹爪闭合") + self.manual_close_button = AnimatedButton("夹爪闭合") self.manual_close_button.setObjectName("ManualButton") self.manual_close_button.clicked.connect(lambda: self.send_manual_command("close")) - self.manual_hold_button = QPushButton("保持") + self.manual_hold_button = AnimatedButton("保持") self.manual_hold_button.setObjectName("HoldButton") self.manual_hold_button.clicked.connect(self.toggle_manual_hold) self._set_button_state("idle")