Как отловить нажатие левой клавиши мыши на Linux вне виджета PyQt5?
Подскажите как отловить нажатие левой клавиши мыши на Linux вне виджета PyQt5?
Желательно встроенными средствами питона или PyQt, но рассматриваю все варианты.
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант:
pynput.mouse содержит классы для управления и наблюдения за мышью.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout, QPushButton
from PyQt5.QtCore import Qt, QTimer
from pynput import mouse # pip install pynput
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(171, 122)
Form.setMaximumSize(QtCore.QSize(512, 512))
Form.setMinimumSize(QtCore.QSize(512, 512))
Form.setStyleSheet("")
Form.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
self.Clicker = QtWidgets.QLabel(Form)
self.Clicker.setGeometry(QtCore.QRect(0, 0, 512, 512))
self.Clicker.setText("")
self.Clicker.setPixmap(QtGui.QPixmap("lena.jpg"))
self.Clicker.setScaledContents(True)
self.Clicker.setObjectName("Clicker")
self.Status = QtWidgets.QLabel(Form)
self.Status.setGeometry(QtCore.QRect(10, 40, 61, 61))
self.Status.setText("")
self.Status.setPixmap(QtGui.QPixmap("Ok.png").scaled(61, 61))
self.Status.setObjectName("Status")
self.Numb = QtWidgets.QLabel(Form)
self.Numb.setGeometry(QtCore.QRect(80, 20, 181, 101))
self.Numb.setStyleSheet("color:#f00;\n"
"font: 87 45pt \"Arial Black\";")
self.Numb.setScaledContents(True)
self.Numb.setObjectName("Numb")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.Numb.setText(_translate("Form", "0"))
class ButtonReleaseManager(QtCore.QObject):
clicked = QtCore.pyqtSignal(int, int)
def __init__(self, parent=None):
super().__init__(parent)
self._listener = mouse.Listener(on_click=self._handle_click)
self._listener.start()
def _handle_click(self, x, y, button, pressed):
if pressed and button==mouse.Button.left:
self.clicked.emit(x, y)
class Window(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.old_pos = None
self._click = 0
self._all_click = 0
self.manager = ButtonReleaseManager()
self.manager.clicked.connect(self.allClicked)
def allClicked(self):
self._all_click += 1
QtCore.QTimer.singleShot(15,
lambda: self.Numb.setText(f"{self._all_click - self._click}"))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.old_pos = event.pos()
self._click += 1
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.old_pos = None
# вызывается всякий раз, когда мышь перемещается
def mouseMoveEvent(self, event):
if not self.old_pos:
return
delta = event.pos() - self.old_pos
self.move(self.pos() + delta)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
lena.jpg
Ok.png


