Files
brewpi/ws_client_gui.py
T
2020-11-24 20:42:27 +01:00

252 lines
7.2 KiB
Python

# This is a sample Python script.
import asyncio
import sys
from PyQt5 import QtGui, QtWidgets, QtCore
from ws.client.ws_client import WsClient
from ws.connection import IConnection
import json
from queue import Queue
class Window(QtWidgets.QMainWindow, IConnection):
# Use signals and slots to avoid crashes
# during updating gui elements from websocket context
upd_progressbar_signal = QtCore.pyqtSignal(int, int)
upd_color_signal = QtCore.pyqtSignal(str)
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.ws_client = WsClient(self)
self.is_exit_gracefully = True
self.textEdit = None
self.progressbar = []
self.styleChoice = None
self.setGeometry(50, 50, 500, 300)
self.setWindowTitle("Hallo Mausi!")
self.setWindowIcon(QtGui.QIcon('res/flasche.png'))
self.menubar_create()
self.statusbar_create()
self.toolbar_create()
self.buttons_create()
self.checkbox_create()
self.progressbar_create()
self.style_chooser_create()
self.calendar_create()
self.send_data = Queue()
self.show()
self.upd_progressbar_signal.connect(self.upd_progressbar_slot)
self.upd_color_signal.connect(self.upd_color_slot)
def calendar_create(self):
cal = QtWidgets.QCalendarWidget(self)
cal.move(500, 200)
cal.resize(250, 250)
def menubar_create(self):
mainMenu = self.menuBar()
fileMenu = mainMenu.addMenu("&File")
actionExit = QtWidgets.QAction("&Exit", self)
actionExit.setShortcut("Ctrl+Q")
actionExit.setStatusTip("Leave the App")
actionExit.triggered.connect(self.on_btn_exit_clicked)
actionEditor = QtWidgets.QAction("&Editor", self)
actionEditor.setShortcut("Ctrl+E")
actionEditor.setStatusTip("Open Editor")
actionEditor.triggered.connect(self.on_action_editor)
actionFileOpener = QtWidgets.QAction("File &Open", self)
actionFileOpener.setShortcut("Ctrl+O")
actionFileOpener.setStatusTip("Open a file")
actionFileOpener.triggered.connect(self.on_action_file_open)
actionFileSaver = QtWidgets.QAction("File &Save", self)
actionFileSaver.setShortcut("Ctrl+S")
actionFileSaver.setStatusTip("Save a file")
actionFileSaver.triggered.connect(self.on_action_file_save)
fileMenu.addAction(actionExit)
fileMenu.addAction(actionEditor)
fileMenu.addAction(actionFileOpener)
fileMenu.addAction(actionFileSaver)
def statusbar_create(self):
statusBar = self.statusBar()
def toolbar_create(self):
def action_caller(a, n):
return lambda action: self.on_action_triggered(a, n)
action1 = QtWidgets.QAction(QtGui.QIcon('res/glass.png'), "Drink a beer!", self)
action1.triggered.connect(action_caller(action1, 1))
action2 = QtWidgets.QAction(QtGui.QIcon('res/glass2.png'), "Drink more beer!", self)
action2.triggered.connect(action_caller(action2, 2))
action3 = QtWidgets.QAction(QtGui.QIcon('res/glass_flasche.png'), "Choose font!", self)
action3.triggered.connect(self.on_action_font_triggered)
action4 = QtWidgets.QAction(QtGui.QIcon('res/dose.png'), "Choose color!", self)
action4.triggered.connect(self.on_action_color_triggered)
toolbar = self.addToolBar("Toolbar")
toolbar.addAction(action1)
toolbar.addAction(action2)
toolbar.addAction(action3)
toolbar.addAction(action4)
def buttons_create(self):
btn = QtWidgets.QPushButton("Quit", self)
btn.clicked.connect(self.on_btn_exit_clicked)
btn.resize(btn.minimumSizeHint())
btn.move(0, 100)
def checkbox_create(self):
checkbox = QtWidgets.QCheckBox('Exit gracefully!', self)
checkbox.stateChanged.connect(self.on_checkbox_changed)
checkbox.setCheckState(2 if self.is_exit_gracefully else 0)
checkbox.move(0, 150)
def progressbar_create(self):
for i in range(0, 3):
progressbar = QtWidgets.QProgressBar(self)
progressbar.setGeometry(200, 80+25*i, 250, 20)
self.progressbar.append(progressbar)
btn = QtWidgets.QPushButton("Download", self)
btn.clicked.connect(self.on_btn_download_clicked)
btn.move(0, 70)
def style_chooser_create(self):
print(self.style().objectName())
self.styleChoice = QtWidgets.QLabel("Linux", self)
comboxBox = QtWidgets.QComboBox(self)
comboxBox.addItem("motif")
comboxBox.addItem("Windows")
comboxBox.addItem("cde")
comboxBox.addItem("Plastique")
comboxBox.addItem("Cleanlooks")
comboxBox.addItem("windowsvista")
comboxBox.addItem("fusion")
comboxBox.move(50, 250)
self.styleChoice.move(150, 150)
comboxBox.activated[str].connect(self.on_combobox_changed)
def on_btn_exit_clicked(self):
print('PyQt5 on_btn_click')
self.close()
def on_action_triggered(self, action, n):
print('PyQt5 on_action_triggered {}'.format(n))
if n == 1:
self.ws_client.connect(uri="ws://localhost:8765")
if n == 2:
self.ws_client.disconnect()
def on_action_editor(self):
self.textEdit = QtWidgets.QTextEdit()
self.setCentralWidget(self.textEdit)
def on_action_file_open(self):
name, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file')
file = open(name, 'r')
self.on_action_editor()
with file:
text = file.read()
self.textEdit.setText(text)
def on_action_file_save(self):
if self.textEdit is not None:
name, _ = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file')
file = open(name, 'w')
text = self.textEdit.toPlainText()
file.write(text)
file.close()
else:
print("No file to save!")
def on_action_font_triggered(self):
font, valid = QtWidgets.QFontDialog.getFont()
if valid:
self.styleChoice.setFont(font)
def on_action_color_triggered(self):
color = QtWidgets.QColorDialog.getColor()
self.send_data.put({'Color': color.name()})
def on_checkbox_changed(self, state):
print('PyQt5 on_checkbox_changed, state={}'.format(state))
if state == QtCore.Qt.Checked:
self.is_exit_gracefully = True
else:
self.is_exit_gracefully = False
def on_btn_download_clicked(self):
print("Nothing happens!")
def on_combobox_changed(self, text):
self.styleChoice.setText(text)
QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create(text))
def on_connect(self):
self.send_data.put_nowait({'+':'a'})
self.send_data.put_nowait({'+':'b'})
self.send_data.put_nowait({'+':'c'})
self.send_data.put_nowait({'+':'Color'})
def on_disconnect(self):
pass
@QtCore.pyqtSlot(int, int)
def upd_progressbar_slot(self, n, v):
self.progressbar[n].setValue(v)
@QtCore.pyqtSlot(str)
def upd_color_slot(self, color_str):
self.styleChoice.setStyleSheet("QWidget {background-color: %s}" % color_str)
async def on_recv(self, data):
try:
d = json.loads(data)
keys = {'a': 0, 'b': 1, 'c': 2}
color = {'Color': 0}
for cmd in d:
if cmd in keys.keys():
await asyncio.get_event_loop().run_in_executor(None, self.upd_progressbar_signal.emit(keys[cmd], int(d[cmd] + 0.5)))
if cmd in color.keys():
await asyncio.get_event_loop().run_in_executor(None, self.upd_color_signal.emit(d[cmd]))
except:
pass
async def on_send(self):
try:
data = await asyncio.get_event_loop().run_in_executor(None, self.send_data.get, True, 1)
return data
except:
return None
def closeEvent(self, event):
if self.is_exit_gracefully:
print("Exitting gracefully!")
self.ws_client.disconnect()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
gui = Window()
sys.exit(app.exec_())
# See PyCharm help at https://www.jetbrains.com/help/pycharm/