python

Pythonでマウスカーソルに追従するウィジェットを作る

Pythonでマウスカーソルに追従するウィジェットを作り、レーザーポインターのように使う方法を紹介します。まずは、デモを見ていただきます。

要件

  • マウスカーソルの動きを取得し、カーソルと一緒にポインターが動く
  • ポインタ―がついていても、通常のクリックができる
  • ポインターの形は円形、色は半透明

使用したライブラリ

  • PyAutoGui
    • カーソルの動きを取得する
  •  PySide2
    • ウィジェットを作るために使用

プログラムのポイント説明

  1. ウィジェットを作る。
  2. 円形にする。
  3. 半透明にする。
  4. ポインターの下をクリックできるようにする。(QtCore.Qt.WA_TransparentForMouseEvents)
  5. PyAutoGuiでカーソルの位置を取得します。 カーソルの位置に合わせてウィジェットのウィンドウの位置を移動します。

プログラム

main.py

import sys
import platform
import pyautogui
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtGui import QColor
from PySide2.QtWidgets import *

from ui_circle_pointer import Ui_CirclePointer

class CirclePointer(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_CirclePointer()
        self.ui.setupUi(self)

        self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint|QtCore.Qt.WindowStaysOnTopHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.progress)
        self.timer.start(15)
        self.show()

    def progress (self):
        self.setGeometry(pyautogui.position()[0]-85, pyautogui.position()-85, 170, 170)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = CirclePointer()
    sys.exit(app.exec_())

 

ui_circle_pointer.py

from PySide2.QtCore import QRect
from PySide2.QtWidgets import *

class Ui_CirclePointer(object):
    def setupUi(self, CirclePointer):
        self.circule = QFrame(CirclePointer)
        self.circule.setObjectName(u"circularBg")
        self.circule.setGeometry(QRect(10, 10, 150, 150))
        self.circule.setStyleSheet(u"QFrame{\n"
"	border-radius: 75%;\n"
"	background-color: rgba(255, 255, 0, 120);\n"
"}")
        self.circule.setFrameShape(QFrame.NoFrame)
        self.circule.setFrameShadow(QFrame.Raised)
        self.circule.raise_()