2012-03-26 42 views
9

Estoy tratando de escribir un grabador de macros simple en Python para OSX, algo que puede capturar eventos de mouse y clave mientras el script se ejecuta en segundo plano y reproducirlos. Puedo usar autopy para este último, ¿existe una biblioteca igualmente simple para el primero?¿Puedo usar Python para capturar eventos de teclado y mouse en OSX?

+0

Algunos paquetes mencionados aquí tienen el apoyo OS X (por ejemplo 'keyboard'): https://stackoverflow.com/questions/11918999/key -listeners-in-python / –

Respuesta

0

No parece haber una manera de hacerlo en Python en OSX.

1

Sé que puede usar curses para capturar la entrada de la clave, pero no estoy seguro acerca de la entrada del mouse. No solo eso, sino que si no me equivoco, se incluye en la biblioteca estándar con 2.7.2.

5

Hoy encontré algunas soluciones a este problema y pensé en dar la vuelta y compartir aquí para que otros pudieran ahorrar tiempo de búsqueda.

Una solución multiplataforma ingenioso para simular la entrada del teclado y el ratón: http://www.autopy.org/

también encontré una breve pero de trabajo (A partir del león de montaña) ejemplo de cómo conectarse globalmente pulsaciones de teclas. La única advertencia es que debes usar Python2.6 ya que 2.7 no parece tener los módulos objc disponibles.

#!/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() 

Para la entrada del ratón, basta con sustituir NSKeyDownMask con la máscara relevante de la lista disponible aquí: http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Por ejemplo, NSMouseMovedMask obras para el seguimiento de los movimientos del ratón. Desde allí, puede acceder a event.locationInWindow() u otros atributos.

-2

Calvin Cheng, gracias. tu sugerencia funciona en OS X 10.8.5.

Código de 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) 

Una solución más Key Listeners in python?

Cuestiones relacionadas