Как делать действие постоянно пока кнопка нажата 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_())
