杰瑞科技汇

python mouse event

Of course! Handling mouse events in Python is a common task, especially when creating graphical user interfaces (GUIs) or automating desktop applications.

python mouse event-图1
(图片来源网络,侵删)

The best library to use depends on your goal:

  1. GUI Development: Building a custom application with clickable buttons, areas, etc.

    • PyQt / PySide: The most powerful and professional choice for desktop apps.
    • Tkinter: Python's built-in, simple, and great for basic applications.
    • Kivy: A modern library for multi-touch applications, which also handles mouse events well.
  2. Desktop Automation: Controlling the mouse, clicking on other applications, reading screen pixels.

    • PyAutoGUI: The easiest and most popular library for this purpose.
    • PyGetWindow / PyRect: Useful for managing and interacting with application windows.
    • pynput: A more advanced library for both controlling and listening to global mouse and keyboard events.
  3. Data Visualization: Handling clicks on plots and charts.

    python mouse event-图2
    (图片来源网络,侵删)
    • Matplotlib: Has built-in event handling for figures and axes.
    • Plotly: An interactive web-based plotting library.

Let's dive into the most common scenarios with clear examples.


GUI Development (PyQt/PySide Example)

This is the most common use case. You create a window and define what happens when the user clicks on specific widgets.

Here's a simple example using PyQt6 (the code is nearly identical for PySide6).

First, install the library:

pip install PyQt6

Now, the code:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget
# 1. Create a custom window class
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Mouse Event Demo")
        self.setGeometry(300, 300, 400, 200)
        # 2. Create a central widget and a layout
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        # 3. Create a label to display information
        self.info_label = QLabel("Click a button or the window!")
        self.info_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        layout.addWidget(self.info_label)
        # 4. Create a button and connect its click event
        self.button = QPushButton("Click Me!")
        # The 'clicked' signal is connected to our custom method
        self.button.clicked.connect(self.on_button_click)
        layout.addWidget(self.button)
    # 5. Define the method that gets called on a button click
    def on_button_click(self):
        self.info_label.setText("Button was clicked!")
    # 6. Override the mousePressEvent to handle clicks on the window itself
    def mousePressEvent(self, event):
        # event.button() tells us which button was pressed
        if event.button() == Qt.MouseButton.LeftButton:
            # event.pos() gives the click coordinates relative to the widget
            self.info_label.setText(f"Window Left-Clicked at: ({event.pos().x()}, {event.pos().y()})")
        elif event.button() == Qt.MouseButton.RightButton:
            self.info_label.setText(f"Window Right-Clicked at: ({event.pos().x()}, {event.pos().y()})")
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

Key Concepts in GUI Libraries:

  • Signals and Slots: The modern way to handle events. A widget "emits a signal" (like clicked) and you "connect" it to a "slot" (your function, like on_button_click).
  • Event Methods: You can override built-in methods like mousePressEvent, mouseReleaseEvent, mouseMoveEvent, etc., to get low-level information about the mouse interaction.

Desktop Automation (PyAutoGUI Example)

This is for controlling the mouse system-wide, not just within your own application window.

First, install the library:

pip install pyautogui

Important Safety Note: PyAutoGUI can move your mouse and click anywhere. To prevent accidental disasters, add a small pause at the start of your script to move your mouse to a corner of the screen, which will throw a pyautogui.FailSafeException and stop the script.

import pyautogui
import time
# --- SAFETY FEATURE ---
# Fail-safe: Moving the mouse to the upper-left corner will raise an exception
# and stop the script. Give yourself 5 seconds to move the mouse there.
pyautogui.FAILSAFE = True
print("Script starting in 5 seconds. Move mouse to top-left corner to abort.")
time.sleep(5)
# --- MOUSE MOVEMENT ---
print("Moving mouse to the center of the screen...")
screen_width, screen_height = pyautogui.size()
center_x = screen_width // 2
center_y = screen_height // 2
pyautogui.moveTo(center_x, center_y, duration=1.0) # duration makes the move smooth
# --- MOUSE CLICKS ---
print("Performing a left click...")
pyautogui.click() # Clicks where the mouse currently is
print("Performing a right click at (300, 400)...")
pyautogui.rightClick(300, 400)
print("Performing a double-click...")
pyautogui.doubleClick()
# --- MOUSE DRAG ---
print("Dragging the mouse from (100, 100) to (500, 500)...")
pyautogui.dragTo(500, 500, duration=2, button='left')
# --- GETTING MOUSE INFORMATION ---
print("Getting current mouse position...")
current_x, current_y = pyautogui.position()
print(f"Current mouse position: ({current_x}, {current_y})")

Key PyAutoGUI Functions:

  • pyautogui.position(): Gets the current (x, y) coordinates of the mouse.
  • pyautogui.moveTo(x, y, duration): Moves the mouse.
  • pyautogui.click(x, y, button): Clicks at a specific location. button can be 'left', 'right', or 'middle'.
  • pyautogui.dragTo(x, y, ...): Drags the mouse.

Data Visualization (Matplotlib Example)

When you're working with plots, you often want to know where the user clicked on the graph.

First, install the library:

pip install matplotlib
import matplotlib.pyplot as plt
# Create a simple plot
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax.set_title("Click on the plot!")
# Define the function to handle the click event
def on_click(event):
    # Check if the click was within the axes
    if event.inaxes == ax:
        # event.xdata and event.ydata are the data coordinates
        print(f"Data coordinates: x={event.xdata:.2f}, y={event.ydata:.2f}")
        # event.x and event.y are the pixel coordinates
        print(f"Pixel coordinates: x={event.x}, y={event.y}")
    else:
        print("Clicked outside the plot area.")
# Connect the event to the figure
fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()

Key Matplotlib Concepts:

  • fig.canvas.mpl_connect(): The function used to connect a Matplotlib event type to a handler function.
  • Event Object (event): The handler function receives an event object with useful attributes:
    • event.x, event.y: Pixel coordinates of the click.
    • event.xdata, event.ydata: Data coordinates (the actual values on your plot's axes).
    • event.inaxes: The Axes object that was clicked, or None if the click was outside the plot.

Summary: Which one to choose?

Your Goal Recommended Library Why?
Build a desktop application with buttons PyQt / PySide Professional, powerful, has a full set of GUI widgets and a robust event system.
Automate clicks on other apps or the desktop PyAutoGUI Extremely easy to use for this specific purpose. It controls the mouse, not just within a window.
Get feedback from a click on a plot/chart Matplotlib The events are tied to the data coordinates of your plot, which is exactly what you need.
Listen to all mouse events globally (e.g., for a custom macro tool) pynput Designed specifically for global listening and control, more low-level than PyAutoGUI.
分享:
扫描分享到社交APP
上一篇
下一篇