在Python中获取Tkinter窗口外的鼠标事件

8

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

这个想法是外部应用程序将具有与多个类似程序进行接口的能力,而不是特定于程序的插件。

原型,以及可能的生产软件,使用Tkinter GUI库编写Python代码。尝试使其简单易用且可移植。

我可以轻松地获取“OS”级别的鼠标位置(真正的屏幕X、Y),而不需要Tkinter窗口处于活动状态。我的问题是我找不到一种轻松获取Tkinter鼠标点击事件的方法。只有当在活动的Tkinter窗口上时才能收集事件。

Tkinter提供了以下鼠标位置信息:

coord = self.gui.winfo_pointerxy()

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

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

长话短说:

  • Tkinter能否在Tkinter窗口外部给我鼠标事件。
  • 如果不能,是否有其他“开箱即用”的选项可以给我鼠标X、Y和鼠标事件。
  • 如果没有开箱即用的解决方案,一些方法和API的建议。(看起来像是windows的win32api,Mac的Quartz和/或Cocoa以及Linux的Xlib)

感谢您的时间

2个回答

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解决方案的问题。


完全离题了!问题说的是“在 TKINTER 窗口之外!”如果我不讨厌这种行为,我会给你点个踩。 - Apostolos

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

请参考这篇文章,了解如何检测windows的鼠标点击。


谢谢您的发布。这似乎对于鼠标位置和移动非常有帮助,但是这些API是否也适用于应用程序窗口外的按钮/点击事件?我能想到的最简单的功能示例是一个截图应用程序,您需要在应用程序窗口之外单击并拖动。您需要能够看到鼠标点击以及鼠标移动/位置。 - TravisT
1
除了在Windows上,我认为没有任何方法可以获取窗口外鼠标点击事件。 - Tristan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接