2015-09-25 9 views
8

Ich schreibe ein Programm, das wie ein externes Plug-in eine Design-Software verbindet und dann Mausbewegungen und Ereignisse überwacht. Es werden Aktionen basierend auf dem Status der verbundenen Software-Mausereignisse ausgeführt.Mausereignisse außerhalb des Tkinter-Fensters in Python erhalten

Die Idee ist die externe Anwendung wird die Fähigkeit haben, zu mehreren ähnlichen Programmen anstelle von programmspezifischen Plugins zu verbinden.

Der Prototyp und möglicherweise die Produktionssoftware wird mit der Tkinter-GUI-Bibliothek in Python geschrieben. Der Versuch ist es einfach und tragbar zu machen.

Ich war leicht in der Lage, "OS" Ebene Mausposition (wahre Bildschirm X, Y) zu greifen, ohne dass das Tkinter-Fenster aktiv sein muss. Mein Problem ist, dass ich keine Möglichkeit finde, die Mausklick-Ereignisse von Tkinter zu bekommen. Ich kann Ereignisse nur über das aktive Tkinter-Fenster sammeln.

Tkinter bietet dies für Mausposition:

coord = self.gui.winfo_pointerxy() 

ich nicht für Mausereignisse ähnlich finden. Es gibt Bibliotheken wie selfspy und Pymouse (jetzt Teil von PyUserInput), die Ereignisse überwachen, aber hauptsächlich zur Steuerung der Eingabegeräte dienen. Meine Backup-Idee besteht darin, diese Bibliotheken als Referenz für das Schreiben meines eigenen Überwachungsprogramms zu verwenden.

Meine zwei Hauptplattformen sind Mac und Windows.

Lange Rede kurzer Sinn:

  • Kann tkinter geben Sie mir Ereignisse Maus, wenn die Ereignisse außerhalb des sind Tkinter Fenster.
  • Wenn nicht, gibt es andere Optionen "out of the box", die mir Maus X, Y und Maus Ereignisse geben können.
  • Wenn es keine Out-of-the-Box-Lösungen gibt, einige Empfehlungen zu Ansatz und API. (Sieht aus wie win32api für Fenster, Quarz und/oder Cocoa in Mac und Xlib in Linux)

Vielen Dank für Ihre Zeit

Antwort

1

diese Weise können Sie die Mausposition mit tkinter bekommen.

import Tkinter as tk 
root = tk.Tk() 

def motion(event): 
    x, y = event.x, event.y 
    print('{}, {}'.format(x, y)) 

root.bind('<Motion>', motion) 
root.mainloop() 

Es gibt eine plattformübergreifende Modul pyautogui (arbeitet für OS X, Windows, Linux).

pyautogui.posistion() //returns tuple with mouse x and y values 
         // same for python 3.x 

auf diese article beziehen, wie die Mausklicks für Fenster

+0

Danke für die Buchung. Dies scheint sehr hilfreich für die Mausposition und -bewegung zu sein, aber sind Button/Click-Ereignisse außerhalb des App-Fensters auch mit diesen APIs verfügbar? Das einfachste Beispiel, das ich von Art der Funktionalität, nach der ich suche, ist eine Screenshot-Anwendung, die Sie klicken und ziehen außerhalb des App-Fensters müssen. Sie müssen in der Lage sein, Mausklicks mit der Mausbewegung/-position zu sehen. – TravisT

+1

Außer auf Witwen glaube ich nicht, dass es Methoden gibt, Mausklick Ereignisse außerhalb Ihres Fensters zu bekommen. –

1

auf Mac erkennen, ist die einfachste Möglichkeit, wahrscheinlich NSEvent ‚s addGlobalMonitorForEventsMatchingMask:handler:: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Beachten Sie, dass dies für spezifisch ist Ereignisse gesendet an andere Anwendungen, und nicht Ihre eigenen.

Auf einer niedrigeren Ebene können Sie auch die Verwendung von Quartz Event Taps untersuchen.Einfaches Beispiel mit PyObjC:

from Quartz import CGEventTapCreate 
# ...etc. 

def listen_for_mouse_events(): 
    mouse_tap = CGEventTapCreate(
    kCGSessionEventTap, 
    kCGHeadInsertEventTap, 
    kCGEventTapOptionListenOnly, 
    CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp), 
    on_mouse_event, 
    None 
    ) 
    runLoopSource = CFMachPortCreateRunLoopSource(None, mouse_tap, 0) 
    CFRunLoopAddSource(
    CFRunLoopGetCurrent(), 
    runLoopSource, 
    kCFRunLoopDefaultMode 
) 
    CGEventTapEnable(mouse_tap, True) 

def on_mouse_event(proxy, event_type, event, refcon): 
    location = CGEventGetLocation(event) 
    if (event_type == kCGEventLeftMouseDown): 
    pass 
    elif (event_type == kCGEventLeftMouseUp): 
    pass 

(Ich fürchte, ich nicht im Detail in Bezug auf eine Windows-Lösung kommentieren.)

Verwandte Themen