Вы не должны использовать time.sleep, поскольку он блокирует событие GUI l oop. Если вы хотите испустить щелчковый сигнал через время T, то вы должны вызвать button.clicked.emit()
с QTimer:
QTimer.singleShot(T, lambda: button.clicked.emit())
, который можно упростить до:
QTimer.singleShot(T, button.clicked.emit)
В вашем случае :
def button1Clicked(self):
self.statusBar().showMessage("Button #1 was pressed")
<b>QTimer.singleShot(5000, self.btn2.clicked.emit)</b>
def button2Clicked(self):
self.statusBar().showMessage("Button #2 was pressed")
<b>QTimer.singleShot(5000, self.btn1.clicked.emit)</b>
С другой стороны, рекомендуется излучать сигнал только в пределах класса, к которому относится сигнал, поэтому в случае кнопок вы можете использовать click()
способ сделать то же самое:
def button1Clicked(self):
self.statusBar().showMessage("Button #1 was pressed")
<b>QTimer.singleShot(5000, self.btn2.click)</b>
def button2Clicked(self):
self.statusBar().showMessage("Button #2 was pressed")
<b>QTimer.singleShot(5000, self.btn1.click)</b>
Это приведет к излучению сигнала, но эффект нажатия на кнопку не будет виден, если вы хотите увидеть эффект, то вы должны использовать animateClick () метод:
def button1Clicked(self):
self.statusBar().showMessage("Button #1 was pressed")
<b>QTimer.singleShot(5000, self.btn2.animateClick)</b>
def button2Clicked(self):
self.statusBar().showMessage("Button #2 was pressed")
<b>QTimer.singleShot(5000, self.btn1.animateClick)</b>
Другой способ - отправка QMouseEvent виджету:
def send_mouse_event(widget, timeout=100):
lp = widget.rect().center()
press_event = QMouseEvent(
QEvent.MouseButtonPress, lp, Qt.LeftButton, Qt.LeftButton, Qt.NoModifier
)
QCoreApplication.postEvent(widget, press_event)
release_event = QMouseEvent(
QEvent.MouseButtonRelease, lp, Qt.LeftButton, Qt.LeftButton, Qt.NoModifier
)
QTimer.singleShot(
timeout, lambda: QCoreApplication.postEvent(widget, release_event)
)
def button1Clicked(self):
self.statusBar().showMessage("Button #1 was pressed")
QTimer.singleShot(5000, lambda: send_mouse_event(self.btn2))
def button2Clicked(self):
self.statusBar().showMessage("Button #2 was pressed")
QTimer.singleShot(5000, lambda: send_mouse_event(self.btn1))
Другое решение - использование QtTest.QTest:
from PyQt5.QtTest import QTest
# ...
class Example(QMainWindow):
# ...
def button1Clicked(self):
self.statusBar().showMessage("Button #1 was pressed")
QTimer.singleShot(
5000, lambda: QTest.mouseClick(self.btn2, Qt.LeftButton, delay=100)
)
def button2Clicked(self):
self.statusBar().showMessage("Button #2 was pressed")
QTimer.singleShot(
5000, lambda: QTest.mouseClick(self.btn1, Qt.LeftButton, delay=100)
)