Как отловить нажатие левой клавиши мыши на 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

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

→ Ссылка