2015-09-25 40 views
8

Piszę program, który łączy się z oprogramowaniem do projektowania, jak zewnętrzna wtyczka, a następnie monitoruje ruchy myszy i zdarzenia. Podejmie działania oparte na stanie połączonych zdarzeń myszy programowych.Otrzymuj zdarzenia myszy poza oknem Tkintera w Pythonie

Pomysł polega na tym, że zewnętrzna aplikacja będzie mogła łączyć się z wieloma podobnymi programami zamiast z programowymi wtyczkami.

Prototyp i potencjalnie oprogramowanie produkcyjne jest pisane w pythonie przy użyciu biblioteki graficznej Tkinter. Próbą jest uczynić ją prostą i przenośną.

Byłem w stanie złapać pozycję myszy na poziomie "OS" (prawdziwy ekran X, Y) bez konieczności aktywowania okna Tkinter. Moim problemem jest to, że nie znajduję sposobu na łatwe uzyskanie zdarzeń kliknięcia myszą od Tkintera. Mogę zbierać zdarzenia tylko w aktywnym oknie Tkintera.

Tkinter zapewnia to dla pozycji myszy:

coord = self.gui.winfo_pointerxy() 

nie mogę znaleźć podobny do zdarzeń myszy. Istnieją biblioteki, takie jak selfspy i Pymouse (obecnie część PyUserInput), które monitorują zdarzenia, ale głównie służą do kontroli urządzeń wejściowych. Mój pomysł na tworzenie kopii zapasowych polega na użyciu tych bibliotek w celu odniesienia się do pisania własnego programu monitorującego dane wejściowe.

Moje dwie główne platformy to Mac i Windows.

Krótko mówiąc:

  • Czy tkinter dać mi zdarzenia myszy, gdy zdarzenia są oknem Tkinter.
  • Jeśli nie, czy istnieją inne opcje "gotowe do użycia", które mogą powodować zdarzenia myszy X, Y i myszy.
  • Jeśli nie ma gotowych rozwiązań, niektóre zalecenia dotyczące podejścia i interfejsu API. (Wygląda jak Win32API dla Windows, kwarc i/lub kakao w Mac i Xlib w Linuksie)

Dzięki za poświęcony czas

Odpowiedz

1

W ten sposób można uzyskać pozycji myszy z tkinter.

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() 

Jest wieloplatformowy moduł pyautogui (działa na OS X, Windows, Linux).

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

odnoszą się do tego article jak wykryć kliknięć myszką dla okien

+0

Dziękuję za komentarz. Wydaje się to bardzo pomocne dla pozycji i ruchu myszy, ale czy zdarzenia związane z przyciskami/kliknięciami poza oknem aplikacji są również dostępne z tymi interfejsami API? Najprostszy przykład, jaki mogę sobie wyobrazić, to rodzaj funkcjonalności, której szukam, to aplikacja do zrzutu ekranu, którą należy kliknąć i przeciągnąć poza okno aplikacji. Musisz widzieć kliknięcia myszy wraz z ruchem/pozycją myszy. – TravisT

+1

Z wyjątkiem wdów, nie sądzę, że istnieją jakieś metody, aby uzyskać kliknięcia zdarzeń myszy poza twoim oknem. –

1

Na Mac, najprostszym rozwiązaniem jest prawdopodobnie NSEvent „s addGlobalMonitorForEventsMatchingMask:handler:: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Należy pamiętać, że jest to specjalnie dla zdarzenia wysłane do aplikacji inne aplikacje, a nie własne.

Na niższym poziomie można również zajrzeć do korków wydarzeń kwarcowych.Prosty przykład stosując 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 

(obawiam się, że nie mogę się wypowiedzieć w szczegółach dotyczących rozwiązania systemu Windows.)