This commit is contained in:
Kseninia Mikhaylova 2024-10-15 10:17:39 +03:00
parent de92e54a6c
commit e32ed18dfb
4 changed files with 78 additions and 194 deletions

View File

@ -2,17 +2,7 @@ import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QPalette from PyQt5.QtGui import QColor, QPalette
from gui.robot import ChangeRobot
class ChangeRobot(QWidget):
def __init__(self, **kwargs):
super().__init__()
self.initUI()
def initUI(self):
palette = self.palette()
palette.setColor(QPalette.Window, QColor(173, 216, 230)) # LightBlue
self.setAutoFillBackground(True)
self.setPalette(palette)
class Status(QWidget): class Status(QWidget):
def __init__(self, **kwargs): def __init__(self, **kwargs):

74
gui/robot.py Normal file
View File

@ -0,0 +1,74 @@
import sys
import time
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QRadioButton, QPushButton, QButtonGroup
from PyQt5.QtCore import Qt, QTimer
class ChangeRobot(QWidget):
def __init__(self, robots, updateRobot, status):
super().__init__()
self.robots = robots or []
self.updateRobot = updateRobot
self.status = status
self.initUI()
self.old_status = None
self.counter = 0
self.timer = QTimer(self)
self.timer.timeout.connect(self.timerCallback)
def initUI(self):
self.layout = QVBoxLayout()
self.robotsLabel = QLabel("Выберите робота")
self.layout.addWidget(self.robotsLabel)
self.buttonGroup = QButtonGroup(self)
self.robotsRadio = []
for i, r in enumerate(self.robots):
radioButton = QRadioButton(r["name"])
self.buttonGroup.addButton(radioButton, i)
self.robotsRadio.append(radioButton)
self.layout.addWidget(radioButton)
self.connectButton = QPushButton("Соединить")
self.connectButton.clicked.connect(self.connectRobot)
self.layout.addWidget(self.connectButton)
self.setLayout(self.layout)
self.updateConnectButtonText()
def updateConnectButtonText(self):
if self.status() == "not_connected":
self.connectButton.setText("Соединить")
elif self.status() == "connected":
self.connectButton.setText("Отключить")
def timerCallback(self):
new_status = self.status()
self.counter += 1
if new_status == self.old_status and self.counter <= 10:
self.connectButton.setText(self.connectButton.text() + ".")
else:
self.old_status = None
self.timer.stop()
self.updateConnectButtonText()
def connectRobot(self):
self.updateConnectButtonText()
selectedId = self.buttonGroup.checkedId()
if selectedId == -1:
self.connectButton.setText("Выберите робота")
return
self.old_status = self.status()
self.timer.start(500)
time.sleep(0.3)
self.updateRobot(self.robots[selectedId])
def paintEvent(self, event):
p = self.palette()
p.setColor(self.backgroundRole(), Qt.lightGray)
self.setPalette(p)
super().paintEvent(event)

View File

@ -1,180 +0,0 @@
from juce_init import START_JUCE_COMPONENT
import popsicle as juce
import time
class ChangeRobot(juce.Component, juce.Timer):
backgroundColour = juce.Colours.lightblue
textColour = juce.Colours.black
robots = []
robotsLabel = juce.Label("", "Выберите робота")
robotsRadio = []
robotsControls = [robotsLabel] + robotsRadio
robotButtonsId = 1001
connectButton = juce.TextButton("Соединить")
old_status = None
counter = 0
def __init__(self, robots, updateRobot, status):
super().__init__()
juce.Timer.__init__(self)
self.robots = robots or []
self.updateRobot = updateRobot
self.status = status
for r in self.robots:
self.robotsRadio.append(
juce.ToggleButton(r["name"]),
)
self.robotsControls = [self.robotsLabel] + self.robotsRadio
for s in self.robotsControls:
self.addAndMakeVisible(s)
for s in self.robotsRadio:
s.onClick = self.setConnectText
s.setRadioGroupId(self.robotButtonsId, juce.dontSendNotification)
s.setClickingTogglesState(True)
self.addAndMakeVisible(self.connectButton)
self.connectButton.onClick = self.connectRobot
def paint(self, g: juce.Graphics):
g.fillAll(self.backgroundColour)
for i, s in enumerate(self.robotsControls):
s.setColour(s.textColourId, self.textColour)
if hasattr(s, "tickDisabledColourId"):
s.setColour(s.tickColourId, self.textColour)
s.setColour(s.tickDisabledColourId, self.textColour)
s.setBounds(10 if i == 0 else 20, (i * 20), self.getWidth() - 20, 20)
h = i + 2
self.connectButton.setBounds(10, (h * 20), self.getWidth() - 20, 20)
def setConnectText(self):
if self.status() == "not_connected":
self.connectButton.setButtonText("Connect")
if self.status() == "connected":
self.connectButton.setButtonText("Disconnect")
def timerCallback(self):
new_status = self.status()
self.counter += 1
if new_status == self.old_status and self.counter <= 10:
self.connectButton.setButtonText(self.connectButton.getButtonText() + ".")
else:
self.old_status = None
self.stopTimer()
self.setConnectText()
def connectRobot(self):
self.setConnectText()
res = None
for i, s in enumerate(self.robotsRadio):
if s.getToggleState() == True:
res = i
break
if res == None:
self.connectButton.setButtonText("Выберите робота")
return
self.old_status = self.status()
self.startTimer(500)
time.sleep(0.3)
self.updateRobot(self.robots[i])
class Status(juce.Component, juce.Timer):
backgroundColour = juce.Colours.lightgrey
textColour = juce.Colours.black
def __init__(self, status):
super().__init__()
juce.Timer.__init__(self)
self.status = status
self.statusLabel = juce.Label(self.status())
self.addAndMakeVisible(self.statusLabel)
def paint(self, g: juce.Graphics):
g.fillAll(self.backgroundColour)
self.statusLabel.setColour(self.statusLabel.textColourId, self.textColour)
self.statusLabel.setBounds(10, 0, self.getWidth() - 10, 20)
def timerCallback(self):
# self.setConnectText()
pass
class RightPanel(juce.Component):
def __init__(self, panels):
super().__init__()
self.panels = panels
for p in self.panels:
self.addAndMakeVisible(p)
def paint(self, g):
g.fillAll(juce.Colours.blue)
def resized(self):
bounds = self.getLocalBounds()
for p in self.panels:
p.setBounds(
bounds.removeFromTop(self.proportionOfHeight(1 / len(self.panels)))
)
pass
class MainPanel(juce.Component):
def __init__(self):
super().__init__()
def paint(self, g):
g.fillAll(juce.Colours.hotpink)
class MainContentComponent(juce.Component):
def __init__(self, **kwargs):
super().__init__()
robotArgs = kwargs.get("robotPanel")
robotPanel = ChangeRobot(**robotArgs)
statusArgs = kwargs.get("statusPanel")
statusPanel = Status(**statusArgs)
self.rightPanel = RightPanel(panels=[robotPanel, statusPanel])
self.mainPanel = MainPanel()
self.addAndMakeVisible(self.rightPanel)
self.addAndMakeVisible(self.mainPanel)
self.setSize(800, 600)
# self.setResizable(False, False)
def paint(self, g):
g.fillAll(
self.getLookAndFeel().findColour(juce.ResizableWindow.backgroundColourId)
)
def resized(self):
bounds = self.getLocalBounds()
self.rightPanel.setBounds(
bounds.removeFromRight(
self.proportionOfWidth(0.25),
),
)
self.mainPanel.setBounds(bounds)
if __name__ == "__main__":
START_JUCE_COMPONENT(MainContentComponent, name="ROBOT GUI")

View File

@ -1,7 +1,7 @@
import json import json
import sys import sys
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from gui_test import MainContentComponent from gui.gui_test import MainContentComponent
from client_socket import SocketRobotArm from client_socket import SocketRobotArm
import time import time
@ -16,9 +16,9 @@ class MyApp:
def get_status(self): def get_status(self):
if self.robot_app: if self.robot_app:
return self.robot_app.get_status return self.robot_app.get_status()
else: else:
return self.def_robot_status return self.def_robot_status()
def def_robot_status(self): def def_robot_status(self):
return SocketRobotArm.Status[1] return SocketRobotArm.Status[1]