Как делать действие постоянно пока кнопка нажата PyQt5?

У меня есть код на PyQt5. Я хочу чтобы когда задерживал кнопку действие выполнялось постоянно. Я пробовал использовать pressed.connect вместо clicked.connect, но нечего не менялось.

main.py:

from PyQt5.QtWidgets import *
from threading import Thread
from time import sleep
import socket
import plyer

app = QApplication([])
main = QWidget()

def get_pos():
    while True:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(("192.168.1.34",1234))
        client.send(str("plyer.accelerometer.acceleration").encode("utf-8"))
        sleep(0.5)
th = Thread(target=get_pos, args=())
th.start()

gas = QPushButton('Gas')
stop = QPushButton('Stop')
cords = QLabel('X = ?, Y = ?, Z = ?')

gas.setMinimumSize(300,300)
stop.setMinimumSize(300,300)

def press_gas():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("192.168.1.34",1234))
    client.send(str("GAS").encode("utf-8"))

def press_stop():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("192.168.1.34",1234))
    client.send(str("STOP").encode("utf-8"))

rowh = QHBoxLayout()
row = QVBoxLayout()
row1 = QVBoxLayout()

row.addWidget(gas)
row.addWidget(stop)
row1.addWidget(cords)

rowh.addLayout(row)
rowh.addLayout(row1)

gas.pressed.connect(press_gas)
stop.pressed.connect(press_stop)

main.setLayout(rowh)
main.show()
app.exec_()

Ответы (1 шт):

Автор решения: S. Nick

Если я вас правильно понял, то предложу отказаться от кнопок в пользу, например, QSlider.

Тогда ваша задача может выглядеть примерно так:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class Label(QLabel):
    def __init__(self, parent=None):
        super(Label, self).__init__(parent)
        self.px = 0
        self.py = 15
        self._direction = Qt.LeftToRight
        self.setWordWrap(True)
        
        self.timer = QTimer(self)                            
        self.timer.timeout.connect(self.update)
        self.timer.start(40)
        
        self._speed = 2
        self.textLength = 0
        self.fontPointSize = 0
        self.setAlignment(Qt.AlignVCenter)
        self.setFixedHeight(self.fontMetrics().height())

    def updateCoordinates(self):
        align = self.alignment()
        if align == Qt.AlignTop:
            self.py = 10
        elif align == Qt.AlignBottom:
            self.py = self.height() - 10
        elif align == Qt.AlignVCenter:
            self.py = self.height() / 2
        self.fontPointSize = self.font().pointSize() / 2
        self.textLength = self.fontMetrics().width(self.text())

    def setAlignment(self, alignment):
        self.updateCoordinates()
        QLabel.setAlignment(self, alignment)

    def resizeEvent(self, event):
        self.updateCoordinates()
        QLabel.resizeEvent(self, event)

    def paintEvent(self, event):
        painter = QPainter(self)
        if self._direction == Qt.RightToLeft:
            self.px -= self.speed()
            if self.px <= -self.textLength:
                self.px = self.width()
        else:
            self.px += self.speed()
            if self.px >= self.width():
                self.px = -self.textLength
        painter.drawText(self.px, self.py + self.fontPointSize, self.text())
        painter.translate(self.px, 0)

    def speed(self):
        return self._speed

    def setSpeed(self, speed):
        self._speed = speed

    def setDirection(self, direction):
        self._direction = direction
        if self._direction == Qt.RightToLeft:
            self.px = self.width() - self.textLength
        else:
            self.px = 0
        self.update()

    def pause(self):
        self.timer.stop()

    def unpause(self):
        self.timer.start()


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.marqueeLabel = Label(self)
        
        le = QLineEdit(self)
        le.textChanged.connect(self.marqueeLabel.setText)
        le.setText("""Чтобы было понятно, представьте, что эти кнопки как \
        газ и тормоз в машине - примерно так же должны работать.""")
        slider = QSlider(Qt.Horizontal, self)
        slider.valueChanged.connect(self.marqueeLabel.setSpeed)
        slider.setValue(10)

        rtl = QRadioButton("Right to Left", self)
        ltr = QRadioButton("Left to Rigth", self)
        rtl.toggled.connect(lambda state: self.marqueeLabel.setDirection(Qt.RightToLeft if state else  Qt.LeftToRight))
        ltr.setChecked(True)

        directionWidget = QWidget(self)
        directionWidget.setLayout(QHBoxLayout())
        directionWidget.layout().setContentsMargins(0, 0, 0, 0)
        directionWidget.layout().addWidget(rtl)
        directionWidget.layout().addWidget(ltr)

        pauseBtn = QPushButton("Остановить", self)
        pauseBtn.setCheckable(True)
        pauseBtn.toggled.connect(
            lambda state: self.marqueeLabel.pause() 
                if state else self.marqueeLabel.unpause())
        pauseBtn.toggled.connect(
            lambda state: pauseBtn.setText("Продолжить") 
                if state else pauseBtn.setText("Остановить"))

        flayout = QFormLayout()
        flayout.addRow("Изменить текст", le)
        flayout.addRow("Изменить скорость", slider)
        flayout.addRow("Направление движения", directionWidget)
        flayout.addRow("Движение", pauseBtn)

        self.layout = QVBoxLayout(self)
        self.layout.addLayout(flayout)
        self.layout.addWidget(self.marqueeLabel)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка