2012-03-26 8 views
9

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?

+0

Einige Pakete hier OS X Unterstützung erwähnt haben (zB 'keyboard'): https://stackoverflow.com/questions/11918999/key -listener-in-python / –

Antwort

0

Es scheint keine Möglichkeit zu geben, dies in Python unter OSX zu tun.

1

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.

5

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.

-2

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?