Как управлять мышью в Mac с помощью Python?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

29
задан kenorb 26 May 2017 в 13:13
поделиться

6 ответов

Я вырыл через исходный код Совместных действий для нахождения вызова, который генерирует события от нажатия мыши:

#include <ApplicationServices/ApplicationServices.h>

int to(int x, int y)
{
    CGPoint newloc;
    CGEventRef eventRef;
    newloc.x = x;
    newloc.y = y;

    eventRef = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newloc,
                                        kCGMouseButtonCenter);
    //Apparently, a bug in xcode requires this next line
    CGEventSetType(eventRef, kCGEventMouseMoved);
    CGEventPost(kCGSessionEventTap, eventRef);
    CFRelease(eventRef);

    return 0;
}

Теперь для записи привязки Python!

9
ответ дан Ben 28 November 2019 в 01:06
поделиться

Просто попробуйте этот код:

#!/usr/bin/python

import objc

class ETMouse():    
    def setMousePosition(self, x, y):
        bndl = objc.loadBundle('CoreGraphics', globals(), 
                '/System/Library/Frameworks/ApplicationServices.framework')
        objc.loadBundleFunctions(bndl, globals(), 
                [('CGWarpMouseCursorPosition', 'v{CGPoint=ff}')])
        CGWarpMouseCursorPosition((x, y))

if __name__ == "__main__":
    et = ETMouse()
    et.setMousePosition(200, 200)

это работает у леопарда OSX 10.5.6

10
ответ дан 28 November 2019 в 01:06
поделиться

Когда я хотел сделать это, я установил Jython и использовал java.awt.Robot класс. Если необходимо сделать сценарий CPython, это, очевидно, не подходит, но когда Вы гибкость для выбора чего-либо это - хорошее межплатформенное решение.

import java.awt

robot = java.awt.Robot()

robot.mouseMove(x, y)
robot.mousePress(java.awt.event.InputEvent.BUTTON1_MASK)
robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK)
8
ответ дан Jeremy Banks 28 November 2019 в 01:06
поделиться

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

Если вы установили Python 2.7 на Mac OS 10.6, у вас есть несколько вариантов получения python для импорта из Quartz.CoreGraphics:

A) В терминале введите python2.6 вместо python перед путем к сценарию

B) Вы можете установить PyObjC , выполнив следующие действия:

  1. Установите easy_install из http://pypi.python.org/pypi/setuptools
  2. В терминале введите which python и скопируйте путь вверх через 2.7
  3. Затем введите easy_install –-prefix /Path/To/Python/Version pyobjc==2.3

    ** т.е. easy_install –-prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc==2.3

  4. Внутри типа сценария import objc вверху
  5. Если easy_install не работает в первый раз, вам может понадобиться сначала установить ядро:

    ** т.е. easy_install --prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc-core==2.3

C) Вы можете сбросить ваш путь Python на исходный питон Mac OS:

  • В терминале введите: defaults write com.apple.versioner.python Version 2.6

*** Кроме того, быстрый способ узнать координаты (x, y) на экране:

  1. Нажмите Command+Shift+4 (выбор экрана)
  2. . Затем курсор показывает координаты
  3. , затем нажмите Esc, чтобы выйти из него.
1
ответ дан dfred 28 November 2019 в 01:06
поделиться

Используйте CoreGraphics из библиотеки Quartz, например:

from Quartz.CoreGraphics import CGEventCreate
from Quartz.CoreGraphics import CGEventGetLocation
ourEvent = CGEventCreate(None);
currentpos = CGEventGetLocation(ourEvent);
mousemove(currentpos.x,currentpos.y)

Источник: Тони комментарий на странице Geekorgy .

0
ответ дан kenorb 28 November 2019 в 01:06
поделиться

Самый легкий путь? Скомпилируйте этот приложение Какао и передайте его Ваши движения мыши.

Вот код:

// File:
// click.m
//
// Compile with:
// gcc -o click click.m -framework ApplicationServices -framework Foundation
//
// Usage:
// ./click -x pixels -y pixels
// At the given coordinates it will click and release.

#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

int main(int argc, char **argv) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSUserDefaults *args = [NSUserDefaults standardUserDefaults];


  // grabs command line arguments -x and -y
  //
  int x = [args integerForKey:@"x"];
  int y = [args integerForKey:@"y"];

  // The data structure CGPoint represents a point in a two-dimensional
  // coordinate system.  Here, X and Y distance from upper left, in pixels.
  //
  CGPoint pt;
  pt.x = x;
  pt.y = y;


  // https://stackoverflow.com/questions/1483567/cgpostmouseevent-replacement-on-snow-leopard
  CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, pt, kCGMouseButtonLeft);
  CGEventSetType(theEvent, kCGEventLeftMouseDown);
  CGEventPost(kCGHIDEventTap, theEvent);
  CFRelease(theEvent);

  [pool release];
  return 0;
}

Приложение назвало щелчок, который вызывает CGPostMouseEvent от заголовочного файла CGRemoteOperation.h. Это берет координаты в качестве параметров командной строки, перемещает мышь в то положение, затем нажимает и отпускает кнопку мыши.

Сохраняют вышеупомянутый код как click.m, открывают Terminal и переключаются на папку, где Вы сохранили источник. Тогда скомпилируйте программу путем ввода gcc -o click click.m -framework ApplicationServices -framework Foundation. Не запугивайтесь путем необходимости скомпилировать это, поскольку существует больше комментариев, чем код. Это - очень короткая программа, которая делает одну простую задачу.

<час>

Иначе? Импорт pyobjc, чтобы получить доступ к части платформы OSX и получить доступ к мыши тот путь. (см. код от первого примера для идей).

0
ответ дан vy32 28 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: