This commit is contained in:
Kseninia Mikhaylova 2024-10-14 13:50:28 +03:00
parent 4b04411c20
commit 3a101821b7
5 changed files with 243 additions and 1 deletions

97
gui_test.py Normal file
View File

@ -0,0 +1,97 @@
from juce_init import START_JUCE_COMPONENT
import popsicle as juce
class SidePanel(juce.Component):
backgroundColour = juce.Colours.lightblue
textColour = juce.Colours.black
robots = []
robotsLabel = juce.Label("", "Выберите робота")
robotsRadio = []
robotsControls = [robotsLabel] + robotsRadio
robotButtonsId = 1001
def __init__(self, robots=[]):
super().__init__()
self.robots = robots
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.setRadioGroupId(self.robotButtonsId, juce.dontSendNotification)
s.onClick = self.updateToggleState
s.setClickingTogglesState(True)
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)
def updateToggleState(self):
for i, s in enumerate(self.robotsRadio):
if s.getToggleState() == True:
print(self.robots[i])
break;
class MainPanel(juce.Component):
sliders = []
def __init__(self):
super().__init__()
for _ in range(5):
slider = juce.Slider()
slider.setTextBoxStyle(
juce.Slider.TextEntryBoxPosition.NoTextBox, True, 0, 0
)
self.sliders.append(slider)
self.addAndMakeVisible(slider)
def paint(self, g):
g.fillAll(juce.Colours.hotpink)
class MainContentComponent(juce.Component):
def __init__(self, robots):
super().__init__()
self.rightPanel = SidePanel(robots)
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")

101
juce_init.py Normal file
View File

@ -0,0 +1,101 @@
import os
import sys
import glob
import time
import traceback
from pathlib import Path
from functools import wraps
try:
import popsicle as juce
except ImportError:
folder = (Path(__file__).parent.parent / "build")
for ext in ["*.so", "*.pyd"]:
path_to_search = folder / "**" / ext
for f in glob.iglob(str(path_to_search), recursive=True):
if os.path.isfile(f):
sys.path.append(str(Path(f).parent))
break
import popsicle as juce
def START_JUCE_COMPONENT(ComponentClass, name, **kwargs):
class DefaultWindow(juce.DocumentWindow):
component = None
def __init__(self):
super().__init__(
juce.JUCEApplication.getInstance().getApplicationName(),
juce.Desktop.getInstance().getDefaultLookAndFeel()
.findColour(juce.ResizableWindow.backgroundColourId),
juce.DocumentWindow.allButtons,
True)
self.component = ComponentClass(kwargs.get("robots", []))
self.setResizable(True, True)
self.setContentNonOwned(self.component, True)
self.centreWithSize(self.component.getWidth(), self.component.getHeight() + self.getTitleBarHeight())
self.setAlwaysOnTop(kwargs.get("alwaysOnTop", False))
self.setVisible(True)
def __del__(self):
self.clearContentComponent()
if self.component:
self.component.setVisible(False)
del self.component
def closeButtonPressed(self):
juce.JUCEApplication.getInstance().systemRequestedQuit()
class DefaultApplication(juce.JUCEApplication):
window = None
def __init__(self):
super().__init__()
def getApplicationName(self):
return name
def getApplicationVersion(self):
return "1.0"
def initialise(self, commandLineParameters):
self.window = DefaultWindow()
juce.MessageManager.callAsync(lambda: juce.Process.makeForegroundProcess())
def shutdown(self):
if self.window:
del self.window
def systemRequestedQuit(self):
self.quit()
# def unhandledException(self, ex: Exception, file: str, line: int):
# if hasattr(ex, "__traceback__"):
# print("Traceback (most recent call last):")
# traceback.print_tb(ex.__traceback__)
# print(ex)
# if isinstance(ex, KeyboardInterrupt):
# juce.JUCEApplication.getInstance().systemRequestedQuit()
juce.START_JUCE_APPLICATION(
DefaultApplication,
catchExceptionsAndContinue=kwargs.get("catchExceptionsAndContinue", False))
def timeit(func):
@wraps(func)
def timeit_wrapper(*args, **kwargs):
start_time = time.perf_counter()
result = func(*args, **kwargs)
total_time = time.perf_counter() - start_time
print(f'Function {func.__name__} Took {total_time:.4f} seconds') # {args} {kwargs}
return result
return timeit_wrapper

19
main.py Normal file
View File

@ -0,0 +1,19 @@
import threading
from juce_init import START_JUCE_COMPONENT
from gui_test import MainContentComponent
class MyApp:
robots = [
{"name": "big", "host": "192.168.70.55", "slave_id": 11},
{"name": "small", "host": "192.168.70.65", "slave_id": 22},
]
def __init__(self):
robot = self.robots[0]
self.start_gui()
def start_gui(self):
START_JUCE_COMPONENT(MainContentComponent, name="ROBOT GUI", robots=self.robots)
if __name__ == "__main__":
MyApp()

26
poetry.lock generated
View File

@ -45,6 +45,30 @@ files = [
{file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
] ]
[[package]]
name = "popsicle"
version = "0.9.6"
description = "popsicle: Python integration for JUCE with pybind11."
optional = false
python-versions = ">=3.10"
files = [
{file = "popsicle-0.9.6-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0abedd3790cfe63b14ac3aa46263993e8d859b2c1f769dad8e8685d9995e8e2e"},
{file = "popsicle-0.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ef070c120e782d852eb47a55a187cf7276e8a759110bbbec713e5bbd0faf6a"},
{file = "popsicle-0.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d51bd173da55f84aec6c2a3b5c4b8c0ac3742491a20110531fcc3a3f308bc"},
{file = "popsicle-0.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:c55c6f840269a49b395626ce600c65078aeeda8c727d305d1dca7bded5cf587b"},
{file = "popsicle-0.9.6-cp310-cp310-win_arm64.whl", hash = "sha256:1e22ffb9aca2b468915d7c4b5bd7ce82cdf52ce86e1f4d54eacf6a033dd13c98"},
{file = "popsicle-0.9.6-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d013f08cfd2c491d3f4a35b6477592bd58ece3d59c37a513b6d1e620f50145f1"},
{file = "popsicle-0.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cafbace5fb0df51aac0336cce47fc5208335c43670a103d1a7f8ee0f3094f118"},
{file = "popsicle-0.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95063399a42258b56b469ae31a380d6c2ddb4ab01d729a52300ee3e55ecececb"},
{file = "popsicle-0.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:f30b6309b015f3a26a461223c19d7c8f962f42868575af076f15f71f53b58496"},
{file = "popsicle-0.9.6-cp311-cp311-win_arm64.whl", hash = "sha256:0d0eafff83b08b6ada954e897a0e07b17f6994398c1860a5a9560af402c8f6e9"},
{file = "popsicle-0.9.6-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:a42d53580ddbaca15e64e34c4971f83a862a95c5e50d3e1be5b127c4ff056e48"},
{file = "popsicle-0.9.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429eeee549cf340b3bcc60e7244881b08b8357aeafc88a2a9aee9dd1e3b9fc1"},
{file = "popsicle-0.9.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11de3ccfb5a8f422f1532aaca835ab6907affcbf91ff45312ebcb1d424b4723f"},
{file = "popsicle-0.9.6-cp312-cp312-win_amd64.whl", hash = "sha256:ce7f79069151860a1bd43ba50e786d57c8db3e2f6e8538db45bb0ac67adba7f6"},
{file = "popsicle-0.9.6-cp312-cp312-win_arm64.whl", hash = "sha256:c40d8301b08690b041ed5710f0e9a63bf83c48ab51f5cf015b6fb7cf95921744"},
]
[[package]] [[package]]
name = "pybullet" name = "pybullet"
version = "3.2.6" version = "3.2.6"
@ -94,4 +118,4 @@ files = [
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "3.10.12" python-versions = "3.10.12"
content-hash = "fe8f4d7980373c9220c8910d6eb71c5f4dd23b77fc6879a939a317637ef349d4" content-hash = "7bff17d98584d2b65789f0713e4ac29f8948fc013c65a192ab11ef9e3bfcd9d6"

View File

@ -11,6 +11,7 @@ pymodbus = "^3.7.0"
tk = "^0.1.0" tk = "^0.1.0"
pybullet = "^3.2.6" pybullet = "^3.2.6"
numpy = "^1.20" numpy = "^1.20"
popsicle = "^0.9.6"
[build-system] [build-system]