Python Forum
Looping sent message with socket
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Looping sent message with socket
#1
Hi, I'm almost finished with my project for university, but I'm having a really rough time with looping the message that is sent. I've tried doing it with threading library but it was showing an error with run(), so I tried doing it with while True:, but i still only works one time and it closes.
I know that doing it with QTdesigner isn't the most perfect way, but we only had 3 months do do it and we never had any python programming before. Also we don't have any help from our teacher so it was the fastest way to make a gui, which he demanded.
Can anyone help me with looping that message?
There aren't any errors, it just connects and shuts down after one time sending message.

from PyQt5 import QtCore, QtGui, QtWidgets
import socket
import time
global s



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.columnView = QtWidgets.QColumnView(self.centralwidget)
        self.columnView.setGeometry(QtCore.QRect(20, 10, 751, 501))
        self.columnView.setObjectName("columnView")

        self.polacz = QtWidgets.QPushButton(self.centralwidget)
        self.polacz.setGeometry(QtCore.QRect(40, 60, 93, 28))
        self.polacz.setObjectName("polacz")
        self.polacz.clicked.connect(self.clickpolacz)

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 30, 81, 16))
        self.label.setObjectName("label")

        self.adres = QtWidgets.QTextEdit(self.centralwidget)
        self.adres.setGeometry(QtCore.QRect(120, 20, 111, 31))
        self.adres.setObjectName("adres")

        self.lewySilnik = QtWidgets.QSlider(self.centralwidget)
        self.lewySilnik.setGeometry(QtCore.QRect(170, 380, 491, 31))
        self.lewySilnik.setMinimumSize(QtCore.QSize(491, 0))
        self.lewySilnik.setOrientation(QtCore.Qt.Horizontal)
        self.lewySilnik.setObjectName("lewySilnik")
        self.lewySilnik.valueChanged.connect(self.val)
        self.lewySilnik.setMinimum(-128)
        self.lewySilnik.setMaximum(127)


        self.prawySilnik = QtWidgets.QSlider(self.centralwidget)
        self.prawySilnik.setGeometry(QtCore.QRect(170, 440, 491, 31))
        self.prawySilnik.setOrientation(QtCore.Qt.Horizontal)
        self.prawySilnik.setObjectName("prawySilnik")
        self.prawySilnik.setMinimum(-128)
        self.prawySilnik.setMaximum(127)
        self.prawySilnik.valueChanged.connect(self.val)


        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(70, 380, 121, 31))
        self.label_2.setObjectName("label_2")

        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(70, 450, 81, 21))
        self.label_3.setObjectName("label_3")

        self.rozlacz = QtWidgets.QPushButton(self.centralwidget)
        self.rozlacz.setGeometry(QtCore.QRect(140, 60, 93, 28))
        self.rozlacz.setObjectName("rozlacz")
        self.rozlacz.clicked.connect(self.clickrozlacz)

        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(310, 20, 81, 31))
        self.label_4.setObjectName("label_4")

        self.line_battery = QtWidgets.QTextBrowser(self.centralwidget)
        self.line_battery.setGeometry(QtCore.QRect(290, 50, 121, 31))
        self.line_battery.setObjectName("bateria")


        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(520, 20, 141, 31))
        self.label_5.setObjectName("label_5")

        self.odebrana = QtWidgets.QTextBrowser(self.centralwidget)
        self.odebrana.setGeometry(QtCore.QRect(460, 50, 261, 31))
        self.odebrana.setObjectName("odebrana")

        self.line_s1 = QtWidgets.QTextBrowser(self.centralwidget)
        self.line_s1.setGeometry(QtCore.QRect(30, 210, 118, 23))
        self.line_s1.setObjectName("line_s1")

        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(20, 100, 751, 20))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")

        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(330, 120, 71, 21))
        self.label_6.setObjectName("label_6")

        self.line_s2 = QtWidgets.QTextBrowser(self.centralwidget)
        self.line_s2.setGeometry(QtCore.QRect(160, 210, 118, 23))
        self.line_s2.setObjectName("line_s2")

        self.line_s3 = QtWidgets.QTextBrowser(self.centralwidget)
        self.line_s3.setGeometry(QtCore.QRect(300, 210, 118, 23))
        self.line_s3.setObjectName("line_s3")

        self.line_s4 = QtWidgets.QTextBrowser(self.centralwidget)
        self.line_s4.setGeometry(QtCore.QRect(450, 210, 118, 23))
        self.line_s4.setObjectName("line_s4")

        self.line_s5 = QtWidgets.QTextBrowser(self.centralwidget)
        self.line_s5.setGeometry(QtCore.QRect(610, 210, 118, 23))
        self.line_s5.setObjectName("line_s5")

        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(60, 320, 161, 21))
        self.label_7.setObjectName("label_7")

        self.wyslana = QtWidgets.QTextBrowser(self.centralwidget)
        self.wyslana.setGeometry(QtCore.QRect(230, 320, 201, 31))
        self.wyslana.setObjectName("wyslana")

        self.led1 = QtWidgets.QCheckBox(self.centralwidget)
        self.led1.setGeometry(QtCore.QRect(480, 320, 121, 31))
        self.led1.setObjectName("led1")
        self.led1.stateChanged.connect(self.val)


        self.led2 = QtWidgets.QCheckBox(self.centralwidget)
        self.led2.setGeometry(QtCore.QRect(570, 320, 121, 31))
        self.led2.setObjectName("led2")
        self.led2.stateChanged.connect(self.val)


        self.reset = QtWidgets.QPushButton(self.centralwidget)
        self.reset.setGeometry(QtCore.QRect(650, 320, 93, 28))
        self.reset.setObjectName("reset")
        self.reset.clicked.connect(self.restart)

        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(50, 180, 71, 21))
        self.label_8.setObjectName("label_8")

        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(170, 180, 71, 21))
        self.label_9.setObjectName("label_9")

        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(300, 180, 71, 21))
        self.label_10.setObjectName("label_10")

        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(460, 180, 71, 21))
        self.label_11.setObjectName("label_11")

        self.label_12 = QtWidgets.QLabel(self.centralwidget)
        self.label_12.setGeometry(QtCore.QRect(620, 180, 71, 21))
        self.label_12.setObjectName("label_12")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        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 clickpolacz(self):
        TCP_IP = self.adres.toPlainText()
        TCP_PORT = 8000
        s.connect((TCP_IP, TCP_PORT))
        self.wyslana.setText('Połączono')
        s.send = '[000000]'



    def val(self):
        led1=int(self.led1.isChecked())
        led2=int(self.led2.isChecked())
        slide1=self.prawySilnik.value()
        slide2=self.lewySilnik.value()

        if slide1 <0:
            slide1 += 255
        if slide2 <0:
            slide2+=255

        slide1 = str(hex(slide1).lstrip("0x")).zfill(2)
        slide2 = str(hex(slide2).lstrip("0x")).zfill(2)

        while True:
            self.send = '[' + '0' + str(led1 + led2) + str(slide1) + str(slide2) + ']'
            self.wyslana.setText(self.send)
            s.send(str.encode(str(self.send)))
            self.send(str.encode(str(self.send)))
            time.sleep(0.5)

    def line_recmg(self):
        self.data = str(s.recv(1024)).lstrip("b'[").rstrip("]'")
        self.odebrana.setText('[' + self.data + ']')

    def bateria(self):
        self.line_battery.setText(str(int(self.data[4:6] + self.data[2:4], 16)) + 'mV')

    def sensors(self):
        self.line_s1.setText(str(int(self.data[8:10] + self.data[6:8], 16)))
        self.line_s2.setText(str(int(self.data[12:14] + self.data[10:12], 16)))
        self.line_s3.setText(str(int(self.data[16:18] + self.data[14:16], 16)))
        self.line_s4.setText(str(int(self.data[20:22] + self.data[18:20], 16)))
        self.line_s5.setText(str(int(self.data[24:26] + self.data[22:24], 16)))


    def restart(self):
        s.send(str.encode(str(self.send)))
        self.wyslana.setText(self.send)
        self.prawySilnik.setValue(0)
        self.lewySilnik.setValue(0)

    def clickrozlacz(self):
        socket.close()




    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.polacz.setText(_translate("MainWindow", "Połącz"))
        self.label.setText(_translate("MainWindow", "Adres robota"))
        self.label_2.setText(_translate("MainWindow", "Lewy Silnik"))
        self.label_3.setText(_translate("MainWindow", "Prawy Silnik"))
        self.rozlacz.setText(_translate("MainWindow", "Rozłącz"))
        self.label_4.setText(_translate("MainWindow", "Stan baterii"))
        self.label_5.setText(_translate("MainWindow", "Odebrana wiadomość "))
        self.label_6.setText(_translate("MainWindow", "Sensory"))
        self.label_7.setText(_translate("MainWindow", "Wysłana wiadomość"))
        self.led1.setText(_translate("MainWindow", "Led 1"))
        self.led2.setText(_translate("MainWindow", "Led 2"))
        self.reset.setText(_translate("MainWindow", "Reset"))
        self.label_8.setText(_translate("MainWindow", "Sensor 1"))
        self.label_9.setText(_translate("MainWindow", "Sensor 2"))
        self.label_10.setText(_translate("MainWindow", "Sensor 3"))
        self.label_11.setText(_translate("MainWindow", "Sensor 4"))
        self.label_12.setText(_translate("MainWindow", "Sensor 5"))


if __name__ == "__main__":
    import sys
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    app = QtWidgets.QApplication(sys.argv)
    ex = Ui_MainWindow()
    w = QtWidgets.QMainWindow()
    ex.setupUi(w)
    w.show()
    sys.exit(app.exec_())
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
Reply
#2
This makes no sense. s is a socket, s.send is a function. But after you run this method s is a string. No more sending anything over that socket.
    def clickpolacz(self):
        TCP_IP = self.adres.toPlainText()
        TCP_PORT = 8000
        s.connect((TCP_IP, TCP_PORT))
        self.wyslana.setText('Połączono')
        s.send = '[000000]'
And speaking of s, that is a terrible variable name. I would call it "mysocket", or call it "socket" and make it an attribute of Ui_MainWindow instead of a global variable.

Speaking of global variables, there is no need for the global keyword here:
from PyQt5 import QtCore, QtGui, QtWidgets
import socket
import time
global s
The global keyword tells python to "look for this variable in the global namespace, do not make a local variable". It makes sense to use this inside of a function.
def create_socket():
    global s
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Here the global keyword tells python to use the "s" variable defined in the global scope. If there is no "s" defined in the global scope one is created. When you use "global s" outside a function it makes no sense. You are already in the global scope. Any variable defined here is global by default.

You cannot do any of this:
        while True:
            self.send = '[' + '0' + str(led1 + led2) + str(slide1) + str(slide2) + ']'
            self.wyslana.setText(self.send)
            s.send(str.encode(str(self.send)))
            self.send(str.encode(str(self.send)))
            time.sleep(0.5)
First off, you can only have one "forever" loop in a Qt application, and that forever loop is inside app.exec_(). If your program needs to do something periodically (every half second) you have to do that in a separate thread, or use a QTimer event.

Another problem is that you are treating self.send as a function right after you assign it the to reference a string. This makes self.send a str.
self.send = '[' + '0' + str(led1 + led2) + str(slide1) + str(slide2) + ']'
Now that it is a str you cannot call it like a function.
self.send(str.encode(str(self.send)))
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020