From 0dfca38ca9b480b1b9a453a04e57eacbe1bc5916 Mon Sep 17 00:00:00 2001 From: RatedARRR Date: Mon, 6 Dec 2021 14:33:28 +0100 Subject: [PATCH] added menubar, added parameter to remove redundancy in callbacks --- main.py | 16 +++--- menubar_example.py | 58 +++++++++++++++++++++ myclient.py | 2 +- slider_triple.py | 118 ++++++++++++++++++++++++++++-------------- slider_triple_mock.py | 112 +++++++++++++++++++-------------------- 5 files changed, 205 insertions(+), 101 deletions(-) create mode 100644 menubar_example.py diff --git a/main.py b/main.py index a8cdb48..8936ccd 100644 --- a/main.py +++ b/main.py @@ -5,12 +5,16 @@ def main(): client = MyClient() - if client.ready: - for i in range(0, 10): - if client.sub_fuell1_ist.hasChanged() or client.sub_fuell2_ist.hasChanged() or client.sub_fuell3_ist.hasChanged(): - print(client.sub_fuell1_ist.getVar(), client.sub_fuell2_ist.getVar(), client.sub_fuell3_ist.getVar()) - time.sleep(1) - client.client.disconnect() + try: + if client.connected: + for i in range(0, 10): + if client.sub_fuell1_ist.hasChanged() or client.sub_fuell2_ist.hasChanged() or client.sub_fuell3_ist.hasChanged(): + print(client.sub_fuell1_ist.getVar(), client.sub_fuell2_ist.getVar(), client.sub_fuell3_ist.getVar()) + time.sleep(1) + except BaseException as err: + print(err) + finally: + client.client.disconnect() if __name__ == "__main__": diff --git a/menubar_example.py b/menubar_example.py new file mode 100644 index 0000000..81f0189 --- /dev/null +++ b/menubar_example.py @@ -0,0 +1,58 @@ +import functools +import sys +from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication + + +class basicMenubar(QMainWindow): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.initUI() + + def initUI(self): + self.setGeometry(200, 200, 200, 200) + + exitAction = QAction('&Exit', self) + exitAction.setShortcut('Ctrl+Q') + exitAction.setStatusTip('Exit application') + exitAction.triggered.connect(qApp.quit) + + umpumpenView = QAction('&Umpumpen', self) + umpumpenView.setShortcut('Ctrl+A') + umpumpenView.setStatusTip('Exit application') + umpumpenView.triggered.connect(functools.partial(print, "Umpumpen")) + + dosierenView = QAction('&Dosieren', self) + dosierenView.setShortcut('Ctrl+S') + dosierenView.setStatusTip('Exit application') + dosierenView.triggered.connect(functools.partial(print, "Dosieren")) + + fuellstandView = QAction('&Füllstand', self) + fuellstandView.setShortcut('Ctrl+D') + fuellstandView.setStatusTip('Exit application') + fuellstandView.triggered.connect(functools.partial(print, "Füllstand")) + + durchflussView = QAction('&Durchfluss', self) + durchflussView.setShortcut('Ctrl+F') + durchflussView.setStatusTip('Exit application') + durchflussView.triggered.connect(functools.partial(print, "Durchfluss")) + + self.statusBar() + + menubar = self.menuBar() + menu = menubar.addMenu('&Menu') + menu.addAction(exitAction) + menu.addAction(umpumpenView) + menu.addAction(dosierenView) + menu.addAction(fuellstandView) + menu.addAction(durchflussView) + + self.setWindowTitle('PyQt5 Basic Menubar') + self.show() + + +if __name__ == '__main__': + + app = QApplication(sys.argv) + ex = basicMenubar() + sys.exit(app.exec_()) diff --git a/myclient.py b/myclient.py index 367f516..5119f7d 100644 --- a/myclient.py +++ b/myclient.py @@ -8,7 +8,7 @@ def __init__(self): self.server_address = "opc.tcp://141.30.154.211:4850" self.uri = "http://141.30.154.212:8087/OPC/DA" self.default_interval = 100 - self.ready = False + self.connected = False try: self.client = Client(self.server_address) diff --git a/slider_triple.py b/slider_triple.py index b46f899..0815fde 100644 --- a/slider_triple.py +++ b/slider_triple.py @@ -1,3 +1,4 @@ +import functools import random import time from random import randrange @@ -5,35 +6,74 @@ from PyQt5 import QtCore from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QMainWindow, QSlider, QApplication, QWidget, QHBoxLayout +from PyQt5.QtWidgets import QMainWindow, QSlider, QApplication, QWidget, QHBoxLayout, QVBoxLayout, QLabel import global_style +from myclient import MyClient class MainWindow(QMainWindow): def __init__(self): super().__init__() - self.setWindowTitle("My App") + self.setWindowTitle("IAT") self.widget = SliderTripleWidget(self) self.setCentralWidget(self.widget) class SliderTripleWidget(QWidget): - def __init__(self, parent): super(SliderTripleWidget, self).__init__(parent) - self.layout = QHBoxLayout(self) + print(parent.windowTitle()) + self.sliders_widget = QWidget(self) + self.sliders_layout = QHBoxLayout(self) + self.labels_first_widget = QWidget(self) + self.labels_first_layout = QHBoxLayout(self) + self.labels_second_widget = QWidget(self) + self.labels_second_layout = QHBoxLayout(self) + self.layout = QVBoxLayout(self) self.slider0 = self.create_slider(0) self.slider1 = self.create_slider(1) self.slider2 = self.create_slider(2) self.sliders = [self.slider0, self.slider1, self.slider2] - self.layout.addWidget(self.slider0) - self.layout.addWidget(self.slider1) - self.layout.addWidget(self.slider2) + for slider in self.sliders: + qss_path = "test.qss" + with open(qss_path, "r") as fh: + slider.setStyleSheet(fh.read()) + self.sliders_layout.addWidget(slider) + + self.label0 = self.create_label("Behälter 1") + self.label1 = self.create_label("Behälter 2") + self.label2 = self.create_label("Behälter 3") + self.labels_first = [self.label0, self.label1, self.label2] + self.label3 = self.create_label("0.0 mm") + self.label4 = self.create_label("0.0 mm") + self.label5 = self.create_label("0.0 mm") + self.labels_second = [self.label3, self.label4, self.label5] + + for label in self.labels_first: + qss_path = "test2.qss" + with open(qss_path, "r") as fh: + label.setStyleSheet(fh.read()) + self.labels_first_layout.addWidget(label) + + for label in self.labels_second: + qss_path = "test2.qss" + with open(qss_path, "r") as fh: + label.setStyleSheet(fh.read()) + self.labels_second_layout.addWidget(label) + + self.sliders_widget.setLayout(self.sliders_layout) + self.layout.addWidget(self.sliders_widget) + self.layout.addStretch() + self.labels_first_widget.setLayout(self.labels_first_layout) + self.layout.addWidget(self.labels_first_widget) + self.layout.addStretch() + self.labels_second_widget.setLayout(self.labels_second_layout) + self.layout.addWidget(self.labels_second_widget) self.setLayout(self.layout) def value_changed_0(self, i): @@ -85,7 +125,8 @@ def slider_released_2(self): pass def set_slider_position(self, slider_nr, p): - self.sliders[slider_nr].setValue(p) + self.sliders[slider_nr].setValue(int(p)) + self.labels_second[slider_nr].setText(str(int(p)) + " mm") def create_slider(self, i): widget = QSlider(Qt.Vertical) @@ -114,15 +155,21 @@ def create_slider(self, i): return widget + def create_label(self, text): + widget = QLabel() + widget.setText(str(text)) + widget.setAlignment(Qt.AlignCenter) + return widget + -def update(): +def update(client): v0 = 0 v1 = 0 v2 = 0 try: - v0, v1, v2 = get_values() - except: + v0, v1, v2 = get_values(client) + except BaseException as err: print("Couldn't get new values") window.widget.set_slider_position(0, v0) @@ -130,34 +177,19 @@ def update(): window.widget.set_slider_position(2, v2) -def get_values(): +def get_values(client): v0 = 0 v1 = 0 v2 = 0 - with Client("opc.tcp://141.30.154.211:4850") as client: - client.connect() - client.load_type_definitions() - root = client.get_root_node() - objects = client.get_objects_node() - idx = client.get_namespace_index("http://141.30.154.212:8087/OPC/DA") - for child in root.get_children(): - if child.nodeid.Identifier == 85: - for chil in child.get_children(): - if chil.nodeid.Identifier == 'XML DA Server - eats11Root': - for chi in chil.get_children(): - if chi.nodeid.Identifier == 'F:Schneider': - for ch in chi.get_children(): - try: - if ch.nodeid.Identifier == "Schneider//Fuellstand1_Ist": - v0 = int(ch.get_value()) - if ch.nodeid.Identifier == "Schneider//Fuellstand2_Ist": - v1 = int(ch.get_value()) - if ch.nodeid.Identifier == "Schneider//Fuellstand3_Ist": - v2 = int(ch.get_value()) - except: - pass - print(v0, v1, v2) - return v0, v1, v2 + + if client.sub_fuell1_ist.hasChanged(): + v0 = client.sub_fuell1_ist.getVar() + if client.sub_fuell2_ist.hasChanged(): + v1 = client.sub_fuell2_ist.getVar() + if client.sub_fuell3_ist.hasChanged(): + v2 = client.sub_fuell3_ist.getVar() + + return v0, v1, v2 if __name__ == '__main__': @@ -166,8 +198,16 @@ def get_values(): window = MainWindow() window.show() + client = MyClient() + timer = QtCore.QTimer() - timer.timeout.connect(update) - timer.start(10000) - app.exec() + timer.timeout.connect(functools.partial(update, client)) + timer.start(1000) + try: + app.exec() + except BaseException as err: + print(err) + finally: + client.client.disconnect() + print("disconnected") diff --git a/slider_triple_mock.py b/slider_triple_mock.py index 6560916..843f3f0 100644 --- a/slider_triple_mock.py +++ b/slider_triple_mock.py @@ -1,3 +1,4 @@ +import functools import random import time from random import randrange @@ -5,7 +6,7 @@ from PyQt5 import QtCore from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QMainWindow, QSlider, QApplication, QWidget, QHBoxLayout, QVBoxLayout, QLabel +from PyQt5.QtWidgets import QMainWindow, QSlider, QApplication, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QAction, qApp import global_style @@ -16,9 +17,52 @@ def __init__(self): self.setWindowTitle("My App") + self.initUI() + self.widget = SliderTripleWidget(self) self.setCentralWidget(self.widget) + def initUI(self): + exitAction = QAction('&Exit', self) + exitAction.setShortcut('Ctrl+Q') + exitAction.setStatusTip('Exit application') + exitAction.triggered.connect(qApp.quit) + + uebersichtView = QAction('&Übersicht', self) + uebersichtView.setShortcut('Ctrl+A') + uebersichtView.setStatusTip('Exit application') + uebersichtView.triggered.connect(functools.partial(print, "Übersicht")) + + umpumpenView = QAction('&Umpumpen', self) + umpumpenView.setShortcut('Ctrl+S') + umpumpenView.setStatusTip('Exit application') + umpumpenView.triggered.connect(functools.partial(print, "Umpumpen")) + + dosierenView = QAction('&Dosieren', self) + dosierenView.setShortcut('Ctrl+D') + dosierenView.setStatusTip('Exit application') + dosierenView.triggered.connect(functools.partial(print, "Dosieren")) + + fuellstandView = QAction('&Füllstand', self) + fuellstandView.setShortcut('Ctrl+F') + fuellstandView.setStatusTip('Exit application') + fuellstandView.triggered.connect(functools.partial(print, "Füllstand")) + + durchflussView = QAction('&Durchfluss', self) + durchflussView.setShortcut('Ctrl+G') + durchflussView.setStatusTip('Exit application') + durchflussView.triggered.connect(functools.partial(print, "Durchfluss")) + + self.statusBar() + + menubar = self.menuBar() + menu = menubar.addMenu('&Menu') + menu.addAction(exitAction) + menu.addAction(umpumpenView) + menu.addAction(dosierenView) + menu.addAction(fuellstandView) + menu.addAction(durchflussView) + class SliderTripleWidget(QWidget): @@ -74,51 +118,23 @@ def __init__(self, parent): self.layout.addWidget(self.labels_second_widget) self.setLayout(self.layout) - def value_changed_0(self, i): + def value_changed(self, nr, i): + # print(nr) # print(i) pass - def value_changed_1(self, i): - # print(i) - pass - - def value_changed_2(self, i): - # print(i) - pass - - def slider_position_0(self, p): - # print("position: ", p) - pass - - def slider_position_1(self, p): + def slider_position(self, nr, p): + # print(nr) # print("position: ", p) pass - def slider_position_2(self, p): - # print("position: ", p) - pass - - def slider_pressed_0(self): - # print("Pressed!") - pass - - def slider_pressed_1(self): - # print("Pressed!") - pass - - def slider_pressed_2(self): + def slider_pressed(self, nr): + # print(nr) # print("Pressed!") pass - def slider_released_0(self): - # print("Released") - pass - - def slider_released_1(self): - # print("Released") - pass - - def slider_released_2(self): + def slider_released(self, nr): + # print(nr) # print("Released") pass @@ -131,26 +147,12 @@ def create_slider(self, i): widget.setMinimum(0) widget.setMaximum(250) - widget.setSingleStep(1) - if i == 0: - widget.valueChanged.connect(self.value_changed_0) - widget.sliderMoved.connect(self.slider_position_0) - widget.sliderPressed.connect(self.slider_pressed_0) - widget.sliderReleased.connect(self.slider_released_0) - else: - if i == 1: - widget.valueChanged.connect(self.value_changed_1) - widget.sliderMoved.connect(self.slider_position_1) - widget.sliderPressed.connect(self.slider_pressed_1) - widget.sliderReleased.connect(self.slider_released_1) - else: - widget.valueChanged.connect(self.value_changed_2) - widget.sliderMoved.connect(self.slider_position_2) - widget.sliderPressed.connect(self.slider_pressed_2) - widget.sliderReleased.connect(self.slider_released_2) - + widget.valueChanged.connect(functools.partial(self.value_changed, i)) + widget.sliderMoved.connect(functools.partial(self.slider_position, i)) + widget.sliderPressed.connect(functools.partial(self.slider_pressed, i)) + widget.sliderReleased.connect(functools.partial(self.slider_released, i)) return widget def create_label(self, text):