1

I have created a manual web socket and I stucked. Query) How to print continous/real time data receiving from server on text browser in pyqt5 GUI if connect (here name close) pushbutton is pressed (connection created) and if pushbutton is pressed again it should get toggled i.e. it should stop receiving data (connection close).

My code is

from PyQt5 import QtCore, QtGui, QtWidgets
from websocket import create_connection

class Ui_MainWindow(object):
    def connect(self,MainWindow):
        ws = create_connection("ws://192.168.0.205/ws")
        self.textBrowser_2.append("Connection created")
        while 1:
            self.textBrowser_2.append(ws.recv())
            print(ws.recv())

        
def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(800, 600)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(700, 70, 81, 61))
    font = QtGui.QFont()
    font.setBold(True)
    font.setWeight(75)
    self.pushButton.setFont(font)
    self.pushButton.setObjectName("pushButton")
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(50, 0, 191, 51))
    font = QtGui.QFont()
    font.setPointSize(12)
    font.setBold(True)
    font.setWeight(75)
    self.label.setFont(font)
    self.label.setObjectName("label")
    self.label_2 = QtWidgets.QLabel(self.centralwidget)
    self.label_2.setGeometry(QtCore.QRect(30, 60, 81, 51))
    font = QtGui.QFont()
    font.setPointSize(12)
    font.setBold(True)
    font.setWeight(75)
    self.label_2.setFont(font)
    self.label_2.setObjectName("label_2")
    self.label_3 = QtWidgets.QLabel(self.centralwidget)
    self.label_3.setGeometry(QtCore.QRect(160, 130, 141, 81))
    font = QtGui.QFont()
    font.setPointSize(12)
    font.setBold(True)
    font.setWeight(75)
    self.label_3.setFont(font)
    self.label_3.setObjectName("label_3")
    self.label_4 = QtWidgets.QLabel(self.centralwidget)
    self.label_4.setGeometry(QtCore.QRect(20, 200, 201, 61))
    font = QtGui.QFont()
    font.setPointSize(12)
    font.setBold(True)
    font.setWeight(75)
    self.label_4.setFont(font)
    self.label_4.setObjectName("label_4")
    self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_2.setGeometry(QtCore.QRect(690, 260, 81, 51))
    font = QtGui.QFont()
    font.setPointSize(12)
    font.setBold(True)
    font.setWeight(75)
    self.pushButton_2.setFont(font)
    self.pushButton_2.setObjectName("pushButton_2")
    self.label_5 = QtWidgets.QLabel(self.centralwidget)
    self.label_5.setGeometry(QtCore.QRect(20, 330, 251, 21))
    font = QtGui.QFont()
    font.setPointSize(12)
    font.setBold(True)
    font.setWeight(75)
    self.label_5.setFont(font)
    self.label_5.setObjectName("label_5")
    self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEdit.setGeometry(QtCore.QRect(82, 70, 601, 61))
    self.lineEdit.setObjectName("lineEdit")
    self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEdit_2.setGeometry(QtCore.QRect(20, 250, 651, 71))
    self.lineEdit_2.setObjectName("lineEdit_2")
    self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
    self.textBrowser.setGeometry(QtCore.QRect(260, 150, 381, 51))
    self.textBrowser.setObjectName("textBrowser")
    self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget)
    self.textBrowser_2.setGeometry(QtCore.QRect(30, 360, 731, 192))
    self.textBrowser_2.setObjectName("textBrowser_2")
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.pushButton.clicked.connect(self.connect)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.pushButton.setText(_translate("MainWindow", "Close"))
    self.label.setText(_translate("MainWindow", "Server loaction"))
    self.label_2.setText(_translate("MainWindow", "URL"))
    self.label_3.setText(_translate("MainWindow", "Status :"))
    self.label_4.setText(_translate("MainWindow", "Request"))
    self.pushButton_2.setText(_translate("MainWindow", "Send"))
    self.label_5.setText(_translate("MainWindow", "Message Log"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241

1 Answers1

2

First of all, do not modify the code generated by QtDesigner so to apply my solution you must regenerate the .py file and call it gui.py: pyuic5 filename.ui -o gui.py -x.

On the other hand, do not use the websocket module since it is designed for synchronous logic, in this case it is better to use the QtWebSockets module that allows you to interact with the websockets using the Qt eventloop.

import sys

from PyQt5 import QtCore, QtWidgets, QtWebSockets

from gui import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.socket = QtWebSockets.QWebSocket()
        self.socket.textMessageReceived.connect(self.handle_text_message_received)

        self.ui.pushButton.clicked.connect(self.connect_to_websocket)

    def connect_to_websocket(self):
        if self.socket.state() == QtNetwork.QAbstractSocket.UnconnectedState:
            url = "ws://192.168.0.205/ws"
            self.socket.open(QtCore.QUrl(url))
        elif self.socket.state() == QtNetwork.QAbstractSocket.ConnectedState:
            self.socket.close()

    def handle_text_message_received(self, message):
        self.ui.textBrowser_2.append(message)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241