[PYTHON] Machen Sie pyautogui [super-geeignet] kompatibel mit der Multi-Display-Umgebung Teil1

Zweck

Ich möchte Pyautogui auch in einer Umgebung mit mehreren Anzeigen verwenden, oder genauer gesagt, ich möchte Bilder in einer Unteranzeige in einer Umgebung mit mehreren Anzeigen erkennen.

Umgebung

python 3.8.5 pyautogui 0.9.50 pyscreez 0.1.26 Nur Betriebssystemfenster

Ermittlung

Referenz: Warum pyautoguis locateOnScreen () Multi-Display nicht unterstützt Im obigen Artikel habe ich die folgende Beschreibung gefunden.

PILs imageGrab.grab () unterstützt keine doppelte Anzeige

Lesen Sie dies? Ich dachte, ich habe die Definition von imageGrab.grab () überprüft.

def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None):
all_screens=False

Überprüfen Sie die Argumente so, ich weiß es seit einiger Zeit nicht, aber zumindest in Python 3.8.5 scheint sich die Grab-Funktion geändert zu haben.

Implementierungsdetails

Wenn das Betriebssystem Windows ist, ruft die folgende Funktion image.grab () in locateOnScreen () von pyautogui auf.

def _screenshot_win32(imageFilename=None, region=None):
    """
    TODO
    """

    # TODO - Use the winapi to get a screenshot, and compare performance with ImageGrab.grab()
    # https://stackoverflow.com/a/3586280/1893164
    im = ImageGrab.grab()

    if region is not None:
        assert len(region) == 4, 'region argument must be a tuple of four ints'
        region = [int(x) for x in region]
        im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
    if imageFilename is not None:
        im.save(imageFilename)
    return im

Also werde ich ein Argument an imageGrab.grab () übergeben, das war's.

def _screenshot_win32(imageFilename=None, region=None):
    """
    TODO
    """

    # TODO - Use the winapi to get a screenshot, and compare performance with ImageGrab.grab()
    # https://stackoverflow.com/a/3586280/1893164
    #im = ImageGrab.grab()
    im = ImageGrab.grab(all_screens=True)

    if region is not None:
        assert len(region) == 4, 'region argument must be a tuple of four ints'
        region = [int(x) for x in region]
        im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
    if imageFilename is not None:
        im.save(imageFilename)
    return im

Ergebnis

Die Bilderkennung ist jetzt auch auf Unteranzeigen möglich.

Problem

Das Display ist ausgerichtet

[1][2][3]

Oder

[1][2]
[3][4]

Es wäre schön, wenn sie so gut erzogen wären

 [2] [1] [3](Anordnung meines Hauses)

Bei dieser Anordnung gibt locateOnScreen die Koordinaten mit LeftTop von [2] als (0,0) zurück, während die Fensterseite die Koordinaten mit LeftTop von [1] als (0,0) benötigt. Wird sein.

Dieses Problem hat eine API, die Monitore auflistet und Koordinaten in win32api zurückgibt. Daher möchte ich sie beim nächsten Mal verwenden, um sie zu lösen. Bis hierher für diese Zeit.

Recommended Posts

Machen Sie pyautogui [super-geeignet] kompatibel mit Multi-Display-Umgebung Teil2
Machen Sie pyautogui [super-geeignet] kompatibel mit der Multi-Display-Umgebung Teil1
Machen Sie PLEN Control Server kompatibel mit ViVi PLEN2
[Python] Lassen Sie uns matplotlib mit Japanisch kompatibel machen
Konvertieren der Django-Umgebung in Docker (Docker + Django + Gunicorn + Nginx) Teil 2
Konvertieren der Django-Umgebung in Docker (Docker + Django + Gunicorn + Nginx) Teil 3
Wie man ein Schießspiel mit toio macht (Teil 1)