import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout from PyQt5.QtCore import Qt from PyQt5.QtGui import QColor, QPalette from gui.robot import ChangeRobot from gui.status import Status from gui.informer import Informer from gui.imitator import Imitator from gui.visualize import Visualize from gui.observable import Observable from logger import logger class MyPanel(QWidget): def __init__(self, panels, color): super().__init__() layout = QVBoxLayout() for panel in panels: layout.addWidget(panel) self.color = QColor(*color) self.setLayout(layout) self.initUI() def initUI(self): palette = self.palette() palette.setColor(QPalette.Window, self.color) self.setAutoFillBackground(True) self.setPalette(palette) class MainContentComponent(QWidget): def __init__(self, **kwargs): super().__init__() self.observable = Observable(kwargs.get("get_status")) self.observable.value_changed.connect(self.handle_value_change) robotArgs = kwargs.get("robotPanel", {}) self.robotPanel = ChangeRobot(**robotArgs) statusArgs = kwargs.get("statusPanel", {}) self.statusPanel = Status(**statusArgs) informerArgs = kwargs.get("informerPanel", {}) self.informerPanel = Informer(**informerArgs) imitatorArgs = kwargs.get("imitatorPanel", {}) self.imitatorPanel = Imitator(**imitatorArgs) self.rightPanel = MyPanel( panels=[ self.statusPanel, self.robotPanel, self.informerPanel, self.imitatorPanel, ], color=(169, 169, 169), ) visArgs = kwargs.get("visPanel", {}) self.visPanel = Visualize(**visArgs) self.mainPanel = MyPanel( panels=[ self.visPanel, ], color=(200, 200, 200), ) layout = QHBoxLayout() layout.addWidget(self.mainPanel) layout.addWidget(self.rightPanel) self.setLayout(layout) self.setFixedSize(800, 600) self.initUI() def initUI(self): palette = QPalette() palette.setColor(QPalette.Background, QColor(240, 240, 240)) self.setPalette(palette) def resizeEvent(self, event): width = self.width() rightPanelWidth = int(width * 0.25) self.rightPanel.setFixedWidth(rightPanelWidth) super().resizeEvent(event) def handle_value_change(self, new_value): panels = [ self.informerPanel, self.imitatorPanel, ] for p in panels: if new_value == "not_connected": p.setDisabled(True) if new_value == "connected": p.setDisabled(False) if __name__ == "__main__": app = QApplication(sys.argv) mainWindow = MainContentComponent( robotPanel={"arg1": "value1"}, statusPanel={"arg1": "value1"} ) mainWindow.show() sys.exit(app.exec_())