Получить события мыши вне окна Tkinter в Python

Я пишу программу, которая соединяется с программным обеспечением для проектирования, как внешний плагин, а затем отслеживает движение мыши и события. Он будет принимать действия, основанные на состоянии связанных событий софт-мыши.

Идея заключается в том, что внешнее приложение будет иметь возможность взаимодействовать с несколькими подобными программами, а не с программными плагинами.

Прототип и потенциально программное обеспечение для производства записывается на python с использованием библиотеки TKinter GUI. Попытка состоит в том, чтобы сделать его простым и портативным.

Я легко мог захватить позицию мыши уровня OS (истинный экран X, Y) без окна Tkinter, которое должно быть активным. Моя проблема в том, что я не нахожу способ легко получить события щелчка мыши от Tkinter. Я могу собирать события только в активном окне Tkinter.

Tkinter предоставляет это для положения мыши:

coord = self.gui.winfo_pointerxy() 

Я не могу найти похожие события мыши. Существуют библиотеки типа selfspy и Pymouse (теперь часть PyUserInput), которые отслеживают события, но в основном предназначены для управления устройствами ввода. Моя идея резервного копирования заключается в том, чтобы использовать эти библиотеки для справки при написании моей собственной программы мониторинга ввода.

Мои две основные платформы – Mac и Windows.

Короче:

  • Может ли Tkinter давать мне события мыши, когда события находятся вне окна Tkinter.
  • Если нет, есть ли другие варианты «из коробки», которые могут дать мне мыши X, Y и события мыши.
  • Если нет готовых решений, некоторые рекомендации по подходу и API. (выглядит как win32api для окон, Quartz и / или Cocoa в Mac и Xlib в Linux)

Спасибо за ваше время

2 Solutions collect form web for “Получить события мыши вне окна Tkinter в Python”

На Mac самым простым вариантом является, вероятно, NSEvent addGlobalMonitorForEventsMatchingMask:handler: :: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/#//apple_ref/occ/clm / NSEvent / addGlobalMonitorForEventsMatchingMask: обработчик :

Обратите внимание, что это специально для событий, отправленных в другие приложения, а не ваших собственных.

На более низком уровне вы также можете изучить использование кранов событий 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 .

 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 

обратитесь к этой статье, как обнаружить щелчки мыши для окон

  • ImportError: невозможно импортировать имя NUMPY_MKL
  • ImportError: невозможно импортировать имя add_newdocs
  • <Python> Ошибка установки OpenPIV
  • pip установить UnicodeDecodeError
  • Тихая печать PDF в Python
  • Запустить IPython-ноутбук с выбранным браузером
  • Не удается открыть видеофайлы «.mp4» с использованием OpenCV 2.4.3, Python 2.7 на компьютере под управлением Windows 7
  • Разбор результатов askopenfilenames ()?
  • python os.listdir () показывает защищенные файлы
  • shutl.rmtree не работает в Windows с «Access is denied»
  • Обновление нескольких терминалов Python
  • Python - лучший язык программирования в мире.