Pyautogui et accident de pyscreeze avec windll.user32.ReleaseDC échoué

voix
0

Je suis en train de comparer certaines valeurs de pixels dans mon script pyautogui, mais il se bloque avec message d'erreur après soit plusieurs pistes avec succès, ou parfois tout droit sur le premier appel:

Traceback (most recent call last):
  File F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py, line 219, in <module>
    battle = observeBattle()
  File F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py, line 180, in observeBattle
    statii = getHeroBattlePixels()
  File F:\Koodit\Python\HeroWars NNet\Assets\autodataGet.py, line 32, in getHeroBattlePixels
    colormatch = pyautogui.pixelMatchesColor(location[0], location[1], alive, tolerance=5)
  File E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py, line 557, in pixelMatchesColor
    pix = pixel(x, y)
  File E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py, line 582, in pixel
    return (r, g, b)
  File E:\Program Files\Python\lib\contextlib.py, line 120, in __exit__
    next(self.gen)
  File E:\Program Files\Python\lib\site-packages\pyscreeze\__init__.py, line 111, in __win32_openDC
    raise WindowsError(windll.user32.ReleaseDC failed : return 0)
OSError: windll.user32.ReleaseDC failed : return 0

Mon code (ce qui est appelé plusieurs fois, parfois il se bloque sur la première course, parfois il fonctionne bien pour environ 100 appels avant d'échouer, aussi, mon écran est de 4 Ko, de sorte que les résolutions deviennent grands):

def getSomePixelStatuses():
    someLocations= [
                        [1200, 990],
                        [1300, 990],
                        [1400, 990],
                        [1500, 990],
                        [1602, 990],
                        [1768, 990],
                        [1868, 990],
                        [1968, 990],
                        [2068, 990],
                        [2169, 990]
                        ]
    status = []
    someValue= (92, 13, 12)
    for location in someLocations:
        colormatch = pyautogui.pixelMatchesColor(location[0], location[1], someValue, tolerance=5)
        status.append(colormatch)
    return status

Je ne sais pas comment atténuer ce problème. Il semblerait que pyautogui utilisations pyscreeze de lire les valeurs de pixels à l'écran, et le plus probable candidat à l'endroit où se produit l'erreur est la fonction de pixel pyscreeze:

def pixel(x, y):
    
    TODO
    
    if sys.platform == 'win32':
        # On Windows, calling GetDC() and GetPixel() is twice as fast as using our screenshot() function.
        with __win32_openDC(0) as hdc: # handle will be released automatically
            color = windll.gdi32.GetPixel(hdc, x, y)
            if color < 0:
                raise WindowsError(windll.gdi32.GetPixel failed : return {}.format(color))
            # color is in the format 0xbbggrr https://msdn.microsoft.com/en-us/library/windows/desktop/dd183449(v=vs.85).aspx
            bbggrr = {:0>6x}.format(color) # bbggrr => 'bbggrr' (hex)
            b, g, r = (int(bbggrr[i:i+2], 16) for i in range(0, 6, 2))
            return (r, g, b)
    else:
        # Need to select only the first three values of the color in
        # case the returned pixel has an alpha channel
        return RGB(*(screenshot().getpixel((x, y))[:3]))

J'ai installé ces bibliothèques plus tard qu'hier, et je suis en cours d'exécution python 3.8 sur Windows 10 et pyscreeze est une version 0.1.25 donc dans tout ce que la théorie devrait être à jour, mais en quelque sorte se termine quelque chose se briser. Est-il un moyen d'atténuer ce risque, la modification soit mon code, ou même la bibliothèque elle-même, ou est mon environnement ne convient pas à cette opération?

Créé 02/12/2019 à 23:54
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Eh bien, je sais que ce n'est pas particulièrement utile; mais pour moi, cette erreur a été résolu simplement en exécutant mon code sur 3,7 au lieu de 3,8. Il ne devrait pas y avoir de changements que vous avez à faire à votre code, mais (à moins que vous utilisiez morses!)

Sous Windows, cela peut être fait avec le -3.7drapeau de ligne de commande, tant que 3.7 est installé

Créé 05/01/2020 à 03:05
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more