Frage

Was wäre der einfachste Weg, um die Maus mit Python unter OS X zu bewegen (und möglicherweise zu klicken)?

Dies ist nur zum schnellen Prototyping, es muss nicht elegant sein.

War es hilfreich?

Lösung 3

Ich habe den Quellcode von Synergy gegraben, um den Anruf zu finden, der Mausereignisse generiert:

#include <ApplicationServices/ApplicationServices.h>

int to(int x, int y)
{
    CGPoint newloc;
    CGEventRef eventRef;
    newloc.x = x;
    newloc.y = y;

    eventRef = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newloc,
                                        kCGMouseButtonCenter);
    //Apparently, a bug in xcode requires this next line
    CGEventSetType(eventRef, kCGEventMouseMoved);
    CGEventPost(kCGSessionEventTap, eventRef);
    CFRelease(eventRef);

    return 0;
}

Jetzt, um Python -Bindungen zu schreiben!

Andere Tipps

Probieren Sie den Code bei diese Seite. Es definiert ein paar Funktionen, mousemove und mouseclick, die sich in die Integration von Apple zwischen Python und den Quarzbibliotheken der Plattform einbinden.

Dieser Code funktioniert auf 10.6 und ich verwende ihn auf 10.7. Das Schöne an diesem Code ist, dass er Mausereignisse generiert, was einige Lösungen nicht tun. Ich benutze es, um BBC iPlayer zu steuern, indem ich Mausereignisse an bekannte Knopfpositionen in ihrem Flash -Player sende (sehr spröde ich kenne). Insbesondere die Mausbewegungsereignisse sind erforderlich, da sonst der Flash -Player den Mauszeiger niemals verbirgt. Funktionen wie CGWarpMouseCursorPosition wird das nicht tun.

from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseUp
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap

def mouseEvent(type, posx, posy):
        theEvent = CGEventCreateMouseEvent(
                    None, 
                    type, 
                    (posx,posy), 
                    kCGMouseButtonLeft)
        CGEventPost(kCGHIDEventTap, theEvent)

def mousemove(posx,posy):
        mouseEvent(kCGEventMouseMoved, posx,posy);

def mouseclick(posx,posy):
        # uncomment this line if you want to force the mouse 
        # to MOVE to the click location first (I found it was not necessary).
        #mouseEvent(kCGEventMouseMoved, posx,posy);
        mouseEvent(kCGEventLeftMouseDown, posx,posy);
        mouseEvent(kCGEventLeftMouseUp, posx,posy);

Hier ist das Codebeispiel von oben:

##############################################################
#               Python OSX MouseClick
#       (c) 2010 Alex Assouline, GeekOrgy.com
##############################################################
import sys
try:
        xclick=intsys.argv1
        yclick=intsys.argv2
        try:
                delay=intsys.argv3
        except:
                delay=0
except:
        print "USAGE mouseclick [int x] [int y] [optional delay in seconds]"
        exit
print "mouse click at ", xclick, ",", yclick," in ", delay, "seconds"
# you only want to import the following after passing the parameters check above, because importing takes time, about 1.5s
# (why so long!, these libs must be huge : anyone have a fix for this ?? please let me know.)
import time
from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseUp
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap
def mouseEventtype, posx, posy:
        theEvent = CGEventCreateMouseEventNone, type, posx,posy, kCGMouseButtonLeft
        CGEventPostkCGHIDEventTap, theEvent
def mousemoveposx,posy:
        mouseEventkCGEventMouseMoved, posx,posy;
def mouseclickposx,posy:
        #mouseEvent(kCGEventMouseMoved, posx,posy); #uncomment this line if you want to force the mouse to MOVE to the click location first (i found it was not necesary).
        mouseEventkCGEventLeftMouseDown, posx,posy;
        mouseEventkCGEventLeftMouseUp, posx,posy;
time.sleepdelay;
mouseclickxclick, yclick;
print "done."

Probieren Sie diesen Code einfach aus:

#!/usr/bin/python

import objc

class ETMouse():    
    def setMousePosition(self, x, y):
        bndl = objc.loadBundle('CoreGraphics', globals(), 
                '/System/Library/Frameworks/ApplicationServices.framework')
        objc.loadBundleFunctions(bndl, globals(), 
                [('CGWarpMouseCursorPosition', 'v{CGPoint=ff}')])
        CGWarpMouseCursorPosition((x, y))

if __name__ == "__main__":
    et = ETMouse()
    et.setMousePosition(200, 200)

Es funktioniert in OSX Leopard 10.5.6

Als ich es tun wollte, habe ich installiert Jython und benutzte die java.awt.Robot Klasse. Wenn Sie ein CPython-Skript erstellen müssen, ist dies offensichtlich nicht geeignet. Wenn Sie jedoch die Flexibilität auswählen, ist es eine schöne plattformübergreifende Lösung.

import java.awt

robot = java.awt.Robot()

robot.mouseMove(x, y)
robot.mousePress(java.awt.event.InputEvent.BUTTON1_MASK)
robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK)

Das pynput Die Bibliothek scheint die derzeit am besten gepflegte Bibliothek zu sein. Sie können Eingabegeräte steuern und überwachen.

Hier ist das Beispiel zur Kontrolle der Maus:

from pynput.mouse import Button, Controller

mouse = Controller()

# Read pointer position
print('The current pointer position is {0}'.format(
    mouse.position))

# Set pointer position
mouse.position = (10, 20)
print('Now we have moved it to {0}'.format(
    mouse.position))

# Move pointer relative to current position
mouse.move(5, -5)

# Press and release
mouse.press(Button.left)
mouse.release(Button.left)

# Double click; this is different from pressing and releasing
# twice on Mac OSX
mouse.click(Button.left, 2)

# Scroll two steps down
mouse.scroll(0, 2)

Der einfachste Weg ist die Verwendung von Pyautogui.
Beispiel:

  • Um Mausposition zu bekommen:

    >>> pyautogui.position()
    (187, 567)
    
  • Um die Maus in eine bestimmte Position zu bewegen:

    >>> pyautogui.moveTo(100,200)
    
  • So auslösen eine Mausklick:

    >>> pyautogui.click()
    

Mehr Details: Pyautogui

Das Python -Skript von Geekorgy.com ist großartig, außer dass ich ein paar Haken gestoßen bin, seit ich eine neuere Version von Python installiert habe. Hier sind einige Tipps für andere, die möglicherweise nach einer Lösung suchen.

Wenn Sie Python 2.7 auf Ihrem Mac OS 10.6 installiert haben, haben Sie einige Optionen, um Python aus Quartz.Coregraphics zu importieren:

EIN) Im Terminal, Typ python2.6 statt gerecht python Vor dem Weg zum Skript

B) Du kannst Installieren Sie Pyobjc durch Folgendes:

  1. Installieren Sie Easy_install von http://pypi.python.org/pypi/setuptools
  2. Im Terminal, Typ which python und kopieren Sie den Weg durch 2.7
  3. Geben Sie dann ein easy_install –-prefix /Path/To/Python/Version pyobjc==2.3

    ** dh. easy_install –-prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc==2.3

  4. Innerhalb des Skripttyps import objc oben
  5. Wenn Easy_install nicht beim ersten Mal funktioniert, müssen Sie zuerst den Kern installieren:

    ** dh. easy_install --prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc-core==2.3

C) Du kannst Setzen Sie Ihren Python -Pfad zurück zum ursprünglichen Mac OS Python:

  • In dem Terminal: Typ: defaults write com.apple.versioner.python Version 2.6

*** Auch eine schnelle Möglichkeit, die (x, y) Koordinaten auf dem Bildschirm herauszufinden:

  1. Drücken Sie Command+Shift+4 (Auswahl der Bildschirme)
  2. Der Cursor zeigt dann die Koordinaten an
  3. Dann schlage ESC, um herauszukommen.

Ihre beste Wette ist, die zu verwenden Autopy -Paket. Es ist extrem einfach zu bedienen und plattformübergreifend zu starten.

Um den Cursor in Position zu bewegen (200.200):

import autopy
autopy.mouse.move(200,200)

Verwenden CoreGraphics Aus der Quarzbibliothek zum Beispiel:

from Quartz.CoreGraphics import CGEventCreate
from Quartz.CoreGraphics import CGEventGetLocation
ourEvent = CGEventCreate(None);
currentpos = CGEventGetLocation(ourEvent);
mousemove(currentpos.x,currentpos.y)

Quelle: Tony Kommentar bei Geekorgy Page.

Hier ist das vollständige Beispiel verwendet Quartz Bibliothek:

#!/usr/bin/python
import sys
from AppKit import NSEvent
import Quartz

class Mouse():
    down = [Quartz.kCGEventLeftMouseDown, Quartz.kCGEventRightMouseDown, Quartz.kCGEventOtherMouseDown]
    up = [Quartz.kCGEventLeftMouseUp, Quartz.kCGEventRightMouseUp, Quartz.kCGEventOtherMouseUp]
    [LEFT, RIGHT, OTHER] = [0, 1, 2]

    def position(self):
        point = Quartz.CGEventGetLocation( Quartz.CGEventCreate(None) )
        return point.x, point.y

    def location(self):
        loc = NSEvent.mouseLocation()
        return loc.x, Quartz.CGDisplayPixelsHigh(0) - loc.y

    def move(self, x, y):
        moveEvent = Quartz.CGEventCreateMouseEvent(None, Quartz.kCGEventMouseMoved, (x, y), 0)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, moveEvent)

    def press(self, x, y, button=1):
        event = Quartz.CGEventCreateMouseEvent(None, Mouse.down[button], (x, y), button - 1)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)

    def release(self, x, y, button=1):
        event = Quartz.CGEventCreateMouseEvent(None, Mouse.up[button], (x, y), button - 1)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)

    def click(self, button=LEFT):
        x, y = self.position()
        self.press(x, y, button)
        self.release(x, y, button)

    def click_pos(self, x, y, button=LEFT):
        self.move(x, y)
        self.click(button)

    def to_relative(self, x, y):
        curr_pos = Quartz.CGEventGetLocation( Quartz.CGEventCreate(None) )
        x += current_position.x;
        y += current_position.y;
        return [x, y]

    def move_rel(self, x, y):
        [x, y] = to_relative(x, y)
        moveEvent = Quartz.CGEventCreateMouseEvent(None, Quartz.kCGEventMouseMoved, Quartz.CGPointMake(x, y), 0)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, moveEvent)

Der obere Code basiert auf diesen Originaldateien: Mouse.pymouseUtils.py.

Hier ist der Demo -Code, der oben unterrichtet wird:

# DEMO
if __name__ == '__main__':
    mouse = Mouse()
    if sys.platform == "darwin":
        print("Current mouse position: %d:%d" % mouse.position())
        print("Moving to 100:100...");
        mouse.move(100, 100)
        print("Clicking 200:200 position with using the right button...");
        mouse.click_pos(200, 200, mouse.RIGHT)
    elif sys.platform == "win32":
        print("Error: Platform not supported!")

Sie können beide Codeblöcke in einer Datei kombinieren, die Ausführungsgenehmigung erteilen und als Shell -Skript ausführen.

Der einfachste Weg? Kompilieren Dies Kakao -App und bestehen Sie mit Ihren Mausbewegungen.

Hier ist der Code:

// File:
// click.m
//
// Compile with:
// gcc -o click click.m -framework ApplicationServices -framework Foundation
//
// Usage:
// ./click -x pixels -y pixels
// At the given coordinates it will click and release.

#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

int main(int argc, char **argv) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSUserDefaults *args = [NSUserDefaults standardUserDefaults];


  // grabs command line arguments -x and -y
  //
  int x = [args integerForKey:@"x"];
  int y = [args integerForKey:@"y"];

  // The data structure CGPoint represents a point in a two-dimensional
  // coordinate system.  Here, X and Y distance from upper left, in pixels.
  //
  CGPoint pt;
  pt.x = x;
  pt.y = y;


  // https://stackoverflow.com/questions/1483567/cgpostmouseevent-replacement-on-snow-leopard
  CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, pt, kCGMouseButtonLeft);
  CGEventSetType(theEvent, kCGEventLeftMouseDown);
  CGEventPost(kCGHIDEventTap, theEvent);
  CFRelease(theEvent);

  [pool release];
  return 0;
}

App mit dem Titel "Klicken", das CGPostMouseEvent aus der Header -Datei cGremoteoperation.H aufruft. Es nimmt Koordinaten als Befehlszeilenargumente an, verschiebt die Maus in diese Position, klickt und setzt die Maustaste frei.

Speichern Sie den oben genannten Code als Click.m, öffnen Sie das Terminal und wechseln Sie in den Ordner, in dem Sie die Quelle gespeichert haben. Kompilieren Sie dann das Programm durch Eingabe gcc -o click click.m -framework ApplicationServices -framework Foundation. Lassen Sie dies nicht eingeschüchtert, indem Sie dies kompilieren müssen, da es mehr Kommentare als Code gibt. Es ist ein sehr kurzes Programm, das eine einfache Aufgabe erledigt.


Ein anderer Weg? Importieren Pyobjc So greifen Sie auf einige des OSX -Frameworks zu und greifen auf die Maus auf diese Weise zu. (Siehe den Code aus dem ersten Beispiel für Ideen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top