Ich versuche, einen einfachen Makrorecorder in Python für OSX zu schreiben - etwas, das Maus- und Schlüsselereignisse erfassen kann, während das Skript im Hintergrund läuft und sie wiederholt. Ich kann autopy für das letztere verwenden, gibt es eine ähnlich einfache Bibliothek für das ehemalige?Kann ich mit Python Tastatur- und Mausereignisse in OSX erfassen?
Antwort
Es scheint keine Möglichkeit zu geben, dies in Python unter OSX zu tun.
Ich weiß, dass Sie curses
für die Erfassung der Tasteneingabe verwenden können, aber ich bin nicht sicher über Mauseingabe. Nicht nur das, aber wenn ich mich nicht irre, ist es in der Std-Bibliothek mit 2.7.2 enthalten.
Hier ist eine Lösung ohne curses
mit:
http://docs.python.org/faq/library.html#how-do-i-get-a-single-keypress-at-a-time
Diese Frage vor einiger Zeit hier gefragt wurde - Python cross-platform listening for keypresses?
Sie können den Beispielcode gibt es hilfreich!
Ich bin heute ein paar Lösungen für dieses Problem durchgelaufen und dachte mir, ich würde hier umkreisen und teilen, damit andere die Suchzeit speichern können.
Eine raffinierte Cross-Plattform-Lösung für die Eingabe-Tastatur und Maus zu simulieren: http://www.autopy.org/
Ich fand auch ein kurzes, aber arbeite (Stand Mountain Lion) Beispiel dafür, wie Tastenanschläge global anmelden. Der einzige Nachteil ist, dass Sie Python2.6 verwenden müssen, da 2.7 die objc-Module anscheinend nicht verfügbar sind.
#!/usr/bin/python2.6
"""PyObjC keylogger for Python
by ljos https://github.com/ljos
"""
from Cocoa import *
import time
from Foundation import *
from PyObjCTools import AppHelper
class AppDelegate(NSObject):
def applicationDidFinishLaunching_(self, aNotification):
NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, handler)
def handler(event):
NSLog(u"%@", event)
def main():
app = NSApplication.sharedApplication()
delegate = AppDelegate.alloc().init()
NSApp().setDelegate_(delegate)
AppHelper.runEventLoop()
if __name__ == '__main__':
main()
Für Mauseingabe, ersetzen Sie einfach NSKeyDownMask
mit der entsprechenden Maske aus der Liste finden Sie hier: http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:
Zum Beispiel NSMouseMovedMask
Werke für Mausbewegungen verfolgen. Von dort können Sie auf event.locationInWindow() oder andere Attribute zugreifen.
Calvin Cheng, Danke. Ihr Vorschlag funktioniert unter OS X 10.8.5.
-Code von http://docs.python.org/faq/library.html#how-do-i-get-a-single-keypress-at-a-time
#!/usr/bin/python
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
try:
while 1:
try:
c = sys.stdin.read(1)
print "Got character", repr(c)
except IOError: pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
Eine weitere Lösung Key Listeners in python?
Einige Pakete hier OS X Unterstützung erwähnt haben (zB 'keyboard'): https://stackoverflow.com/questions/11918999/key -listener-in-python / –