Soru Python kullanarak Mac'te mouse nasıl kontrol edilir?


OS X üzerinde Python'u kullanarak fareyi hareket ettirmenin en kolay yolu ne olurdu?

Bu sadece hızlı prototipleme için, zarif olmak zorunda değil.


26
2017-11-11 15:04


Menşei




Cevaplar:


Kodu deneyin. bu sayfa. Birkaç işlevi tanımlar mousemove ve mouseclickApple'ın Python ile platformun Quartz kütüphaneleri arasındaki entegrasyonuna bağlanır.

Bu kod 10.6'da çalışıyor ve 10.7'de kullanıyorum. Bu kodla ilgili güzel şey, bazı çözümlerin yapmadığı fare olayları oluşturmasıdır. BBC iPlayer'ı, Flash player'larında bilinen buton pozisyonlarına fare olayları göndererek kontrol etmek için kullanıyorum (çok az bildiğim). Özellikle fare hareketi olayları, aksi takdirde Flash oynatıcının fare imlecini hiçbir zaman gizlememesi gerekmemektedir. Gibi işlevler CGWarpMouseCursorPosition bunu yapmayacak.

from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseUp
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap

def mouseEvent(type, posx, posy):
        theEvent = CGEventCreateMouseEvent(
                    None, 
                    type, 
                    (posx,posy), 
                    kCGMouseButtonLeft)
        CGEventPost(kCGHIDEventTap, theEvent)

def mousemove(posx,posy):
        mouseEvent(kCGEventMouseMoved, posx,posy);

def mouseclick(posx,posy):
        # uncomment this line if you want to force the mouse 
        # to MOVE to the click location first (I found it was not necessary).
        #mouseEvent(kCGEventMouseMoved, posx,posy);
        mouseEvent(kCGEventLeftMouseDown, posx,posy);
        mouseEvent(kCGEventLeftMouseUp, posx,posy);

Yukarıdaki sayfadan kod örneği:

##############################################################
#               Python OSX MouseClick
#       (c) 2010 Alex Assouline, GeekOrgy.com
##############################################################
import sys
try:
        xclick=intsys.argv1
        yclick=intsys.argv2
        try:
                delay=intsys.argv3
        except:
                delay=0
except:
        print "USAGE mouseclick [int x] [int y] [optional delay in seconds]"
        exit
print "mouse click at ", xclick, ",", yclick," in ", delay, "seconds"
# you only want to import the following after passing the parameters check above, because importing takes time, about 1.5s
# (why so long!, these libs must be huge : anyone have a fix for this ?? please let me know.)
import time
from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseUp
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap
def mouseEventtype, posx, posy:
        theEvent = CGEventCreateMouseEventNone, type, posx,posy, kCGMouseButtonLeft
        CGEventPostkCGHIDEventTap, theEvent
def mousemoveposx,posy:
        mouseEventkCGEventMouseMoved, posx,posy;
def mouseclickposx,posy:
        #mouseEvent(kCGEventMouseMoved, posx,posy); #uncomment this line if you want to force the mouse to MOVE to the click location first (i found it was not necesary).
        mouseEventkCGEventLeftMouseDown, posx,posy;
        mouseEventkCGEventLeftMouseUp, posx,posy;
time.sleepdelay;
mouseclickxclick, yclick;
print "done."

22
2017-11-20 15:48



Benim için çalıştı ve ekran boyutunu nasıl kontrol edeceğinizi merak ediyorsanız. stackoverflow.com/questions/1281397/... - cevaris


Sadece şu kodu deneyin:

#!/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 leopar 10.5.6 çalışır


10
2018-03-19 23:15



Hala 10.7'de çalışıyor - dbr


Fare olaylarını üreten çağrıyı bulmak için Synergy'nin kaynak koduyla kazdım:

#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;
}

Şimdi Python bağlamaları yazmak için!


9
2017-11-11 16:10



Belki bağlama yerine ctipleri dene? - technomalogical
En azından daha yeni OS X sürümlerinde, Apple işletim sistemiyle birlikte verilen Python dağıtımında Quartz bağlamaları dahil etmiştir. Cevabımı aşağıya bakın. - Mike Rhodes


Bunu yapmak istediğimde, ben kurdum Jython ve kullanıldı java.awt.Robot sınıf. Bir CPython betiği yapmanız gerekiyorsa, bu kesinlikle uygun değildir, ancak herhangi bir şeyi seçme esnekliğiniz olduğunda, güzel bir çapraz platform çözümüdür.

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
2017-11-11 16:23





pynput Kütüphane şu anda en iyi korunan kütüphane gibi görünüyor. Giriş cihazlarını kontrol etmenizi ve izlemenizi sağlar.

İşte fareyi kontrol etmek için bir örnek:

from pynput.mouse import Button, Controller

mouse = Controller()

# Read pointer position
print('The current pointer position is {0}'.format(
    mouse.position))

# Set pointer position
mouse.position = (10, 20)
print('Now we have moved it to {0}'.format(
    mouse.position))

# Move pointer relative to current position
mouse.move(5, -5)

# Press and release
mouse.press(Button.left)
mouse.release(Button.left)

# Double click; this is different from pressing and releasing
# twice on Mac OSX
mouse.click(Button.left, 2)

# Scroll two steps down
mouse.scroll(0, 2)

5
2018-03-12 15:44



Bir fare tıklaması yapmak, özellikle Python 2.7 ve OS X için bir çözüme ihtiyaç duyan bir düzine makale aradı. En iyi hitlerin çoğu 3 yıldan uzun bir süredir sorular ve cevaplar. .Scroll'un ne yapması gerektiğine dair hiçbir fikrim yok, ama bu cevaptaki her şey işe yaradı. Bu, diğer cevaplardan, java.awt birinden bile daha okunaklı ve daha az karmaşıktır. - VISQL


En kolay yol PyAutoGUI kullanıyor.
Örnek:

  • Fare pozisyonunu almak için:

    >>> pyautogui.position()
    (187, 567)
    
  • Fareyi belirli bir konuma taşımak için:

    >>> pyautogui.moveTo(100,200)
    
  • Bir fare tıklaması tetiklemek için:

    >>> pyautogui.click()
    

Daha fazla detay: PyAutoGUI


2
2018-03-27 13:29





Python komut dosyası geekorgy.com python'un daha yeni bir sürümünü kurduğumdan beri birkaç tıkanıklık geçirdiğim için harika. İşte burada bir çözüm arayan diğerlerine bazı ipuçları var.

Mac OS 10.6'nıza Python 2.7'yi yüklediyseniz, Quartz.CoreGraphics'ten içe aktarılacak python almak için birkaç seçeneğiniz vardır:

A) Terminalde tip python2.6 sadece yerine python komut dosyasının yolundan önce

B) Yapabilirsin PyObjC'yi yükle aşağıdakileri yaparak:

  1. Easy_install uygulamasını şu adresten yükleyin: http://pypi.python.org/pypi/setuptools
  2. Terminalde yaz which python ve yolu kopyala 2.7
  3. Sonra yazın easy_install –-prefix /Path/To/Python/Version pyobjc==2.3 

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

  4. Komut dosyası türünün içinde import objc tepede
  5. Easy_install ilk defa çalışmıyorsa, öncelikle çekirdeği yüklemeniz gerekebilir:

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

C) Yapabilirsin python yolunu sıfırla Orijinal Mac OS python'una:

  • Terminalde şunu yazın: defaults write com.apple.versioner.python Version 2.6

*** Ayrıca, ekranda (x, y) koordinatlarını öğrenmenin hızlı bir yolu:

  1. Basın Command+Shift+4 (ekran yakalama seçimi)
  2. İmleç daha sonra koordinatları gösterir
  3. Ardından çıkmak için Esc'ye basın.

1
2018-05-22 05:51