Как при зажатии кнопки производить постоянное выполнение действие, пока кнопка зажата в PyQt5
Мне нужно, что бы при зажатии кнопки "Влево" или "Вправо" картинка двигалась без остановки пока пользователь не отпустит кнопку, мой код:
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
centralWidget = QtWidgets.QWidget() # !!! +++
self.setCentralWidget(centralWidget) # !!! +++
self.btn1 = QPushButton(centralWidget)
self.btn1.setMouseTracking(True)
self.btn1.setText("<-- Влево")
# ??? ------> v
# self.btn1.setStyleSheet("background-color: pink; border-radius: 14px;}")
self.btn1.setStyleSheet("background-color: pink; border-radius: 14px;")
self.btn1.setFont(QtGui.QFont("Pusia-Bold.otf", 17, QtGui.QFont.Bold))
self.btn1.resize(300, 150)
self.btn1.move(100, 400)
self.btn1.clicked.connect(lambda : self.on_clicked("Влево"))
self.btn2 = QPushButton(centralWidget)
self.btn2.setMouseTracking(True);
self.btn2.setText("Вправо -->")
self.btn2.setStyleSheet("background-color: pink; border-radius: 14px;")
self.btn2.setFont(QtGui.QFont("Pusia-Bold.otf", 17, QtGui.QFont.Bold))
self.btn2.resize(300, 150)
self.btn2.move(500, 400)
self.btn2.clicked.connect(lambda : self.on_clicked("Вправо"))
self.lbl1 = QtWidgets.QLabel(centralWidget)
self.pix = QtGui.QPixmap("im.png").scaled(300, 300)
self.lbl1.setPixmap(self.pix)
self.lbl1.resize(300, 300)
self.lbl1.move(300, 20)
'''
self.spinBox = QSpinBox(centralWidget)
self.spinBox.setRange(5, 20)
self.spinBox.setValue(7)
self.spinBox.resize(100, 30)
self.spinBox.move(400, 560)
'''
self.num = 100
def on_clicked(self, text):
print(f'{text}')
if text == "Влево":
x, y = self.lbl1.pos().x(), self.lbl1.pos().y()
x = x-self.num if x-self.num > 0 else 0
self.lbl1.move(x, y)
elif text == "Вправо":
x, y = self.lbl1.pos().x(), self.lbl1.pos().y()
w = self.size().width() - self.lbl1.size().width()
x = x+self.num \
if x+self.num < w else w
self.lbl1.move(x, y)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow()
ex.resize(900, 600)
ex.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант.
Обратите внимание, я поменял сигналы кнопок и добавил QTimer.
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
centralWidget = QtWidgets.QWidget()
self.setCentralWidget(centralWidget)
self.btn1 = QPushButton(centralWidget)
self.btn1.setMouseTracking(True)
self.btn1.setText("<-- Влево")
self.btn1.setStyleSheet("background-color: pink; border-radius: 14px;")
self.btn1.setFont(QtGui.QFont("Pusia-Bold.otf", 17, QtGui.QFont.Bold))
self.btn1.resize(300, 150)
self.btn1.move(100, 400)
#- self.btn1.clicked.connect(lambda : self.on_clicked("Влево"))
self.btn2 = QPushButton(centralWidget)
self.btn2.setMouseTracking(True);
self.btn2.setText("Вправо -->")
self.btn2.setStyleSheet("background-color: pink; border-radius: 14px;")
self.btn2.setFont(QtGui.QFont("Pusia-Bold.otf", 17, QtGui.QFont.Bold))
self.btn2.resize(300, 150)
self.btn2.move(500, 400)
#- self.btn2.clicked.connect(lambda : self.on_clicked("Вправо"))
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.btn1.pressed.connect(lambda: self.btn_pressed('Влево'))
self.btn1.released.connect(self.btn_released)
self.btn2.pressed.connect(lambda: self.btn_pressed('Вправо'))
self.btn2.released.connect(self.btn_released)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.lbl1 = QtWidgets.QLabel(centralWidget)
self.pix = QtGui.QPixmap("im.png").scaled(300, 300)
self.lbl1.setPixmap(self.pix)
self.lbl1.resize(300, 300)
self.lbl1.move(300, 20)
self.num = 5 # 100 !!!
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
#Create a Timer
self.timer = QTimer()
self.timer.timeout.connect(self.on_clicked)
self.timer.setInterval(100)
self.text = None
def btn_pressed(self, text):
self.text = text
self.timer.start()
def btn_released(self):
self.timer.stop()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def on_clicked(self): # , text=''): !!!
print(f'{self.text}')
if self.text == "Влево":
x, y = self.lbl1.pos().x(), self.lbl1.pos().y()
x = x-self.num if x-self.num > 0 else 0
self.lbl1.move(x, y)
elif self.text == "Вправо":
x, y = self.lbl1.pos().x(), self.lbl1.pos().y()
w = self.size().width() - self.lbl1.size().width()
x = x+self.num \
if x+self.num < w else w
self.lbl1.move(x, y)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow()
ex.resize(900, 600)
ex.show()
sys.exit(app.exec_())
