在Python

时间:2015-09-25 02:28:57

标签: python windows macos tkinter mouse

我正在编写一个连接到设计软件的程序,如外部插件,然后监视鼠标移动和事件。它将根据连接的软件鼠标事件的状态采取行动。

这个想法是外部应用程序将能够连接到多个类似的程序而不是程序特定的插件。

使用Tkinter GUI库在python中编写原型,可能还有生产软件。尝试使其简单易用。

我很容易在没有Tkinter窗口需要激活的情况下抓住“OS”级鼠标位置(真正的屏幕X,Y)。我的问题是我找不到从Tkinter轻松获取鼠标点击事件的方法。我只能在活动的Tkinter窗口上收集事件。

Tkinter为鼠标位置提供此功能:

coord = self.gui.winfo_pointerxy()

我找不到类似的鼠标事件。像selfspyPymouse(现在是PyUserInput的一部分)这样的库可以监视事件,但主要用于控制输入设备。我的备份想法是在编写我自己的输入监控程序时使用这些库作为参考。

我的两个主要平台是Mac和Windows。

长话短说:

  • 当事件在外面时,Tkinter可以给我鼠标事件 Tkinter窗口。
  • 如果没有,是否有“开箱即用”的其他选项可以为我提供鼠标X,Y和鼠标事件。
  • 如果没有开箱即用的解决方案,请参考方法和API。 (看起来像win32api for windows,Quartz和/或 Mac中的Cocoa和Linux中的Xlib)

感谢您的时间

2 个答案:

答案 0 :(得分:1)

这样,您可以使用 TKinter 获得鼠标位置。

Vote

有一个跨平台模块pyautogui(适用于os x,windows,linux)。

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

请参阅此article如何检测窗口的鼠标点击

答案 1 :(得分:1)

在Mac上,最简单的选项可能是NSEvent&#39; addGlobalMonitorForEventsMatchingMask: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解决方案进行详细评论。)