How to combine data taken from server between client and GUI? - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Networking (https://python-forum.io/forum-12.html) +--- Thread: How to combine data taken from server between client and GUI? (/thread-17127.html) |
How to combine data taken from server between client and GUI? - bescf - Apr-01-2019 I'm reaching a server which takes distance data from ultrasonic sensor. (Server was created at another side with Arduino.) I have to show this data on Raspberry Pi, so I want to do GUI. I have two .py file. 1) Client module 2) GUI I want to take data on client over GUI code. Data will be taken from URL WebPage (TCP/IP) Where/How I should add data taken from server to GUI code? (Embedding client. py to GUI.py) Any suggestions would be greatly appreciated Client.py import socket HOST = '192.168.1.59' # The server's hostname or IP address, NodeMCU IP Address PORT = 80 # The port used by the server, PORT NUMBER in ARDUINO CODE with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024)GUI.py from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(30, 30, 600, 300)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.labelDistance = QtWidgets.QLabel(self.centralwidget) self.labelDistance.setGeometry(QtCore.QRect(150, 150, 400, 300)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.labelDistance.setFont(font) self.labelDistance.setAlignment(QtCore.Qt.AlignCenter) self.labelDistance.setObjectName("labelDistance") self.labelcm = QtWidgets.QLabel(self.centralwidget) self.labelcm.setGeometry(QtCore.QRect(150, 150, 700, 300)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.labelcm.setFont(font) self.labelcm.setAlignment(QtCore.Qt.AlignCenter) self.labelcm.setObjectName("labelcm") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 259, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Distance Measurement")) self.label.setText(_translate("MainWindow", "Obsctacle Distance")) self.labelDistance.setText(_translate("MainWindow", "0")) self.labelcm.setText(_translate("MainWindow", "cm"))When GUI code runs: (0 is default value) RE: How to combine data taken from server between client and GUI? - Larz60+ - Apr-01-2019 If you want to keep client.py in a separate module, you need to provide some sort of interface to the data. You can do this by wrapping your code in a function, and returning data, or by making client.py a class and exposing data for outside use in the __init__ method, by defining data as self.data. as a class: Client.py import socket class Client: def __init__(self): self.HOST = '192.168.1.59' # The server's hostname or IP address, NodeMCU IP Address self.PORT = 80 # The port used by the server, PORT NUMBER in ARDUINO CODE def transfer_data(self): s.connect((HOST, PORT)) s.sendall(b'Hello, world') self.data = s.recv(1024) # To try run stand-alone if __name__ == '__main__': cl = Client() cl.transfer_data() print(cl.data)as a function: import socket HOST = '192.168.1.59' # The server's hostname or IP address, NodeMCU IP Address PORT = 80 # The port used by the server, PORT NUMBER in ARDUINO CODE with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') return s.recv(1024)Now in the GUI class: import Client # and add to GUI.py class Ui_MainWindow(object): def __init__(self): self.client = Client.Client() self.cdata = self.client.transfer_data() # then when needed: data = self.client.data()A better way would to have a main module that imports both GUI and Client and interfaces externally. RE: How to combine data taken from server between client and GUI? - bescf - Apr-01-2019 (Apr-01-2019, 09:10 AM)Larz60+ Wrote: A better way would to have a main module that imports both GUI and Client Yes i want to create a main module that includes GUI and Client. And also, data should be taken dynamically and GUI should show dynamically, you estimate that distance is always changing. RE: How to combine data taken from server between client and GUI? - bescf - Apr-01-2019 Quote:as a class: I tried. What should i do ? RE: How to combine data taken from server between client and GUI? - Larz60+ - Apr-01-2019 Quote:I tried. What should i do ?show what you've tried RE: How to combine data taken from server between client and GUI? - bescf - Apr-01-2019 Quote:show what you've tried I attached a photo to previous reply. Don't view it ? I'm adding code now. import socket class client: def __init__(self): self.HOST = '192.168.1.55' # The server's hostname or IP address, NodeMCU IP Address self.PORT = 80 # The port used by the server, PORT NUMBER in ARDUINO CODE def transfer_data(self): s.connect((HOST, PORT)) s.sendall(b'Hello, world') self.data = s.recv(1024) # To try run stand-alone if __name__ == '__main__': cl = client() cl.transfer_data() print(cl.data)
RE: How to combine data taken from server between client and GUI? - Larz60+ - Apr-01-2019 My mistake: import socket class Client: def __init__(self): self.HOST = '192.168.1.59' # The server's hostname or IP address, NodeMCU IP Address self.PORT = 80 # The port used by the server, PORT NUMBER in ARDUINO CODE def transfer_data(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') self.data = s.recv(1024) # To try run stand-alone if __name__ == '__main__': cl = Client() cl.transfer_data() print(cl.data) RE: How to combine data taken from server between client and GUI? - bescf - Apr-02-2019 I added HOST and PORT definition, because when there isnt them, it gave an error. import socket HOST = '192.168.1.62' PORT = 80 class client: def __init__(self): self.HOST = '192.168.1.62' # The server's hostname or IP address, NodeMCU IP Address self.PORT = 80 # The port used by the server, PORT NUMBER in ARDUINO CODE def transfer_data(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') self.data = s.recv(1024) # To try run stand-alone if __name__ == '__main__': cl = client() cl.transfer_data() print(cl.data)I could take output, thanks your solution. Can you share with me cause of "b" ? When i delete it, running was unsuccesful.
(Apr-01-2019, 09:10 AM)Larz60+ Wrote: Now in the GUI class: Actually, i want to create as a function. But i tried as a class. from PyQt5 import QtCore, QtGui, QtWidgets import client class Ui_MainWindow(object): def __init__(self): self.client = client.client() self.cdata = self.client.transfer_data() # then when needed: data = self.client.data() def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(30, 30, 600, 300)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.labelDistance = QtWidgets.QLabel(self.centralwidget) self.labelDistance.setGeometry(QtCore.QRect(150, 150, 400, 300)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.labelDistance.setFont(font) self.labelDistance.setAlignment(QtCore.Qt.AlignCenter) self.labelDistance.setObjectName("labelDistance") self.labelcm = QtWidgets.QLabel(self.centralwidget) self.labelcm.setGeometry(QtCore.QRect(150, 150, 700, 300)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.labelcm.setFont(font) self.labelcm.setAlignment(QtCore.Qt.AlignCenter) self.labelcm.setObjectName("labelcm") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 259, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Distance Measurement")) self.label.setText(_translate("MainWindow", "Obstacle Distance")) self.labelDistance.setText(_translate("MainWindow", "0")) self.labelcm.setText(_translate("MainWindow", "cm")) 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_())
When i try as a function. from PyQt5 import QtCore, QtGui, QtWidgets import socket HOST = '192.168.1.62' # The server's hostname or IP address PORT = 80 # The port used by the server with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, world') data = s.recv(1024) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(259, 124) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(30, 10, 211, 41)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.labelDistance = QtWidgets.QLabel(self.centralwidget) self.labelDistance.setGeometry(QtCore.QRect(60, 50, 71, 41)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.labelDistance.setFont(font) self.labelDistance.setAlignment(QtCore.Qt.AlignCenter) self.labelDistance.setObjectName("labelDistance") self.labelcm = QtWidgets.QLabel(self.centralwidget) self.labelcm.setGeometry(QtCore.QRect(120, 50, 71, 41)) font = QtGui.QFont() font.setFamily("Calibri") font.setPointSize(20) self.labelcm.setFont(font) self.labelcm.setAlignment(QtCore.Qt.AlignCenter) self.labelcm.setObjectName("labelcm") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 259, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Distance Measurement")) self.label.setText(_translate("MainWindow", "Obsctacle Distance")) self.labelDistance.setText(_translate("MainWindow", "0")) self.labelcm.setText(_translate("MainWindow", "cm")) # User Code self.check_event() def check_event(self): self.labelDistance.setText(data) 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_()) As you see, I dont sure what I do.
RE: How to combine data taken from server between client and GUI? - Larz60+ - Apr-02-2019 line 10: data = self.client.data()should not contain () the () at the end tells python to execute a method or function. Here you just want to fetch the data, so: data = self.client.dataLooks like there are other variables this is done with also RE: How to combine data taken from server between client and GUI? - bescf - Apr-02-2019 Thanks for your help, i found another solution :) Now, i can take data from IP and show it. But, this is not dynamic. I see constant value. When distance measurement on IP change, display widget should show new data result. On my program, you can next distance result, only when run python code again. My aim is that GUI should have refresh screen. How it is possible ? (I mean that it should be updating like a clock.) |