2015-09-25 109 views
8

我正在編寫一個連接到設計軟件(如外部插件)的程序,然後監視鼠標移動和事件。它將根據所連接的軟件鼠標事件的狀態採取行動。在Python中的Tkinter窗口之外獲取鼠標事件

這個想法是外部應用程序將有能力接口到多個類似的程序,而不是程序特定的插件。

原型和潛在的生產軟件正在使用Tkinter GUI庫在python中編寫。嘗試是使它簡單和便攜。

我很容易抓住「OS」級別的鼠標位置(真正的屏幕X,Y),而不需要激活Tkinter窗口。我的問題是,我沒有找到一種輕鬆獲得Tkinter鼠標點擊事件的方法。我只能在活動的Tkinter窗口上收集活動。

Tkinter的提供這個鼠標的位置:

coord = self.gui.winfo_pointerxy() 

我找不到鼠標事件類似。有像selfspyPymouse(現在是PyUserInput的一部分)的庫監視事件,但主要用於控制輸入設備。我的備用想法是使用這些庫來編寫我自己的輸入監控程序。

我的兩個主要平臺是Mac和Windows。

長話短說:

  • 可以使用TKinter給我的鼠標事件,當事件是 Tkinter的窗外。
  • 如果沒有,是否有其他選項「開箱即用」,可以給我鼠標X,Y和鼠標事件。
  • 如果沒有開箱即用的解決方案,對方法和API有一些建議。 (貌似WIN32API窗戶,石英和/或 可可在Mac和Xlib的Linux中)

感謝您的時間

回答

1

這樣你得到的鼠標位置使用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() 

有一個跨平臺模塊pyautogui(適用於OS X,Windows和Linux)。

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

參閱本article如何檢測鼠標的點擊次數窗口

+0

謝謝你張貼。這對於鼠標位置和移動似乎非常有幫助,但是在應用程序窗口之外的按鈕/點擊事件對於這些API也可用? 我能想到的最簡單的例子是我需要的功能類型是一個截圖應用程序,您需要在應用程序窗口外單擊並拖動。您需要能夠看到鼠標點擊以及鼠標移動/位置。 – TravisT

+1

除了寡婦,我不認爲有任何方法可以讓你的窗口外的鼠標點擊事件。 –

1

在Mac上,最簡單的選擇可能是NSEventaddGlobalMonitorForEventsMatchingMask:handler:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler

注意,這是專門爲事件發送到其他應用程序,而不是你自己的。

在較低級別上,您還可以使用Quartz事件點擊查看。使用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 

(恐怕詳細關於在Windows的解決方案我不能發表評論。)