[PYTHON] Rendre pyautogui [super-approprié] compatible avec l'environnement multi-affichage Partie 1

Objectif

Je souhaite utiliser pyautogui même dans un environnement multi-écrans, ou plus précisément, je souhaite reconnaître les images dans un sous-écran dans un environnement multi-écrans.

environnement

python 3.8.5 pyautogui 0.9.50 pyscreez 0.1.26 Windows OS uniquement

enquête

Référence: Pourquoi la fonction LocateOnScreen () de pyautogui ne prend pas en charge le multi-affichage Dans l'article ci-dessus, j'ai trouvé la description suivante.

ImageGrab.grab () de PIL ne prend pas en charge le double affichage

Lis ça? J'ai pensé, j'ai vérifié la définition de imageGrab.grab ().

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

Vérifiez l'argument comme ça, je ne sais pas depuis un certain temps, mais au moins en python 3.8.5, la fonction grab semble avoir changé.

Détails d'implémentation

Lorsque le système d'exploitation est Windows, la fonction suivante appelle image.grab () dans LocateOnScreen () de pyautogui.

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

Donc, je vais passer un argument à imageGrab.grab (), c'est tout.

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

résultat

La reconnaissance d'image est désormais possible même sur les sous-écrans.

problème

L'affichage est aligné

[1][2][3]

Ou

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

Ce serait bien s'ils étaient alignés d'une manière bien comportée comme

 [2] [1] [3](Aménagement de ma maison)

Lorsqu'il est agencé comme ceci, LocateOnScreen renvoie les coordonnées avec LeftTop de [2] comme (0,0), tandis que le côté fenêtre requiert les coordonnées avec LeftTop de [1] comme (0,0). Sera.

Ce problème a une API qui énumère les moniteurs et renvoie les coordonnées dans win32api, je voudrais donc l'utiliser la prochaine fois pour le résoudre. Jusqu'à ici pour cette fois.

Recommended Posts

Rendre pyautogui [super-approprié] compatible avec l'environnement multi-affichage Partie2
Rendre pyautogui [super-approprié] compatible avec l'environnement multi-affichage Partie 1
Rendre le serveur de contrôle PLEN compatible avec ViVi PLEN2
[Python] Rendons matplotlib compatible avec le japonais
Conversion de l'environnement Django en Docker (Docker + Django + Gunicorn + nginx) Partie 2
Conversion de l'environnement Django en Docker (Docker + Django + Gunicorn + nginx) Partie 3
Comment faire un jeu de tir avec toio (partie 1)