Wie steuert ich die Maus im Mac mit Python?
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.
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:
- Installieren Sie Easy_install von http://pypi.python.org/pypi/setuptools
- Im Terminal, Typ
which python
und kopieren Sie den Weg durch2.7
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
- Innerhalb des Skripttyps
import objc
oben 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:
- Drücken Sie
Command+Shift+4
(Auswahl der Bildschirme) - Der Cursor zeigt dann die Koordinaten an
- 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.py
mouseUtils.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).